树莓派使用shadowsocks-libev做透明代理 作者: 毕世平 时间: 2020-09-23 分类: 默认分类 前言:一直在寻找`合适的dns处理方案`,这两天网上搜到了`overture`的介绍,使用了一下,还行,推荐一下。 本文主要介绍`shadowsocks-libev`和`simple-obfs`的编译安装,`overture`的配置使用,`ipset和iptables`的搭配使用。 # 一、安装配置ss和obfs插件 ## 1.1 安装ss 以`root`用户登录树莓派,这里假定你的树莓派在局域网被分配的IP地址是`192.168.1.2`,假定你的Windows电脑被分配的IP地址是`192.168.1.3`,电脑端使用了`Shadowsocks`软件,且设置开启了允许其他设备接入(局域网开放http和socks5代理),那么下面开始编译安装`shadowsocks-libev`吧。 #临时设置http代理(非必须),如要设置,请根据实际情况替换 export http_proxy=http://192.168.1.3:1080 apt update && apt -y install git vim gettext build-essential autoconf libtool libpcre3-dev libev-dev libc-ares-dev automake libmbedtls-dev libsodium-dev cd /root git clone https://github.com/shadowsocks/shadowsocks-libev.git cd shadowsocks-libev git submodule update --init --recursive ./autogen.sh ./configure --disable-documentation make && make install **说明**:在编译安装完成之后,系统会在`/usr/local/bin`目录下对应生成ss相关软件的二进制,本文我们需要用到`ss-local`和`ss-redir`。 ## 1.2 安装obfs插件 cd /root apt install -y libssl-dev git clone https://github.com/shadowsocks/simple-obfs.git cd simple-obfs git submodule update --init --recursive ./autogen.sh ./configure --disable-documentation make && make install **说明**:可以看出,`ss-libev`和`simple-obfs`插件的安装几乎一样,同样的,在编译安装结束后,系统会在`/usr/local/bin`存放`obfs-local`和`obfs-server`的二进制文件。 ## 1.3 配置文件 这里将配置文件存放在`/etc/shadowsocks-libev`目录下,请按照下面命令操作: mkdir /etc/shadowsocks-libev && cd /etc/shadowsocks-libev vim local_config.json #下面是配置文件示例,作为ss-local的配置文件 { "server":"1.2.3.4", //这里是你的ss节点IP "server_port":1234, //这里是你的ss节点端口 "local_address":"0.0.0.0", "local_port":1080, //这是设定开放的socks5代理端口 "method":"aes-256-gcm", "password":"password0", "timeout":300, "fast_open":false, "mode":"tcp_and_udp", "plugin":"obfs-local", "plugin_opts":"obfs=http;obfs-host=cn.bing.com" } #上面是ss-local的配置文件示例 vim redir_config.json #下面是ss-redir配置文件示例 { "server":"1.2.3.4", //这里是你的ss节点IP "server_port":1234, //这里是你的ss节点端口 "local_address":"0.0.0.0", "local_port":1081, //这是设定开放的redir端口 "method":"aes-256-gcm", "password":"password0", "timeout":300, "fast_open":false, "mode":"tcp_and_udp", "plugin":"obfs-local", "plugin_opts":"obfs=http;obfs-host=cn.bing.com" } #上面是ss-redir配置文件示例 ## 1.4 服务文件配置 cd /etc/systemd/system vim ss-local.service #下面是服务文件范例,复制粘贴即可 [Unit] Description=Shadowsocks-libev After=network.target [Service] Type=simple User=nobody ExecStart=/usr/local/bin/ss-local -c /etc/shadowsocks-libev/local_config.json [Install] WantedBy=multi-user.target #上面是服务文件范例,复制粘贴即可 vim ss-redir.service #下面是服务文件范例,复制粘贴即可 [Unit] Description=Shadowsocks-libev After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/ss-redir -c /etc/shadowsocks-libev/redir_config.json [Install] WantedBy=multi-user.target #上面是服务文件范例,复制粘贴即可 上面两个文件创建完成以后,执行下面命令: systemctl daemon-reload #针对ss-local systemctl start ss-local systemctl status ss-local systemctl enable ss-local //加入开机自启 #针对ss-redir systemctl start ss-redir systemctl status ss-redir systemctl enable ss-redir //加入开机自启 # 二、配置转发规则 ## 2.1 开启树莓派转发功能 echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf sysctl -p iptables -t filter -P FORWARD ACCEPT ## 2.2 配置ipset apt -y install ipset //安装ipset ipset create node_ip hash:ip //创建node_ip集,存放你的节点IP ipset add node_ip 1.2.3.4 //这里假定你的节点IP是1.2.3.4 ipset list node_ip //这里可以查看node_ip的所有信息 创建ipset集合的好处是:当集合被iptables规则引用后,ipset的集合内容是可以变化的,它对于iptables规则是实时生效的,另外`ipset test list_name 1.2.3.4`可以快速检测`1.2.3.4`是否在`list_name`集合中,这提高了iptables规则的效率,也减少了无用功。 ## 2.3 配置cn集合 # 下面操作建议在国外VPS上操作,然后下载文件到本地 ipset create cn hash:net # 下载分配给国内运营商的 IP 段 curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | \ grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt # 把ip加到cn集合里 cat chnroute.txt | sudo xargs -I ip ipset add cn ip # 把集合保存为文件 ipset save cn > cn.list # 把上面保存的文件下载回来,放到树莓派里 ipset restore < cn.list ## 2.4 配置转发规则 针对`tcp`流量,在`nat`表上配置: # 创建新链 iptables -t nat -N SHADOWSOCKS # 目标地址是node_ip集合里的元素的话,则跳出此链 iptables -t nat -A SHADOWSOCKS -m set --match-set node_ip dst -j RETURN # 目标地址是内网IP(比如家庭局域网网段是192.168.0.0/16)话,则跳出此链 iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN # 目标地址是cn集合里的元素的话,则跳出此链 iptables -t nat -A SHADOWSOCKS -m set --match-set cn dst -j RETURN # 匹配tcp流量 iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081 # 引用此新链 iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKS 针对`udp`流量,在`mangle`表上配置: # 配置策略路由 ip route add local default dev lo table 100 ip rule add fwmark 1 lookup 100 # 创建新链 iptables -t mangle -N SHADOWSOCKS # 目的地址是node_ip,内网IP,cn里的元素的话,跳出此链 iptables -t mangle -A SHADOWSOCKS -m set --match-set node_ip dst -j RETURN iptables -t mangle -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN iptables -t mangle -A SHADOWSOCKS -m set --match-set cn dst -j RETURN # 匹配udp流量 iptables -t mangle -A SHADOWSOCKS -p udp -j TPROXY --on-port 1081 --tproxy-mark 0x01/0x01 # 应用此链 iptables -t mangle -A PREROUTING -p udp -j SHADOWSOCKS ## 2.5 配置ipset和iptables规则开机自动恢复 `ipset`和`iptables`规则在机器重启后会自动失效,所以有必要设置规则重启后自动恢复,减少麻烦。 # 创建文件夹,并保存(修改好的)规则 mkdir /etc/iptables iptables-save > /etc/iptables/iptables_rules.ipv4 或者 iptables-save -f /etc/iptables/iptables_rules.ipv4 ipset save > /etc/iptables/ipset_rules.ipv4 或者 ipset save -file /etc/iptables/ipset_rules.ipv4 # 切换目录,创建开机恢复规则文件 cd /etc/systemd/system && vim tproxy.service # 下面是内容示例 [Unit] Description=Tpoxy Service After=network.target Wants=network.target [Service] Type=oneshot ExecStart=/sbin/ip route add local default dev lo table 100 ; /sbin/ip rule add fwmark 1 lookup 100 ; /sbin/ipset restore -file /etc/iptables/ipset_rules.ipv4 ; /usr/sbin/iptables-restore /etc/iptables/iptables_rules.ipv4 [Install] WantedBy=multi-user.target # 上面是内容示例 # 设置开机自启 systemctl enable tproxy # 三、配置dns服务器 ## 3.1 安装overture `overture`项目的Release地址是:[点我打开](https://github.com/shawn1m/overture/releases "点我打开")。 mkdir /etc/overture && cd /etc/overture wget https://github.com/shawn1m/overture/releases/download/v1.6.1/overture-linux-arm.zip unzip overture-linux-arm.zip //解压 mv overture-linux-arm overture //改名 rm overture-linux-arm.zip //可选删除 ## 3.2 下载两份名单 # 下面操作推荐在国外VPS上操作,然后把得到的文件拖回本地 # IPNetworkFile Primary ,一行一个CIDR,这里使用IPIP维护的国内IP地址集合 wget https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt # 改名 mv china_ip_list.txt ip_china # DomainFile Alternative ,一行一个域名,指定由次DNS来负责解析,这里可以使用gfwlist curl https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt | base64 -d | sort -u | sed '/^$\|@@/d'| sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/##; s#https:\/\/##;' | sed '/\*/d; /apple\.com/d; /sina\.cn/d; /sina\.com\.cn/d; /baidu\.com/d; /qq\.com/d' | sed '/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' | grep '^[0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u > /tmp/temp_gfwlist.txt curl https://raw.githubusercontent.com/hq450/fancyss/master/rules/gfwlist.conf | sed 's/ipset=\/\.//g; s/\/gfwlist//g; /^server/d' > /tmp/temp_koolshare.txt cat /tmp/temp_gfwlist.txt /tmp/temp_koolshare.txt | sort -u > gfw_all_domain.txt mv gfw_all_domain.txt domain_gfw # 上面两个得到的文件ip_china和domain_gfw拖回本地,放到/etc/overture文件夹下 ## 3.3 修改配置文件 { "BindAddress": ":53", "DebugHTTPAddress": "127.0.0.1:5555", "PrimaryDNS": [ //主dns:一般使用国内DNS { "Name": "Domestic_DNS", "Address": "114.114.114.114:53", "Protocol": "udp", "SOCKS5Address": "", "Timeout": 6, "EDNSClientSubnet": { "Policy": "disable", "ExternalIP": "", "NoCookie": true } } ], "AlternativeDNS": [ //次dns:一般使用国外DNS { "Name": "Google_DNS", "Address": "8.8.8.8:53", "Protocol": "tcp", "SOCKS5Address": "127.0.0.1:1080", //设置由ss-local提供的本地socks5代理 "Timeout": 6, "EDNSClientSubnet": { "Policy": "disable", "ExternalIP": "", "NoCookie": true } } ], "OnlyPrimaryDNS": false, "IPv6UseAlternativeDNS": false, "AlternativeDNSConcurrent": false, "PoolIdleTimeout": 15, "PoolMaxCapacity": 15, "WhenPrimaryDNSAnswerNoneUse": "PrimaryDNS", "IPNetworkFile": { "Primary": "/etc/overture/ip_china", "Alternative": "/etc/overture/ip_network_alternative_sample" }, "DomainFile": { "Primary": "/etc/overture/domain_primary_sample", "Alternative": "/etc/overture/domain_gfw", "Matcher": "full-map" }, "HostsFile": { "HostsFile": "/etc/overture/hosts_sample", "Finder": "full-map" }, "MinimumTTL": 0, "DomainTTLFile" : "/etc/overture/domain_ttl_sample", "CacheSize" : 0, "RejectQType": [255] } ## 3.4 配置其服务文件 cd /etc/systemd/system vim overture.service //下面是配置文件示例 [Unit] Description=Overture DNS Service After=network.target [Service] ExecStart=/etc/overture/overture -c /etc/overture/config.json -l /etc/overture/overture.log User=root Restart=on-abort LimitNOFILE=1048576 [Install] WantedBy=multi-user.target //上面是配置文件示例 systemctl daemon-reload systemctl start overture systemctl enable overture **说明**:`/etc/overture/config.json`作为配置文件,`/etc/overture/overture.log`作为运行输出的日志文件。 # 四、结语 本文借鉴了网上很多人给出的教程,也使用了很多牛人开发的项目,这里表示感谢,另本文尽可能的详细说明过程,如有错误欢迎留言。 **参考链接**: - [shadowsocks-libev项目地址](https://github.com/shadowsocks/shadowsocks-libev "shadowsocks-libev项目地址") - [simple-obfs项目地址](https://github.com/shadowsocks/simple-obfs "simple-obfs项目地址") - [Overture项目地址](https://github.com/shawn1m/overture "Overture项目地址") - [ipset持久化项目地址](https://github.com/freeyoung/netfilter-persistent-plugin-ipset "ipset持久化项目地址") - [[overture] 无污染的智能 DNS 折腾记](https://moe.best/tutorial/overture.html "[overture] 无污染的智能 DNS 折腾记") - [在树莓派上搭建全局透明代理网关](https://blog.newnius.com/setup-global-proxy-with-raspberry-pi.html "在树莓派上搭建全局透明代理网关") 标签: none