New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

树莓派二代 dnsmasq ipset iptables shadowsocks 网关代理 #2

Open
alwaystest opened this Issue Sep 5, 2015 · 1 comment

Comments

Projects
None yet
1 participant
@alwaystest
Owner

alwaystest commented Sep 5, 2015

树莓派二代 dnsmasq ipset iptables shadowsocks 网关代理

标签(空格分隔): linux 树莓派 翻墙


  • 大部分操作需要sudo,不想打代码可以直接su,新手还是慢慢sudo吧。
  • 默认root账户是锁定的,需要先sudo passwd root 然后 sudo passwd -u root解锁root帐号然后操作。
  • dnsmasq 作用是dns解析,新版支持ipset,配合ipset将指定域名解析后的ip地址动态加载到ipset的list中,然后iptables根据ip匹配来转发TCP数据包到SS的代理端口,实现代理。
  • dnsmasq 2.66版本以上才支持ipset,dnsmasq -v 显示版本,下面有编译信息显示是否支持ipset,默认直接apt-get install dnsmasq安装的版本十分落后,于是到官网自己下载tar.gz,tar zxvf * cd make install
  • ipset的list重启后会清空,需要开机执行ipset -N ss iphash。iptables的规则也是重启后会清空,配置好规则后使用iptables-save > /etc/sysconfig/iptables 保存一次,每次开机后使用iptables-restore < /etc/sysconfig/iptables 恢复,注意这个命令运行最好在ipset之后,防止检测不到ipset的list导致失败。
  • shadowsocks使用shadowsocks-libev版本,一方面使用纯C语言编写,效率较高,另一方面py的那版没有ss-redir,而ss-local是提供socks5代理的,不能直接用。
  • 配置iptables,顺序最好不要乱,因为iptables会按顺序匹配。
Chain PREROUTING (policy ACCEPT 113 packets, 7121 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  601 37404 SHADOWSOCKS  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain INPUT (policy ACCEPT 133 packets, 8337 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 172 packets, 11193 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 204 packets, 13097 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain SHADOWSOCKS (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   41  2461 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt: <vps_port>
    0     0 RETURN     all  --  *      *       0.0.0.0/0            <vps_ip>      
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/8           //保留地址
    4   204 RETURN     all  --  *      *       0.0.0.0/0            10.0.0.0/8          //局域网地址
    0     0 RETURN     all  --  *      *       0.0.0.0/0            127.0.0.0/8         //回环地址
    0     0 RETURN     all  --  *      *       0.0.0.0/0            169.254.0.0/16      //保留地址
    0     0 RETURN     all  --  *      *       0.0.0.0/0            172.16.0.0/12       //本地局域网
    2   120 RETURN     all  --  *      *       0.0.0.0/0            192.168.0.0/16      //局域网地址
  131  7228 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set ss dst redir ports <local_proxy_port>  //检测目的地址匹配ipset里面的就转发到shadowsocks端口

命令example:

ipset -N ss iphash
iptables -t nat -N SHADOWSOCKS
iptables -t nat -A SHADOWSOCKS -d 127.0.0.1 -j RETURN  //按照這個,将不需要代理的ip添加进去
iptables -t nat  -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1080  //貌似有了ipset后就不用这个规则了,这条作用是将之前没有匹配上的所有TCP包全重定向到代理端口,有人把海外的IP全走代理
iptables -t nat -A PREROUTING -p tcp -m set --match-set ss dst -j REDIRECT --to-port 1080  // 將匹配ipset裏面ip地址的TCP包定向到代理端口
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS  //将进来的TCP包导入SHADOWSOCKS链,使上面的规则生效
  • vim /etc/sysctl.conf,设置net.ipv4.ip_forward=1,让更新实时生效: sysctl -p /etc/sysctl.conf
  • 编辑 /etc/dnsmasq.conf conf-dir=/etc/dnsmasq.d ==> enable last line 指定配置文件的位置 //my input software is not stable
    /etc/dnsmasq.d/ 下建立配置文件比如 light.conf
server=114.114.114.114  //指定dns服務器
server=/googleapis.com/208.67.222.222#5353 //指定域名解析使用的DNS及端口
ipset=/google.com/ss    //解析完這個域名,將其加入ipset的ss鏈,使其被iptables匹配
ipset list ss   //查看ss鏈的內容
ipset flush ss  //清空ss鏈的內容

  • 其他用到的命令:

netstat -tunlp|grep 53 //查看53端口佔用情況,判斷dnsmasq是否啓動成功

  • 開機啓動腳本(201515.7.9更新)
#!/bin/sh
ipset -N ss iphash
iptables-restore < /etc/sysconfig/iptables
/usr/local/sbin/dnsmasq
nohup /usr/local/bin/ss-redir -vc /home/pi/config.json 1 > /home/pi/ssredir.log 2>&1 &

开机启动可以自己写一个指定格式的脚本,放到/etc/init.d/ 下,执行update-rc.d就可以自动把开机启动加到对应的目录下,网上说手动软连接也可以实现开机启动,但是我上次软连接以后开机并没有自动启动,待测。

  • Note:
    • 只代理 TCP 连接,UDP、ICMP (ping) 等无法使用。
    • shadowsocks只是起到渾淆流量的作用,加密方式並不可靠,所以儘量不要做涉及隱私太多的事情,比如在線支付。
    • SS雖然使用rc4-md5加密算法比較快,但是相比aes-256並沒有快多少(壓力不大的時候),而且rc4-md5加密並不安全,儘量使用aes-256,雖然他也不是太安全。
    • 用一键安装shadowsocks脚本安装了以后有自动开机的脚本。libev的没有。
    • dnsmasq卸载以后没有删除掉可执行文件,再次手动编译安装了新版本的时候开机启动脚本执行的还是旧版的,所以出现了不支持ipset的问题,脚本中指定对位置就好。

參照

CentOS6.5 64bit如何安装DNS服务dnsmasq 作为翻墙利器
OpenWRT配合shadowsocks 最智能的全局代理
OpenWrt VPN 按域名路由
利用ipset进行选择性的翻墙
如何在Linux下大量屏蔽恶意IP地址(ipset)
智能翻墙: 树莓派 + shadowsocks

@alwaystest

This comment has been minimized.

Owner

alwaystest commented Jan 11, 2017

最近又折腾了刷路由器的办法,发现大家在使用pdnsd来做dns缓存,dnsmasq只做ipset添加和dns转发(纠正:使用pdnsd的原因主要是可以使用tcp协议进行dns查询,防止udp查询方式的投毒攻击,缓存部分和ipset添加依然是dnsmasq进行控制,当然pdnsd也可以配置缓存。所以现在的模式是dnsmasq监听53端口的dns查询,如果命中缓存,就直接返回结果,如果需要进行查询,则根据配置选择上级dns服务器,如果是在黑名单的域名,就转发给pdnsd,否则就使用正常的上级dns进行查询,这样会比较快一些)。因为之前我也遇到过,虽然dnsmasq设置了缓存的dns数量,但是经常会莫名其妙的丢失记录,导致经常性的需要把dns请求转发到VPS进行查询。

正常的网络的话,其实转发就转发了,大不了网络首次访问会慢一丢丢。但是遇上坑爹的小运营商就糟糕了,本来VPS的丢包率就高,如果dns缓存总是丢失的话,经常会出现dns请求超时的问题。

目前已经被我拉入黑名单的运营商有长城宽带和鹏博士宽带。预计其他小运营商也好不到哪去。

作为一名软件工程师,网络的投资还是不能省的。一个稳定的网络,带给我们的是丝滑的体验,而不是三天两头给客服打电话反映网络有问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment