树莓派网关代理
参考文章树莓派二代 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/networking
中 start>
中,如
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 即完成所有配置。
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
博文值得拜读。受益了!
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
研究研究,学习学习。
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,修改内容如下:
树莓派重启后是会失效的。不知道你怎么解决的。
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 中配置。
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 端口的转发?
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
默认的无效设置。
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
博主您好,请问下,怎么让路由器和树莓派在同一个网段呢?交换机?
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 就可以了。