利用shadowsocks打造局域网翻墙透明网关

update: 这个方案我已经不再使用了,仅在此留作一个记录。目前我已改用软路由方案,用esxi作为虚拟机host,上面建ikuai和lede(openwrt),分别用来做流控和翻墙,感兴趣的童鞋可以参考https://www.vediotalk.com/?p=1055 这篇文章,有比较详细的过程。

另外,如果手上仍然有树莓派又希望能利用上的,我个人有个更好一些的想法,就是将树莓派刷上lede,然后将其作为透明网关,原理和本文下面所述其实是一样的,只不过用lede和shadowsocks插件来取代下面这些繁琐的linux命令行配置

利用shadowsocks科学上网有很长时间了,一开始是在每个手机电脑客户端上都装ss,后来希望能在全家免配置翻墙,于是在路由器上面刷了梅林。不过毕竟支持刷固件的路由器有限,要是哪一天想换支持mesh的路由器就头疼了,于是想到了自建透明网关,这样无论用什么路由器只要能允许手动设置内网网关和DNS服务器那么无需依赖梅林固件也可达到局域网内所有设备自动科学上网的目的

大体思路是:

  1. dnsmasq+China DNS+ss-tunnel解决DNS污染的问题
  2. ss-redir配合iptables和ipset来分流国内流量和国外流量,这样国内的网站直连,而国外网站则走ss-redir

顺便提一下网关,网关其实含义非常丰富,在本文中所谓网关,可以是树莓派,可以是家庭服务器中的一个虚拟机,也可以是一台独立的PC,由于网关即为路由中的下一跳,所以局域网内所有的数据都会首先被发送到这台网关上,由它再来判断是直接发给目标地址,还是走ss。

如下分别是透明网关的物理结构图和数据流逻辑图

网关方案解析:

  1. dnsmasq主要起到DNS缓存作用,DNS请求会被发送给ChinaDNS,ChinaDNS会将请求同时发送给国内的DNS服务器和ss-tunnel,ss-tunnel负责relay给ss服务器,由于ss在国外不会被GFW污染,因此ChinaDNS会得到两个回复并判断其结果是否被污染,最终dnsmasq将得到未被污染的DNS应答
  2. iptables配合ipset负责区分国内和国外流量

网关硬件:

如前所述,可以是树莓派,可以是家庭服务器中的一个虚拟机,也可以是一台独立的PC

网关软件:

Ubuntu 14.04 (如果是树莓派可以是 Raspbian)

安装配置dnsmasq

  1. 安装dnsmasq

2. 修改配置文件 /etc/dnsmasq.conf

3. 启动dnsmasq

安装配置ChinaDNS

参考ChinaDNS的官方文档

  1. 下载ChinaDNS, 链接
  2. 编译

3. 编译后,将会在src目录里生成可执行文件chinadns,将其拷贝至 /usr/local/bin里面

4. 在/etc/init.d/下创建名为chinadns的文件,将如下代码复制进去,记得执行sudo chmod +x /etc/init.d/chinadns 以使其可执行

5. 启动/重启/停止 chinadns

安装配置shadowsocks-libev(含有ss-redir以及ss-tunnel)

  1. 详细过程参见官方文档
  2. 如果是Ubuntu 14.04, 执行如下代码

3. 配置/etc/shadowsocks-libev/config.json, 注意,111.111.111.111自己请替换为自己的VPS Server地址,密码“password”请自行修改

4. 启动ss-tunnel 与ss-redir,注意替换VPS IP和ss的密码password

开启转发

  1. 修改 /etc/sysctl.conf, 取消注释:

2. 执行命令使其生效

配置iptables和ipset

  1. 生成国内IP地址的ipset

2. 配置iptables

设置网关的默认网关

透明网关需要设置默认的下一跳地址,也就是说,网关在决定了数据包的路由之后应该把数据包送到哪里去,在我们的家庭局域网环境中这个下一跳就是路由器的地址

请留意,192.168.2.1应该是路由器的地址,有的是192.168.0.1,有的是192.168.1.1,需要查看具体的设置

p2p1是网卡,有时候可能是eth0,请自行通过ifconfig 查看自己的网卡代号

设置路由器的DNS和DHCP网关

  1. 假设透明网关的IP地址是192.168.2.2,那么将路由器的DNS也设为192.168.2.2
  2. 在路由器的DHCP子项下面将路由器的内网网关设为192.168.2.2

参考文章

  1. https://junnan.org/2017/05/transparent-proxy-server-using-raspberrypi.html
  2. https://yuln.com/thread-30-1-1.html
  3. https://icymind.com/learn-from-gfw/
  4. https://github.com/yqsy/linux_script

--

--

programmer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store