虽然有使用ASUS AC68U刷merlin这样更成熟的方案,但手里有个树莓派3代闲置,而且不想在路由器上装额外的东西,所以Google了一下,结合shadowsocks和dnsmasq把树莓派做成了局域网里的透明代理。

环境

  • raspberry pi 3 model b
  • raspbian 8
  • shadowsocks 3.0.6
  • 树莓派局域网IP: 192.168.1.2

准备

安装依赖:

apt-get update
apt-get install --no-install-recommends build-essential \
  autoconf libtool libssl-dev gawk debhelper dh-systemd \
  init-system-helpers pkg-config asciidoc xmlto apg libpcre3-dev

这里使用shadowsocks一键安装脚本来编译安装,脚本会检测系统是哪个发行版,所以这里需要修改系统名称。 将 /etc/issue 中的 Raspbian 改为 Debian,让脚本将系统认为是Debian/Ubuntu系统,安装完成后再改回来。

安装

下载安装脚本并安装,安装过程中的设置可以随便,最后统一修改配置

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian.sh
chmod +x shadowsocks-libev-debian.sh
./shadowsocks-libev-debian.sh

配置iptables规则及透明代理服务

修改 /etc/shadowsocks-libev/config.json 配置,设置远端服务器的IP、服务器端口、本地端口、密码及加密方式等信息。

{
    "server":"server ip",
    "server_port":443,
    "local_address":"192.168.1.2",
    "local_port":1080,
    "password":"password",
    "timeout":600,
    "method":"aes-256-cfb"
}

配置生成iptables转发规则,并忽略国内IP,将以下代码存为脚本,如: pirules.sh

这里的国内IP使用的是ipip.net提供的列表,写入文件后需要修改服务器端口和IP。

#!/bin/bash

# Generate routes file of China
# IP List: https://github.com/17mon/china_ip_list

set -e

FILE=${BASH_SOURCE[0]}
pushd `dirname $FILE` > /dev/null
SCRIPT_PATH=`pwd -P`
popd > /dev/null
SCRIPT_FILE=`basename $FILE`


CHINA_IPS_FILE=china_ip_list.txt
echo '' > $CHINA_IPS_FILE
echo -e "Downloading Chinese IP Segments file '${CHINA_IPS_FILE}'"
curl -L https://raw.githubusercontent.com/17mon/china_ip_list/master/${CHINA_IPS_FILE} -o ${SCRIPT_PATH}/${CHINA_IPS_FILE}

# custom ip
# music.163.com
echo -e "\n101.66.0.0/13" >> ${CHINA_IPS_FILE}

UP_ROUTE_FILE=up.sh

echo '' > ${UP_ROUTE_FILE}

echo "iptables -t nat -N SHADOWSOCKS" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -p tcp --dport 53 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -p tcp --dport 服务器端口 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 服务器ip -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN" >> ${UP_ROUTE_FILE}

while read IP_SEGMENT; do
      echo "iptables -t nat -A SHADOWSOCKS -d ${IP_SEGMENT} -j RETURN" >> ${UP_ROUTE_FILE}
done < ${SCRIPT_PATH}/${CHINA_IPS_FILE}

echo "iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080" >> ${UP_ROUTE_FILE}
echo "iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKS" >> ${UP_ROUTE_FILE}

chmod +x ${UP_ROUTE_FILE}

echo -e "Generated  ${UP_ROUTE_FILE}"

设置脚本执行权限,并执行,生成 up.sh iptables规则脚本:

chmod +x pirules.sh
./pirules.sh

执行 up.sh 导入规则,可能需要几分钟时间:

./up.sh

编辑 /etc/sysctl.conf,解除 net.ipv4.ip_forward = 1 的注释, 执行 sysctl -p 使修改立即生效。

保存iptable

iptables-save > /etc/iptables.conf

编辑 /etc/network/if-pre-up.d/iptables, 配置iptables,让其能在重启时自动动行并生效:

#!/bin/sh
iptables-restore < /etc/iptables.conf

执行:

chmod +x /etc/network/if-pre-up.d/iptables
bash /etc/network/if-pre-up.d/iptables

测试是否生效:

iptables-save

启用透明代理服务,可以将此命令存入 /etc/rc.local 文件,设置服务开机启动:

ss-redir -u -c /etc/shadowsocks-libev/config.json -f /var/run/ss-redir.pid

配置dnsmasq

使用dnsmasq对指定国内域名使用114dns解析,其他全部走google dns。

安装:

apt-get install dnsmasq

备份默认配置:

cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

将配置文件内容替换成如下内容:

no-resolv
no-poll
listen-address=192.168.1.2
server=8.8.8.8
server=8.8.4.4
server=/163.com/114.114.114.114
# 域名自己自定义添加

重启服务:

systemctl restart dnsmasq

测试

确认客户端连接到了局域网路由器的WIFI,将客户端的网关和DNS设置为树莓派IP 192.168.1.2,即可自由打开网站。

修改树莓派DNS

# 编辑文件设置dns服务器
vim /etc/resolv.conf
# 使设置生效
chattr +i /etc/resolv.conf

参考