基于 redsocks 实现全局 TCP 流量代理

在 Arch Linux 上使用 Shadowsocks, redsocks, iptables, pcap-dnsproxy 搭建一个舒适的科学上网环境~

对于我来说, 系统安装好之后的第一件事就是翻墙. 我们使用 shadowsocks + redsocks + iptables + pcap-dnsproxy 来实现全局自动代理.

yaourt -S shadowsocks redsocks-git pcap-dnsproxy-git

以上命令同时安装了三个软件. iptables 已经自带不需要安装.

接着到 /etc/shadowsocks 文件夹下创建一个新的配置文件, 配置你的 shadowsocks. 然后

sudo systemctl start shadowsocks@配置文件名
sudo systemctl enable shadowsocks@配置文件名

然后我们配置 redsocks. redsocks 的作用是把全部的 TCP 流量转发到 shadowsocks 上面去, iptables 的话则是拦截这一层, 我们可以在 iptables 配置说如果访问的是中国 ip 则不流向 shadowsocks. 我对 redsocks 了解并不多, 这里只说下我是如何配置的.

redsocks 的配置文件在 /etc/redsocks.conf , 编辑它, 把 redudp 和 dnstc 全部注释掉. redsocks 配置除去注释其实只有这五行:

redsocks {
  local_ip = 127.0.0.1;
  local_port = 31338; # redsocks 运行端口
  ip = 127.0.0.1;
  port = 1080;  # shadowsocks 端口
  type = socks5;
}

根据你的情况需要修改的修改.

接着修改 /etc/iptables/redsocks.rules 文件, 然后把你的 shadowsocks 服务器 IP 地址以及中国 IP 地址加进来, 格式如下:

-A REDSOCKS -d your_ip -j RETURN

国内 IP 列表可以从 apnic 获取得到, 你也可以看我整理的: china.rules

然后, 运行以下命令开启

sudo touch /etc/iptables/iptables.rules # 如果没有这个文件就创建它
sudo systemctl start  redsocks.service iptables.service
sudo systemctl enable  redsocks.service iptables.service
sudo iptables-restore < /etc/iptables/redsocks.rules # 导入规则

然后配置 pcap-dnsproxy. 以上虽然把发往国外的 TCP 流量发到自己的 shadowsocks 服务器上面处理, 这是一种突破 GFW 的方式, 但是这不能避免 DNS 污染的问题, 所以接下来我们配置的 pcap-dnsproxy 来解决.

Arch Linux 安装 pcap-dnsproxy 之后其实我们并不需要做什么, 直接启动就可以用了. 但是要知道的是 pcap-dnsproxy 提供了非常丰富的配置, 你可以自定义, 比如默认 pcap-dnsproxy 是没有局域网解析的, 可以编辑 /etc/pcap-dnsproxy/Config.conf 把 Listen['Operation Mode'] 改为 Server. 如果你需要自定义 Host 的话就修改 /etc/pacp-dnsproxy/Hosts.conf 文件.

直接启动 pcap-dnsproxy

sudo systemctl start pcap-dnsproxy
sudo systemctl enable pcap-dnsproxy

然后编辑 /etc/resolv.conf 文件, 确保首行的 nameserver 为 127.0.0.1. 然后运行

yaourt -S dnsutils # 为了使用 dig 命令
dig www.google.com

如果结果是类似以下形式, 表示 pcap-dnsproxy 已经正常运行.

2017-05-13 15-21-44 的屏幕截图.png

只要看下域名是否被大小写混淆过即可. 如果没有的话可以运行 systemctl status pcap-dnsproxy 或者 journalctl -xe 查看错误日志.

如果还是不行, 可以把 /etc/iptables/redsocks.rules 下所有内容复制粘贴到 /etc/iptables/iptables.rules 下. 然后重启下 iptables.

如果你打开浏览器并且已经可以成功的访问 Google 或者 Y2B, 再访问 ip.cn 这个网站查看当前显示的 IP 是否为你国内的 IP. 如果不是那你的中国 IP 过滤设置还有问题.