ss-redir+dnsmasq+iptables 透明代理

树莓派搭建Shadowsocks及网络流量转发指南

所需环境

  • 树莓派一个
  • 路由器
  • 境外VPS及Shadowsocks-libev环境

原理

数据发起 -> 路由器 -> DNS(树莓派) -> iptables局域网放行 -> dnsmasq查询真实并缓存 -> 局域网iptables放行 -> 路由器 -> 网关(树莓派) -> iptables过滤国内直接放行,国外数据打包SOCKS5走本地1080端口外出。

A. 安装Shadowsocks

git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev

安装编译环境:

sudo apt-get install build-essential autoconf libtool libssl-dev gawk debhelper dh-systemd init-system-helpers pkg-config

注意:树莓派上可能无法安装dh-systemd,此时可以直接编译安装:

./configure --prefix=/usr/local/shadowsocks
make && make install
ln -s /usr/local/shadowsocks/bin/ss-redir ss-redir

生成deb包:

dpkg-buildpackage -us -uc -i

安装刚生成的deb包(github主页有介绍,这里是debian安装过程):
编译好的deb及其他配置文件

sudo dpkg -i shadowsocks-libev*.deb

使用ss-redir

ss-redir -c /etc/redir.json

其中,/etc/redir.json的配置如下(local_address必须写0.0.0.0127.0.0.1会出问题):

{  
    "server": "服务器地址",  
    "server_port": 服务器开放的端口,  
    "local_address": "0.0.0.0",  
    "local_port": 本地端口,  
    "password": "密码",  
    "timeout": 600,  
    "method": "aes-256-cfb",  
    "fast_open": false  
}

B. iptables及转发

编辑/etc/sysctl.conf

#vim /etc/sysctl.conf

net.ipv4.ip_forward=1

开启数据转发:

#sysctl -p


编写两个脚本,一个用于启动iptables,一个用于停止(清理)iptables。

启动脚本(iptables.sh)

#!/bin/bash  
# Create new chain  
iptables -t nat -N SHADOWSOCKS  
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS  
# Ignore your shadowsocks server’s addresses  
iptables -t nat -A SHADOWSOCKS -d 服务器ip地址 -j RETURN  
# 去除内网地址及一些特殊地址段
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN  
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN  
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN  
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN  
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN  
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN  
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN  
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN  
# 还可以加入国内IP段,参见https://gist.github.com/wen-long/8644507  
# Anything else should be redirected to shadowsocks’s local port  
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080

清理脚本(flash.sh)

#!/bin/bash  
iptables -F  
iptables -X  
iptables -t nat -F  
iptables -t nat -X  
iptables -t mangle -F  
iptables -t mangle -X  
iptables -P INPUT ACCEPT  
iptables -P OUTPUT ACCEPT  
iptables -P FORWARD ACCEPT

C. dnsmasq

安装dnsmasq:

apt-get install network-manager dnsmasq

启用本地DNS:

如果使用NetworkManager,需要这样设置以启用dnsmasq:

编辑/etc/NetworkManager/NetworkManager.conf

[main]
dns=dnsmasq

如果没有,则修改默认的DNS配置文件/etc/resolv.conf

nameserver 127.0.0.1

创建/etc/resolv.dnsmasq并编辑:

nameserver 8.8.8.8  
nameserver 8.8.4.4

编辑/etc/dnsmasq.conf,在最后加入:

conf-dir=/etc/dnsmasq.d/,*.conf  
listen-address=127.0.0.1,192.168.1.104  
bind-interfaces  
cache-size=100000  
domain-needed  
resolv-file=/etc/resolv.dnsmasq

其中,cache-size=100000表示缓存10000条记录,resolv-file=/etc/resolv.dnsmasq指定上游DNS地址,listen-address=127.0.0.1,192.168.1.104为局域网及本机提供DNS服务。

创建/etc/dnsmasq.d/t.conf,指定特定域名通过特定DNS服务器查询:

# Google and Youtube  
server=/.google.com/208.67.222.222#5353  
server=/.google.com.hk/208.67.222.222#5353  
# ... (其他配置省略)

设置开机启动dnsmasq:

systemctl enable dnsmasq
systemctl start dnsmasq

查看dnsmasq是否启动正常:

journalctl -u dnsmasq

D. 使用

确保树莓派设置静态IP:

auto eth0  
allow-hotplug eth0  
iface eth0 inet static  
address 192.168.1.104  
netmask 255.255.255.0  
gateway 192.168.1.1

在路由器中修改DHCP的DNS为192.168.1.104,网关也设置为192.168.1.104

启动服务:

systemctl enable dnsmasq
systemctl start dnsmasq
ss-redir -c /etc/redir.json
./iptables.sh

至此,树莓派上的Shadowsocks及网络流量转发配置完成。

上一篇
下一篇