树莓派网关代理

参考文章树莓派二代 dnsmasq ipset iptables shadowsocks 网关代理将gfwlist转换成带ipset的dnsmasq规则,适用于OpenWrt智能上网使用ipset让openwrt上的shadowsocks更智能的重定向流量的补充终于折腾好了。

先简单说下原理。一般来说,正常的上网是通过路由器拨号上网并充当网关进行 NAT 转发,实现本地局域网内多台设备同时上网。而问题在于,路由器一般功能有限无法提供更加智能的网关业务处理。除非路由器支持第三方固件升级,如 OpenWrt 或 DDWrt 等。实际上,除开路由器网关,可以使用其他电脑(比如树莓派)充当二级网关,来解决此问题。

原有的网络拓扑是路由器 IP 为 192.168.1.1,通过路由器上的 DHCP 指定网关为 192.168.1.1,主 DNS 服务器为 119.29.29.29 备选 DNS 服务器为 114.114.114.114。

修改后的网络拓扑是路由器 IP 为 192.168.1.1,树莓派 IP 为 192.168.1.2,通过路由器上的 DHCP 指定网关为 192.168.1.2,主 DNS 服务器为 192.168.1.2 备选 DNS 服务器为 119.29.29.29。树莓派的网关为 192.168.1.1,手工指定主 DNS 服务器为 119.29.29.29 备选 DNS 服务器为 114.114.114.114。

所以第一步需要将树莓派设置为 iface eth0 inet static,执行 sudo nano /etc/network/interfaces,修改内容如下:

auto lo

iface lo inet loopback

auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        network 192.168.1.0
        gateway 192.168.1.1

然后,执行 sudo nano /etc/resolv.conf,修改内容如下:

nameserver 119.29.29.29
nameserver 114.114.114.114

下一步是打开 NAT 网关,执行 sudo nano /etc/sysctl.conf,修改指定行为:

net.ipv4.ip_forward=1

检查 sudo nano /etc/iptables.up.rules,如果有 8080 转发,请禁止

:POSTROUTING ACCEPT [0:0]
#-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8081
#-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
COMMIT

NAT 需要重启才能生效。这样,树莓派可以充当一个普通的网关代理,但没有 DNS 服务。此时可以将客户端网关修改为 192.168.1.2,DNS 服务器指定为 119.29.29.29 检查是否可以上网。

我们知道,通过域名访问任何一项网络服务,都先必须解析域名。现在要做的就是,树莓派使用 dnsmasq 提供局域网的 DNS 服务,使用特殊的规则解析指定的域名,并将解析到的 IP 加入 ipset 规则组,然后 iptables nat 使用 ipset 指定的规则组自动走 shadowsocks 的代理线路进行访问。从而达到我们的目的。

需要安装的包有:sudo apt-get install ipset dnsmasq shadowsocks-libev

我们并不需要 shadowsocks-libev 自带的 server 服务,执行 sudo update-rc.d shadowsocks-libev remove 禁止自动启动服务。

替代的是使用 ss-redir 连接 shadowsocks 代理服务器(通常会使用的是 ss-local 来开启 socks 代理,但 redir 会减少 socks 代理开销)。

手工建立 shadowsocks-redir 服务,执行:

sudo cp /etc/init.d/shadowsocks-libev /etc/init.d/shadowsocks-redir
sudo cp /etc/default/shadowsocks-libev /etc/default/shadowsocks-redir
sudo cp /etc/shadowsocks-libev/config.json.dpkg-old /etc/shadowsocks-libev/redir.json

需要 sudo nano /etc/init.d/shadowsocks-redir 将相关 shadowsocks-libev 改为 shadowsocks-redir,以及 ss-server 改为 ss-redir

# Provides:          shadowsocks-redir
DESC=shadowsocks-redir       # Introduce a short description here
NAME=shadowsocks-redir       # Introduce the short server's name here
DAEMON=/usr/bin/ss-redir     # Introduce the server's location here

sudo nano /etc/default/shadowsocks-redir 修改 CONFFILE

CONFFILE="/etc/shadowsocks-libev/redir.json"

sudo nano /etc/shadowsocks-libev/redir.json 配置 local_address 和端口,需要绑定 0.0.0.0 和 1080 端口(建议)

{
    "server":"example.com",
    "server_port":10307,
    "local_address":"0.0.0.0",
    "local_port":1080,
    "password":"password"
}

开启服务,并设置自动启动服务

sudo service shadowsocks-redir start 
sudo update-rc.d shadowsocks-redir defaults

可以使用 sudo netstat -nlp | grep redir 查看服务端口是否正常。

使用 sudo ipset -N ss iphash 创建新的 ipset 规则组,因为系统重启后 ipset 数据会丢失,建议将 ipset -N ss iphash 加入到 /etc/init.d/networkingstart> 中,如

case "$1" in
start)
        if init_is_upstart; then
                exit 1
        fi
        ipset -N ss iphash
        process_options
        check_ifstate

否则,修改 iptables 默认规则后,会导致 ss 规则找不到,从而无法启动网络。

修改 iptables nat 规则,sudo iptables -t nat -A PREROUTING -p tcp -m set --match-set ss dst -j REDIRECT --to-port 1080

因为 iptables 重启后规则失效,需要修改 sudo nano /etc/iptables.up.rules

:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m set --match-set ss dst -j REDIRECT --to-port 1080
COMMIT

下一步就是配置 dnsmasq,首先打开 sudo nano /etc/dnsmasq.conf,修改

# Include another lot of configuration options.
#conf-file=/etc/dnsmasq.more.conf
conf-dir=/etc/dnsmasq.d

然后创建一个 google 的规则 sudo nano /etc/dnsmasq.d/google.conf 内容为

server=/.googleapis.com/208.67.222.222#5353
ipset=/.googleapis.com/ss
server=/.google.com/208.67.222.222#5353
ipset=/.google.com/ss

使用 sudo service dnsmasq restart 重启服务,并将客户端的网关和 DNS 服务器都改为 192.168.1.2 即可以直接访问 google。

最后一步就是每天自动更新 gfwlist 规则为 dnsmasq 配置了。执行 sudo nano /etc/cron.daily/dnsmasq-gfwlist.py,内容为 https://gist.github.com/larryli/bf0671b41ede5d77c52862f57fff6159

所有测试没问题后,请将路由器 DHCP 服务器,将网关设置为 192.168.1.2,DNS 服务器为 192.168.1.2 即完成所有配置。

8 Responses to “树莓派网关代理”

  1. 增达信购说道:
    Sogou Explorer Windows 7
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.802.30 Safari/535.1 SE 2.X MetaSr 1.0

    博文值得拜读。受益了!

  2. zengda说道:
    Sogou Explorer Windows 7
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.802.30 Safari/535.1 SE 2.X MetaSr 1.0

    研究研究,学习学习。

  3. nainai说道:
    Google Chrome 53.0.2785.143 Windows 7 x64 Edition
    Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36

    你好,在这一步。执行 sudo nano /etc/resolv.conf,修改内容如下:

    树莓派重启后是会失效的。不知道你怎么解决的。

    • 南 靖男说道:
      Google Chrome 52.0.2743.116 Windows 10 x64 Edition
      Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36

      如果安装了 dnsmasq,dns 服务器请在 dnsmasq 中配置。

  4. zh说道:
    Google Chrome 59.0.3071.115 Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

    “检查 sudo nano /etc/iptables.up.rules,如果有 8080 转发,请禁止”

    为什么需要禁止 8080 端口的转发?

    • 南 靖男说道:
      Google Chrome 60.0.3112.90 Windows 10 x64 Edition
      Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36

      默认的无效设置。

  5. xlve说道:
    Google Chrome 72.0.3626.119 Mac OS X  10.14.3
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36

    博主您好,请问下,怎么让路由器和树莓派在同一个网段呢?交换机?

    • 南 靖男说道:
      Google Chrome 72.0.3626.119 Windows 10 x64 Edition
      Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36

      rpi 直接接在 router 的 LAN 就可以了。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据