Total Pageviews

Thursday, 7 April 2016

用树莓派打造无线中继科学上网路由器

请各位看官注意两个关键字:无线中继 科学上网。
为什么要做无线中继?因为两个场景:第一个是在我司,WIFI上网同一账户只能连接两个设备,现在两个设备哪里够?第二个场景是在宾馆,我希望就像在家里一样,所有设备都是连上路由器就可以免设置科学上网,这就需要对宾馆原来的WIFI进行处理。
为什么要随时科学上网?我只能说,为了知识和真相。
树莓派使用的系统:RASPBIAN JESSIE
另外,因为手头没有路由器,因此,本文介绍利用电脑直连树莓派进行相关设置。不多说,开始了。
1.设置IP
按照树莓派官方的做法,树莓派需要一根网线直连路由器,通过路由器的DHCP分配到IP后,就可以远程登录了。但是刚才已经提到,因为手头没有路由器,所以我们需要用电脑直连树莓派进行远程登录。将制作好的树莓派SD卡插入电脑,会弹出一个名为Boot的磁盘,其中有一个cmdline.txt文件,打开之后,在最后的位置追加一个IP如下:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ip=192.168.3.1  
插回SD卡至树莓派,通电后,将我们的电脑端IP设置为192.168.3.100,掩码设置为255.255.255.0即可连接树莓派了.
2.更改磁盘大小和LOCALE
树莓派默认并没有用足所有的SD卡,具体原因未知。但是也很好调整。运行sudo raspi-config,可以打开树莓派设置窗口:

第一项,就是将文件系统扩展到整个SD卡。顺便把第五项中的语言项也改了吧,否则在安装软件时,总会提示language没有设置,我一般会选择生成en_US.UTF-8以及zh_CN.UTF-8,默认语言使用赵家语言(选择时,使用空格键来切换选中/未选)。
3.更改WIFI国别.
为什么要更改WIFI国别?因为按照规范,各国的频谱不一样,详见这里,如果不更改,树莓派默认使用大英帝国,直接的影响就是,可能某些5G信道会搜索不到。
编辑/etc/wpa_supplicant/wpa_supplicant.conf,更改country为CN
4.安装第一块WIFI适配器
因为我司所在的WIFI环境支持5G信号,因此,在选择WIFI适配器时,我选择了TP-LINK TL-WDN3321,该设备插入即可使用,免驱动。
5.配置基于WPA-EAP的WIFI认证
我司使用了基于PEAP和MSCHAPV2的WPA-EAP的WIFI认证,但是没有使用证书。
配置时,只需要在/etc/wpa_supplicant/wpa_supplicant.conf增加如下段落即可.
network={  
    ssid="ssid"
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="id"
    password="password"
    #ca_cert="/etc/cert/ca.pem"
    #phase1="peaplabel=1"
    phase2="auth=MSCHAPV2"
    priority=10
}
更改其中的ssid identity和password为你所在环境的配置。
配置文件中可以有多个network配置,系统会根据搜索到的ssid来自动匹配.
6.连接WIFI
连接WIFI其实就是一个重新加载配置的过程,先执行sudo ifdown wlan0,再执行sudo ifup wlan0即可。之后,可以利用iwconfig命令查看wifi配置是否已经加载,用ifconfig来查看是否分配到IP,如果一切顺利,就应该能够上网了。
7.更改为中科大的源
树莓派的apt-get的源在英国,因此访问起来比较缓慢。感谢中国科学技术大学 Linux 用户协会做了镜像,编辑/etc/apt/source.list,删除其中的内容,使用以下内容代替:
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ jessie main non-free contrib  
之后运行sudo apt-get update来更新源。
8.固定接口名称
什么叫固定接口名称?当我们插入WIFI适配器时,尤其是我们的整个方案中,会使用两个WIFI适配器时,系统会随机分配哪个是wlan0,哪个是wlan1。因为两个适配器不一样,会导致运行在上面的配置可能没办法生效。因此,我们必须让系统记住WIFI适配器使用的接口名称。
编辑新增文件/etc/udev/rules.d/10-network.rules,其中的内容如下:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="wlan0"  
注意其中的mac地址,设置为你的设备的mac地址。获得mac地址,可以使用命令ip link。
重启系统后,再插入设备,就会绑定接口名称。
9.更改eth0的IP
前面的第一步中,我们使用了一个变相的手法分配了树莓派的IP。但是我发现在该模式一下有一个问题:如果不插网线,树莓派启动时会很长一段时间都在等待插入网线。
既然已经进入了系统,我们自然还原为标准的配置。编辑文件/etc/network/interfaces,将eth0的配置改为如下:
auto eth0  
iface eth0 inet static  
    address 192.168.3.1
    netmask 255.255.255.0
然后编辑/boot/cmdline.txt,去掉第一步中增加的IP配置。
10.安装dnsmasq来设置DHCP服务
先来说明一下我的网段设置,有线网络使用192.168.3这个网段,而无线AP端,使用192.168.4这个网段。
很多博文使用udhcpd来做作DHCP服务器,但是考虑到将来要科学上网,既然dnsmasq就可以做这个事,那就只用它好了。
使用命令sudo apt-get install dnsmasq,编辑/etc/dnsmasq.conf,注意更改如下几段:
#配置监听地址
listen-address=127.0.0.1,192.168.3.1,192.168.4.1  
#配置DHCP分配段
dhcp-range=192.168.3.50,192.168.3.150,12h  
dhcp-range=192.168.4.50,192.168.4.150,12h  
运行命令sudo service dnsmasq restart来启用。
11.开启包转发
Linux系统默认关闭了IP包转发,因此不能做路由器。所以需要先打开包转发。
编辑/etc/sysctl.conf,去掉以下属性前的注释:
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1  
运行sudo sysctl -p来启用。
之后运行:
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  
来启用wlan0端口的NAT。
12.安装iptables-persistent
上一步中,我们启用了一条防火墙规则,但是防火墙规则重启后就丢失了,为了能够规则开机自动加载,我们可以使用iptables-persistent。用命令sudo apt-get install iptables-persistent来安装该组件,根据其提示进行初次设置(一路确认)。该组件默认会将防火墙规则保存到/etc/iptables/rules.v4中。你可以使用如下命令保存和读入规则:
#保存现有规则
sudo service netfilter-persistent save  
#读取并应用先有规则
sudo service netfilter-persistent reload  
为什么服务名称变成了netfilter-persistent,这里面好像有故事,留待以后再digg。
13.安装第二块WIFI适配器
第一块WIFI适配器是为了连接现有网络,第二块则是为了建立WIFI热点。为了建立WIFI热点,适配器必须具有AP的mode。可以使用命令iw list|grep -A10 'Supported interface modes'查看。比如,我选用的设备是widemac SL-1506N,其参数如下:
Supported interface modes:  
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * WDS
         * monitor
         * mesh point
该设备依然是插入即可,不需要驱动。
14.设置第二块Adapter的IP
依然是编辑/etc/network/interfaces,更改wlan1的配置如下:
auto wlan1  
iface wlan1 inet static  
    address 192.168.4.1
        netmask 255.255.255.0
15.固定第二块WIFI适配器的接口名称
做法类似于第一块,只不过再加入一行而已,接口名称为wlan1,这里就不说了,记得重启让其生效。
16.安装并开启hostapd
Linux启用WIFI热点,使用的是hostapd。首先,用命令sudo apt-get install hostapd安装它,然后增加配置文件/etc/hostapd/hostapd.conf如下:
interface=wlan1  
driver=nl80211  
ssid=ssid  
hw_mode=g  
channel=13  
macaddr_acl=0  
auth_algs=1  
ignore_broadcast_ssid=0  
wpa=2  
wpa_passphrase=passwd  
wpa_key_mgmt=WPA-PSK  
wpa_pairwise=TKIP  
rsn_pairwise=CCMP  
只需要更改其中的ssid和wpa_passphrase属性。
之后运行命令sudo hostpad -d /etc/hostapd/hostapd.conf来观察测试,没有错误可以连接,就OK了。 CTRL+C后,编辑/etc/default/hostapd,改变DAEMON_CONF的配置如下:
DAEMON_CONF="/etc/hostapd/hostapd.conf"  
之后就可以使用sudo service hostapd start正式启动WIFI热点了。
至此,通常一个WIFI中继路由器就好了,以下介绍透明科学上网部分
17.建立无污染DNS
以前都需要使用chinadns等项目,现在基本上都直接使用中科大的DNS,直接无污染。在/etc/dnsmasq.conf,加入如下规则:
no-resolv 
server=202.38.93.153 
server=202.141.162.123
重启dnsmasq,可以用dig t.co测试一下。
18.安装shadowsocks
这里首先要说明一下,我找了很久,也没有找到适合树莓派的shadowsocks-libev,因此,我们使用了redsocks+shadowsocks的组合来替代。
树莓派源中的shadowsocks的版本很低,连rc4-md5都不支持。因此,我们使用pip安装,键入sudo pip install shadowsocks即可安装,之后新建配置文件/etc/shadowsocks.conf如下:
    "server":"xxx.xxx.xxx.xxx",
    "server_port":8964,
    "local_address":"0.0.0.0",
    "local_port":1080,
    "password":"password",
    "timeout":600,
    "method":"rc4-md5"
}
然后用命令sudo sslocal -c /etc/shadowsocks.conf -d start来启动。
没有问题,就将sslocal -c /etc/shadowsocks.conf -d start加入/etc/rc.local来让其开机启动

19.安装redsocks
执行sudo apt-get install redsocks来安装软件,之后编辑/etc/redsocks.conf,更改其中的redsocks部分如下:
redsocks {  
    local_ip = 0.0.0.0;
    local_port = 12345; 
    ip = 127.0.0.1;
    port = 1080;
}
使用命令sudo service redsocks start来启动软件。
可以使用netstat -an|grep 1080和netstat -an|grep 12345来确认一下shadowsocks和redsocks都启动了。
20.安装ipset并导入chnroute
我们科学翻墙的规则:凡是国外的网站都用shadowsocks加速。因此,我们借助于ipset保存国内ip段。先用sudo apt-get install ipset安装软件,
执行命令:
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段。
然后用如下命令导入到ipset:
sudo ipset create chnroute hash:net  
cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip  
21.备份ipset并开机载入
各位看官可能已经发现,导入ipset的过程非常缓慢,不适合每次开机都执行。我们可以将ipset的结果保存,每次开机导入。执行如下命令:
sudo ipset chnroute save > /etc/chnroute.ipset  
然后在/etc/rc.local中加入如下语句:
ipset restore < /etc/chnroute.ipset  
即可开机执行。
22.导入防火墙规则
sudo iptables -t nat -N SHADOWSOCKS
sudo iptables -t nat -A SHADOWSOCKS -d $server_IP -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS  
sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS  
其中server_IP是你的VPS的地址。
然后保存规则:
sudo service netfilter-persistent save  
23.开机重新生效防火墙规则
既然iptables-persistent可以开机加载防火墙规则,为什么还要谈这个?因为防火墙规则中,有使用到redsocks的端口12345,但是因为启动顺序问题,很可能redsocks还没有启动,防火墙规则先加载了,所以会导致防火墙规则加载失败。因此,我们需要把规则加载放入/etc/rc.local中:
iptables-restore < /etc/iptables/rules.v4

from https://story.tonylee.name/2016/03/31/yong-shu-mei-pai-da-zao-wu-xian-zhong-ji-ke-xue-shang-wang-lu-you-qi/
---------------
相关帖子:http://briteming.blogspot.com/2013/02/raspberry-pi_11.html
-----------------

树莓派做翻墙网关

科学上网与海外网络加速 解决方案,包括手掌大小的硬件设备,解决dns污染与访问不可见网站的软件,以及几十条高速国外与国内中转线路资源。适合小微型(百人以下)组织部署使用。

想做这个东西想了有好些日子了,一方面是懒,执行能力太差,另一方面是在纠结要不要自己写一个程序,昨天经过一天的折腾,终于搞定了,最后我终于没有自己写程序。
在网上搜了很多文章来看,很多都是把树莓派当WIFI AP来用的,但我这里不是。我的树莓派只有1个自带的eth网卡,我把它做成一个网关,让所有的设备在网络设置的网关一项都填树莓派的IP,基本实现其他设备无配置无缝自动翻墙。
其实过程非常简单。
首先,当然是要有能用的代理,无论是http proxy还是socks proxy,甚至只是一个shadowsocks server也行,现有的工具都能适配使用。
然后,用redsocks或ss-redir在树莓派上开端口,一定要监听在0.0.0.0上,我之前就是开在127.0.0.1上,然后纠结了大半天,一直是树莓派自己能翻过去,其他把它当网关的机器翻不出去。redsocks目前我看到有两个不同版本,一个原版,从2012年以来就很少更新了,可以将本地tcp流量封装到http connect/http relay/socks协议里,配合iptables等机制实现系统全局代理,另一个是国人修改版,在原版的基础上又增加了一些功能,比如后端协议还支持了shadowsocks(就跟ss-redir一样)和直连,以及auto proxy自动检测是否需要代理,还有自称修正了一些原版中的bug等等。但我昨天试用下来,发现这新增的功能很不稳定,基本经不起日常使用。我最后就直接用了ss-redir,这是shadowsocks-libev中的一个工具,功能与redsocks类似,但它只提供了shadowsocks的协议作为后端,不过胜在稳定,又不用多走一次socks5代理,所以估计效率也会好一点。
接着,把树莓派设置流量转发。打开/etc/sysctl.conf,设置net.ipv4.ip_forward=1,让更新实时生效: sysctl -p /etc/sysctl.conf。这样树莓派就已经可以做为网关使用了。还要把流量转发到ss-redir开的端口(我用58100)上去,Linux上用iptables:
iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 58100 -m state --state NEW,ESTABLISHED -j ACCEPT

# dnat
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -t nat -N SS
# 过滤私有地址,vps地址
iptables -t nat -A SS -d 127.0.0.1 -j RETURN
iptables -t nat -A SS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SS -d 172.16.0.0/21 -j RETURN
iptables -t nat -A SS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SS -d shadowsocks-server-ip -j RETURN

# 过滤中国ip地址,网上搜一下“中国ip段"
iptables -t nat -A SS -d 58.14.0.0/15 -j RETURN
iptables -t nat -A SS -d 58.16.0.0/13 -j RETURN
iptables -t nat -A SS -d 58.24.0.0/15 -j RETURN

# 所有其他的ip,都提交给shadowsocks
iptables -t nat -A SS -p tcp -j REDIRECT --to-port 58100

# 使用SS链,其他设备走PREROUTING链
iptables -t nat -A PREROUTING -p tcp -j SS
# 使用SS链,树莓派自己走OUTPUT链
iptables -t nat -A OUTPUT -p tcp -j SS

中间有一段中国IP地址的,有个叫chnroute的项目,简单的做法就只有一条命令:
curl http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | grep 'apnic|CN|ipv4' | awk -F\| '{ printf("iptables -t nat -A SS -d %s/%d -j RETURN\n", $4, 32-log($5)/log(2)) }' > cn_rules.conf
,再把文件cn_rules.conf的内容执行一下。
最后,把家里所有要翻墙的设备都在网关一项里填成树莓派的IP。比较方便的做法是,在DHCP那里就直接返回树莓派的IP当网关。比较郁闷的是我的Netgear R6300v2貌似没找到怎么在DHCP里设置自定义的网关地址。当然树莓派一定要用静态设置上级路由器的IP为网关。这样所有连入的设备就自动能翻墙了。
上面还有一点没提到的是DNS污染的问题,现在也有很多方案了,我的做法是在树莓派上建了个dnsmasq,上游走OpenDNS的5353端口,国内常用域名有个列表,走114DNS。
来源:https://blog.minidump.info/2015/09/raspberry-pi-as-a-fucking-gfw-gateway/
作者Twitter:https://twitter.com/missdeerme
----------------------
IPtable之socks

现在的iptables 针对redsocks2或其他 socks5 server的配合,在客户端是可以实现全透明的,在OPENWRT路由器上也是可行的。但是有些场景有问题,这和其做IPTABLES有关。
这一条是针对CLIENT的
iptables -t nat -N SOCKS
iptables -t nat -A SOCKS -d 1.1.1.1 -j RETURN
iptables -t nat -A SOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SOCKS -d 240.0.0.0/4 -j RETURN
iptables -t nat -A SOCKS -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A OUTPUT -p tcp -j SOCKS
      如果是在openwrt上实现透明代理的话,使用下面被注释了的规则
iptables -t nat -A PREROUTING -p tcp -j SOCKS
这样其实CLIENT已经全透明使用SOCKS上网了。
检验: 在终端使用 curl http://www.ip138.com/ips1388.asp
可以看到是代理的IP。
如需代理UDP需要加一个链条:
Advanced usage
The latest shadowsocks-libev has provided a redir mode. You can configure your linux based box or router to proxy all tcp traffic transparently.
# Create new chain
root@Wrt:~# iptables -t nat -N SHADOWSOCKS
root@Wrt:~# iptables -t mangle -N SHADOWSOCKS
# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN
# Ignore LANs and any other addresses you'd like to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
# See ashi009/bestroutetb for a highly optimized CHN route list.
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
# Anything else should be redirected to shadowsocks's local port
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
# Add any UDP rules
root@Wrt:~# ip rule add fwmark 0x01/0x01 table 100
root@Wrt:~# ip route add local 0.0.0.0/0 dev lo table 100
root@Wrt:~# iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
# Apply the rules
root@Wrt:~# iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
root@Wrt:~# iptables -t mangle -A PREROUTING -j SHADOWSOCKS
# Start the shadowsocks-redir
root@Wrt:~# ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid

from http://www.alexclouds.net/?p=1802
----------------

还是iptables的问题,怎么代理的问题
O ------------A --------B ---------------C
LAN-USER rsclient  ssserver     overseas-Www

root@redsocks2:~# more iptables-new.sh
#!/bin/sh
# proxy server IP
PROXY_SERVER="118.242.237.112"
# Interface connected to Internet
INTERNET="eth0"
# Interface connected to LAN
LAN_IN="eth1"
# proxy port
PROXY_PORT="12345"
# DO NOT MODIFY BELOW
# Clean old firewall
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Load IPTABLES modules for NAT and IP conntrack support
modprobe ip_conntrack
modprobe ip_conntrack_ftp
# For win xp ftp client
#modprobe ip_nat_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
# Setting default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
# Unlimited access to loop back
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow UDP, DNS and Passive FTP
iptables -A INPUT -i $INTERNET -m state --state ESTABLISHED,RELATED -j ACCEPT
# set this system as a router for Rest of LAN
iptables --table nat --append POSTROUTING --out-interface $INTERNET -j MASQUERADE
iptables --append FORWARD --in-interface $LAN_IN -j ACCEPT
# unlimited access to LAN
iptables -A INPUT -i $LAN_IN -j ACCEPT
iptables -A OUTPUT -o $LAN_IN -j ACCEPT
# DNAT port 80 request comming from LAN systems to proxy 3128 ($PROXY_PORT) aka transparent proxy
iptables -t nat -A PREROUTING -i $LAN_IN -p tcp --dport 80 -j DNAT --to $PROXY_SERVER:$PROXY_PORT
iptables -t nat -A PREROUTING -i $LAN_IN -p tcp --dport 443 -j DNAT --to $PROXY_SERVER:$PROXY_PORT
# if it is same system
iptables -t nat -A PREROUTING -i $INTERNET -p tcp --dport 80 -j REDIRECT --to-port $PROXY_PORT
iptables -t nat -A PREROUTING -i $INTERNET -p tcp --dport 443 -j REDIRECT --to-port $PROXY_PORT
# DROP everything and Log it
iptables -A INPUT -j LOG
iptables -A INPUT -j DROP
还是要注意client不要跑在127.0.0.1端口上,否则iptables nat/mangle链不起作用。

from http://www.alexclouds.net/?p=1805
------------

防止树莓派网络配置出错及各种修复方法

说明

网络配置错误是大多数树莓派用户都可能遇到的问题,特别是对于通过SSHVNC连接树莓派的朋友,一旦网络配置错误也就无法通过网络连接了,只能通过其它手段修复。如果不是爱折腾的用户,甚至可能会选择重新刷入系统,造成数据的丢失。
这里介绍一种防止网络配置出错导致不能连接的方法,在配置出错后可以很快速的修复。
  • 原理
    树莓派的boot分区是fat32格式的,在Windows上可以直接查看和编辑里面的文件。树莓派的网络配置文件位于/etc/network/interfaces,只需要将这个文件链接到boot分区,我们就可以在电脑上编辑这个配置文件里,这样就可以修复因为网络配置错误而无法连接的树莓派了。
  • 操作步骤
    登陆树莓派后执行下面两条命令:
sudo mv /etc/network/interfaces /boot/interfaces
sudo ln -s /boot/interfaces /etc/network/interfaces

网络配置错误的几种解决方法

修复方法有很多中,但不管那种方法,原理都是一样的 —— 修复网络配置文件/etc/network/interfaces。下面是默认的配置文件内容:
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
几种常见的修复方法:
  • 显示器
    如果树莓派能够通过hdmi连接到显示器,修复就变得非常简单了。接上键盘鼠标直接编辑/etc/network/interfaces这个文件就行了。
  • 串口调试线
    如果你手上有一根串口调试线,可以通过串口登陆到树莓派的终端,在在终端里编辑树莓派的网络配置文件即可。在Windows上可以使用Putty或自带的超级终端进行连接,在Linux上也有Screen等程序。
    serial port
  • Linux平台
    如果有一个Linux平台,不管它是一台PC、一台笔记本甚至一个OpenWrt路由器,只需要支持ext4文件系统格式并带一个USB接口即可。只需要将树莓派的卡挂载后就可以直接查看和编辑树莓派的系统文件了,这是最简单和方便的一种方法。
PS:这篇文章是在一台运行ArchLinux的树莓派2代的完成的,使用Chromium浏览器。等了这么久,树莓派终于可以运行一个可用的桌面系统了,虽然流畅性并不是特别好,但是至少够用了.
-------------

DIY高性能树莓派OpenWrt无线路由器

概述

树莓派是一款只有信用卡大小的电脑,虽然硬件配置运行图形操作系统会有些吃力,不过对于OpenWrt系统来说,树莓派的配置可以说是相当豪华了:
参数
CPU700 MHz ARM11 ARM1176JZF-S core
Ram256 or 512 MB
Network10M/100M Ethernet RJ45
USB2 USB ports
Memory CardYES
VideoHDMI/Video
AudioYES
SerialYES
JTagYES
700MHZ CPU, 512MB内存,显卡、声卡、串口、JTag、GPIO要啥有啥,这已经是旗舰级路由的配置了。树莓派拥有丰富的GPIO可供使用,相比其他的路由器,树莓派的诱人之处在于那两排丰富的GPIO引脚,为DIY智能设备提供了众多的可能性。

软硬件准备

硬件清单

hardware list
  • A 树莓派B型一个
  • B TF卡一张(TF转SD卡适配器一个,也可以直接使用SD卡)
  • C USB无线网卡一个
  • D TTL调试器1个
  • SD或TF读卡器一个
当然,网线、USB电源和电脑是必须的,这里没有列出。
非常重要:关于USB无线网卡的选型
为了避免不必要的麻烦,尽量选择OpenWrt已经支持的无线网卡。上图中的无线网卡是"必联(B-LINK) BL-WN2210 300M无线USB网卡",使用RTL8192CU芯片。
USB无线网卡的选择错误将可能是一场灾难,在购买兼容的无线网卡之前,我一直试图使用“MERCURY MW150US”(使用RTL8188EU芯片,OpenWrt不支持),经过两天的编译、各种配置之后还是无法在OpenWrt上正常工作,浪费了大量时间和精力。这是我编译好的8188eu内核驱动,有兴趣的朋友可以尝试一下配置。

软件清单

pinout

组转

connection

安装OpenWrt

和其他系统的安装方法一样,OpenWrt在树莓派上的安装也是直接将系统镜像烧录到SD卡就行了,比普通路由器的刷机方式简单多了。
首先在http://downloads.openwrt.org/snapshots/trunk/brcm2708/下载系统镜像,文件名为openwrt-brcm2708-sdcard-vfat-ext4.img
将SD卡通过读卡器连接电脑,备份SD卡的重要数据。然后打开USB Image Tool,选择SD卡的那个盘后点击Restore,选择下载的OpenWrt镜像文件即可开始烧录。
burn image
烧录完毕之后将SD卡插到树莓派上就可以上电开机了。通过putty可以看到启动信息。OpenWrt在树莓派上的性能非常好,13秒即可完全载入系统。
boot complete

配置及优化

WAN配置

装好系统之后的第一件事肯定就是让树莓派上网了,我们将树莓派自带的网口作为WAN口使用。
这里有两种方式上网:一种是将树莓派连上家里的路由器的LAN口;如果家里没有路由器的话,可以直接将路由器连上小区宽带进行PPOE拨号上网。
这里我们使用第一种方式(因为树莓派和电脑在同一网段,方便访问luci管理界面)。在putty串口输入vi /etc/config/network命令编辑网络配置文件。将lanifname行注释掉。然后添加一个wan口配置。
# Copyright (C) 2006 OpenWrt.org

config interface loopback
        option ifname   lo
        option proto    static
        option ipaddr   127.0.0.1
        option netmask  255.0.0.0

config interface lan
#       option ifname   eth0
        option proto    static
        option ipaddr   192.168.1.1
        option netmask  255.255.255.0

config interface wan
        option proto dhcp
        option ifname eth0
使用/etc/init.d/network命令重启一下网络,如果百度能ping通的话说明网络正常,这时可以使用opkg工具安装软件了。
ping

安装luci

opkg update && opkg install luci
安装完成之后使用/etc/init.d/uhttpd restart命令重启一下http服务,然后使用/etc/init.d/firewall stop命令禁用防火墙(以便从WAN口访问),这时在浏览器上输入树莓派的ip地址就可以访问了。
luci

添加无线网卡支持

1.首先安装USB设备支持:
opkg update && opkg  kmod-usb-core kmod-usb-uhci kmod-usb-ohci kmod-usb2
2.安装无线网卡驱动(这里根据实际的网卡选择驱动):
opkg install kmod-rtl8192cu
3.重启一下树莓派, 检查驱动是否加载成功:
root@Raspberry:~# lsmod | grep 8192
compat                  1919  4 rtl8192cu
mac80211              354713  3 rtl8192cu
rtl8192c_common        33465  1 rtl8192cu
rtl8192cu              59189  0
rtl_usb                 8011  1 rtl8192cu
rtlwifi                43783  2 rtl8192cu
4.配置WIFI
检查一下是否自动生成了/etc/config/wireless配置文件,如果没有,使用下面的命令重新生成一个:
wifi detect > /etc/config/wireless
然后编辑无线配置文件:
注意:channel这个配置项的值不能为auto否则无线不能正常工作。
config wifi-device 'radio0'
        option type 'mac80211'
        option hwmode '11g'
        option path 'platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0'
        option country 'CN'
        option channel '8'
        option txpower '17'
        option htmode 'HT20'

config wifi-iface
        option device 'radio0'
        option network 'lan'
        option mode 'ap'
        option key 'abc12345678'
        option wmm '0'
        option ssid 'Raspberry'
        option disabled '0'
        option encryption 'psk'
确认一下/etc/config/networklan配置
config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config switch 'eth0'
        option reset '0'
        option enable_vlan '0'

config interface 'lan'
        option proto 'static'
        option ipaddr '10.2.2.1'
        option netmask '255.255.255.0'
        option dns '114.114.114.114 114.114.115.115'
        option type 'bridge'

config interface 'wan'
        option ifname 'eth0'        option _orig_ifname 'eth0'
        option _orig_bridge 'false'
        option proto 'dhcp'
配置完成之后重启一下树莓派,这时候使用笔记本或Android手机可以搜到Raspberry这个无线网络,输入密码就可以连接了。
提示:不要使用ipad等玩具测试连接,可能会连接失败

BusyBox中文支持

官方的busybox不支持中文文件名,我重新编译了一个busybox,可以在这里下载:
Busybox支持中文功能增强/
注意: 安装之前先使用rm -rf /tmp/opkg*命令删掉opkg缓存,否则会提示md5不匹配错误。

Shadowsock服务

编译github上的shadowsocks只支持rc4和table加密,最后找到了LazyZhu的静态编译版本,对各种加密方式支持良好,下载地址:

PPOE拨号

如果想用树莓派作为全职的路由器的话,可以直接将树莓派的网口接到小区宽带进行PPOE拨号。
ppoe

已知问题

无线网络不稳定

在使用过程中,有时候会遇到网页打开非常慢的情况,应该是无线网络不稳定导致的(没掉线,只是传输速度非常慢)。

不支持Itoys设备

DIY的树莓派路由器不支持Iphone、Ipad等玩具,提示无法加入网络错误。
itoys

参考资料


--------------------------------------------------------------------------

为树莓派DIY一款高速稳定的无线网卡

我的树莓派用作NAS+影音服务器,因为不想被网线束缚,所以树莓派是通过无线网卡连接家里的主路由WIFI来上网的,这样就可以把树莓派扔到冰箱顶上并保持24小时开机了。
可惜的是树莓派对无线网卡的支持似乎并不好,首先是速度慢,我的树莓派使用WIFI只有大约1.3M左右的读取速度和1M左右的写入速度;其次稳定性也没有想象中好,在这么慢的写入速度下有时速度会直达0然后WIFI掉线。
我尝试过4款不同的无线网卡,包括EP-N8508GS (8188ucs), 水星 MW150US (rtl8188eu)磊科 NW367 (rtl8192CU) 和必联 BL-WN2210 (rtl8192cu). 每一款都有存在同样的问题。网上能找到的几乎所有方案,例如换电源、限制网速、关闭树莓派OTG芯片的Turbo模式...不稳定的现象依然存在。奇怪的是,测试发现树莓派的有线连接非常不仅稳定,而且速度也要好很多,峰值读取可达7M/S。但是因为不想看到眼前绕着各种线(强迫症伤不起...),所以宁愿忍受WIFI掉线也不想用有线连接。
wifi adapters
就这样将就着用了几个月,期间虽然有无数次想把树莓派拍在墙上的冲动,不过由于树莓派躲在冰箱顶的角落而幸运的躲过一次次的劫难...最近新换了个主路由器,看着淘汰下来的WR703N,突然灵光一现,这个路由器不就是块无线网卡吗?而且是专业的!稳定性和速度都应该不错!

原理

WR703N路由器刷OpenWrt固件后具有中继模式,简单地说,就是将路由器当成无线基站,接收上级路由的WIFI信号,然后将上级路由的网络通过有线或WIFI分享给其他设备。所以我们可以使用WR703N连接上级路由的WIFI,树莓派连上WR703N的有线接口,从而建立树莓派和上级路由的连接。相当于WR703N变成了一块无线网卡。而对于树莓派来说,因为它是通过有线网口和WR703N连接的,不会出现使用无线网卡时不稳定的情况。网络拓扑图如下:
wifi adapters
我的主路由内网为10.1.1.x,电脑、手机、IPAD等设备通过WIFI直接连到主路由,WR703N首先通过WIFI连接到主路由,然后通过有线将网络桥接到树莓派。无线路由器可以使用中继桥接两种模式来实现连接,我使用的是桥接模式,以保证所有设备都处于同一个网段,这样可以完美支持minidlna等upnp程序。

硬件连接

我的树莓派和外设是通过大量的螺丝和穿孔固定在一块基板上的,所以只要将WR703N也作为一个外设固定上去就行了。
  • 这是没有外设的样子:
    raspberry_pi_board_1
  • WR703N和飚王的Hub固定,通过树莓派的USB接口直接驱动两块U盘、一个音响和一个路由器,谁说树莓派U口的驱动能力低的?
    router_and_hub
  • 组合一下,DIY的那根黑色USB线内部集成了一颗PL2303芯片,连接后树莓派可以通过串口调试WR703N。
    all_in_1
  • 上电开机,当然,上电之前经历了艰苦卓绝的调试。
    all_in_1

测试

安装完成之后做了些简单的测试,这款DIY的树莓派无线网卡速度和稳定性完全符合我的预期!下面是一些测试结果:
  1. Samba读取速度为3.5~4.5 M/S.
    samba_read
  2. Samba写入速度为3~3.3M/S.
    samba_write
  3. 频繁通过Samba读写树莓派上的文件,在读取8G,写入5G的数据之后没有出现死机卡死的情况。
    samba_write

总结

从上面的测试结果和我几天的使用情况看来,这款DIY的树莓派无线网卡拥有非常可观的速度和稳定性,可以无视市面上大部分无线网卡了。
在调试这款网卡时花了不少时间,无数次想Knock my head against the wall.我会将调试过程和遇到的问题记录在另一篇文章.
-----------------

在OpenWrt路由器上安装MySQL Server

想试试将MySQL Server部署到OpenWrt上解决一下燃眉之急。
OpenWrt的软件源上有编译好的mysql-server软件包的,可以直接安装,总共需要安装以下几个包:
  • mysql-server
  • libmysqlclient
  • uclibcxx
  • libncursesw
  • libreadline
上面这些软件包的体积加起来大约有3M,加上数据库文件,普通的路由器肯定是没有这么大的空间的,所以需要使用extroot将系统扩展到U盘上。
我使用的是pivot-root方式扩展,即整个系统都在U盘里,从U盘启动后直接安装就可以了:
opkg update && opkg install libreadline libncursesw uclibcxx libmysqlclient mysql-server

配置

文件及目录

安装完成之后先更改一下配置文件/etc/my.conf, 主要修改datadirtmpdir配置项, 这两个目录需要放在U盘上,最好手动建立这两个目录。
############ Don't put this on the NAND #############
# Figure out where you are going to put the databases
# And run mysql_install_db --force
datadir         = /home/db/mysql/

######### This should also not go on the NAND #######
tmpdir          = /home/db/tmp/

初始化数据库

mysql_install_db  --force
初始化完成之后就可以启动了:
/etc/init.d/mysqld start

更改root密码

mysqladmin -u root password 'new-password'

启动和登录

mysql -u root -p
mysql test

外网访问

  • 首先需要更改一下绑定的ip,修改my.conf文件的bind-address0.0.0.0.
  • 授权用户
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'my-password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
  • 添加一条转发规则(路由器IP是10.2.2.1),开放3306端口:
config redirect
        option target 'DNAT'
        option src 'wan'
        option dest 'lan'
        option proto 'tcp udp'
        option src_dport '3306'
        option dest_ip '10.2.2.1'
        option dest_port '3306'
        option name 'mysql'
  • 测试
    在Windows下可以通过telnet命令检测是否可远程访问MySQL服务器:
    如 telnet 10.1.1.238 3306, 如果成功将可以看到类似下面的输出:
    remote test 1
    配置完成之后就可以通过程序连接了:
    remote test 2

问题及解决方案

初始化数据库时失败

运行mysql_install_db --force命令时提示错误,检查了一下配置文件是没问题的,后来发现是配置文件里的tmpdir目录不存在,而MySQL不会自动创建(datadir如果不存在会自动创建),手动创建这个目录后再次执行就正常了。

表名区分大小写

在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。
因为软件需要兼容SQL Server和MySQL,项目组的成员大小写习惯也不一样,所以需要将表名的大小写敏感去掉,在my.conf文件的mysqld配置项中加一行配置:
lower_case_table_names=1

mysql命令行客户端中文乱码

由于使用了latin1字符集,使用mysql命令行客户端进行查询时,中文显示乱码。
修改/etc/my.cnf文件指定编码:
  • 在[client]字段里加入default-character-set=utf8
  • 在[mysqld]字段里加入character-set-server=utf8
  • 在[mysql]字段里加入default-character-set=utf8
重启一下mysqld就可以看到默认的编码了:
encode

因配置文件权限错误导致mysqld不能启动

Warning: World-writable config file '/etc/my.cnf' is ignored
140817 22:21:06 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

140817 22:21:06 [ERROR] Aborting

140817 22:21:06 [Note] mysqld: Shutdown complete
/etc/my.cnf文件的权限改成644即可。

不支持事务

OpenWrt的MySQL编译时没有添加InnoDB引擎支持,而默认的MyISAM不支持事务处理。如果需要支持事务需要自己编译并添加InnoDB引擎。
这里提供一个带InnoDB引擎的MySQL下载,是gatoti编译的,版本为5.1.53,适用于ar71xx平台,下载地址:http://robots.shuyz.com/openwrt/wr703n/non-official/MySQL_with_InnoDB/
mysql> SHOW  ENGINES;
+------------+---------+--------------------------------------------------------
----+--------------+------+------------+
| Engine     | Support | Comment
    | Transactions | XA   | Savepoints |
+------------+---------+--------------------------------------------------------
----+--------------+------+------------+
| CSV        | YES     | CSV storage engine
    | NO           | NO   | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables
    | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tabl
es  | NO           | NO   | NO         |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign k
eys | YES          | YES  | YES        |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance
    | NO           | NO   | NO         |
+------------+---------+--------------------------------------------------------
----+--------------+------+------------+
5 rows in set (0.01 sec)
MySQL的默认引擎为MyISAM,如果需要改成InnoDB的话需要在my.cnf配置文件的mysqld段添加一行default-storage-engine=innodb
如果想自己编译其它平台的可以参考他博客上的教程:MySQL InnoDB Enabled pada OpenWrt Backfire 10.03.1

参考资料

------------------
相关帖子:https://briteming.blogspot.com/2016/12/blog-post_52.html
-------------------



利用Raspberry Pi加shadowsocks搭建代理服务


设想:路由器和Raspberry Pi的耗电都非常小,可以常开不关机。而且手机上使用SSH -D、shadowsocks和VPN都不方便,还增加电池消耗。android上的twidere和twitter官方客户端都支持HTTP代理,iOS也方便使用pac代理。HTTP代理虽然没有加密,但是因为都在国内没有通过GFW所以不会触发屏蔽。
原理如图:
说明:
1. Raspberry Pi运行在一个局域网里面,分配的IP如192.168.1.103(如果是DHCP可以在路由器设置里将MAC和IP绑定,防止IP分配变化),Raspberry Pi运行shadowsocks或者ssh D产生一个socks代理,用polipo再转化成HTTP代理。这样产生了一个192.168.1.103:7070的socks代理和一个192.168.1.103:1080的HTTP代理。
2. 路由器同时包含两个IP,一个是对内的192.168.1.1,一个运营商分配的公网IP。在路由器配置端口转发,将7070和1080都转发到192.168.1.103上。这样从外面访问路由器(公网IP)的这两个端口,就相当于访问192.168.1.103(Raspberry Pi)的对应的两个端口。
3. 局域网内PC和手机可以直接用Raspberry Pi的IP和端口进行代理。
4. 因特网上的PC和手机(外出的情况)就用路由器的公网IP和端口进行代理,当然局域网内也可以这样访问,只不过绕了路。
5. 如果Raspberry Pi再运行一个HTTP server,路由器添加80端口转发,可以实现通过pac文件进行选择性代理。
6. 路由器的公网IP变化比较快,推荐绑定3322.org的二级域名,花生壳和kmdns都不好使,3322.org支持API更新,可以用shell脚本更新:http://xixitalk.github.io/blog/2013/05/29/update-ddns-with-api,从外面用域名加端口的方式访问,这样就可以防止公网IP变了而无法使用的情况。
7. 安全问题:这里的HTTP代理没有用户名密码验证,注意保密。以上端口除了系统占用的一小部分外,几乎可以修改为任意不常用的端口。
----------------

在树莓派上搭建全局透明代理网关

新剁手了一个Google Home mini,需要科学上网才能正常使用,而 home 本身不支持设置代理,所以需要在网关上动手。正好一直使用树莓派当路由器,所以尝试把树莓派打造成一个带有智能转发功能的透明网关,即国内的 IP 直连,海外的 IP 走代理加速。

配置无线网络

本文关注点不在此,所以一笔带过。
可以通过一键安装脚本 pi-setup-wifi.sh (https://github.com/newnius/raspberryPi/blob/master/installations/pi-setup-wifi.sh) 来安装和配置树莓派的无线。该脚本会创建一个名为SSID,密码为PASSWORD的无线网络,使用的网段为 192.168.68/24

启动 DoH 服务来避免 DNS 污染

目前 GFW 大概有这么几个级别的干扰:
  1. 随机丢包、限速
  2. 域名阻断、IP阻断
  3. DNS 干扰
一般的网站都基本上处于1或2,一般来说只要 TCP/UDP 流量不直连就行,但是 Google 家的产品比较强,直接上了最高规格的屏蔽,即 DNS 解析污染。
出于性能和速度的考虑, DNS 协议使用了 UDP 这种不可靠的协议,这使得 DNS 解析污染出现,即被中间路由截获并返回了虚假的 IP 地址,因此我们需要建立一个可靠的 DNS 解析服务。
目前已经有很多解决方案,如基于 TCP 的 DNS 解析,但是由于 TCP 流量仍然能够被嗅探,所以出现了 DoH (DNS over Https),这样只要服务器没问题,返回的结果就一定是正确的。
本文权衡各工具,最后选择了 Cloudflare 家的 DoH服务
首先到 下载页 下载 Binary: ARMv6这一栏的压缩包,然后解压。
(被屏蔽了,需要用代理下载)

1
tar -xzvf cloudflared-stable-linux-amd64.tgz

然后把 cloudflared 移动到 /usr/local 目录下,并启动。

1
/usr/local/cloudflared proxy-dns --address 0.0.0.0 --port 15353

只监听本地的话wifi客户端会有问题
5353 端口被 avahi 占用了,所以使用15353
你可以在 /etc/rc.local 文件中配置开机启动。

1
nohup /usr/local/cloudflared proxy-dns --port 15353 &

不同网络层之间协议转换

安装 redsocks 来把无线网卡的流量转发到 socks5 代理,这本质上是转换两个不同网络层的流量。

1
sudo apt install -y redsocks

编辑配置文件 /etc/redsocks.conf

1
2
3
4
5
6
redsocks {
 local_ip = 0.0.0.0;
 local_port = 12345; 
 ip = 127.0.0.1;
 port = 1080;
}

这里的ip必须改成0.0.0.0,实测如果保留127.0.0.1会让wifi客户端无法上网
这里假设已经有一个开放在 1080 端口的 socks5 服务,可以使用 Shadowsocks 来创建一个。
重启 redsocks 以使配置生效

1
sudo service redsocks restart

忽略国内地址

安装 ipset 来生成国内地址列表

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt install -y ipset

# 下载分配给国内运营商的 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段加进去
sudo ipset create chnroute hash:net

cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip

# 上一条命令执行的非常慢,所以把结果保存下来,下次直接从文件恢复
sudo bash -c "ipset save chnroute > /etc/chnroute.ipset"

在系统重启后,使用如下命令来恢复ipset

1
sudo ipset restore < /etc/chnroute.ipset

使用 iptables 来转发流量


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo iptables -t nat -N SHADOWSOCKS

# 注意这里要把 $server_IP 改成你自己的 socks5 远程IP,即你的VPS IP,不然无法正常工作
sudo iptables -t nat -A SHADOWSOCKS -d $server_IP -j RETURN

# 忽略局域网地址
sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN

# 把流量转发到 12345 端口,即redsocks
sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

覆盖设备自身的 DNS 服务器

因为 Google Home 内置了 DNS 服务器,而不是网关分配的,所以需要把流量截获然后转发到可靠的 DNS 解析。

1
2
sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 15353
sudo iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 15353

至此,搭建完毕,将 Google Home 连接到 wifi 上,就可以开始欢快的使用各种服务啦^_^。
Hey, Google, nice to meet you .

参考链接及资源

Running a DNS over HTTPS Client

https://developers.google.com/speed/public-dns/docs/dns-over-https
https://medium.com/@oliviaqrs/%E5%88%A9%E7%94%A8shadowsocks%E6%89%93%E9%80%A0%E5%B1%80%E5%9F%9F%E7%BD%91%E7%BF%BB%E5%A2%99%E9%80%8F%E6%98%8E%E7%BD%91%E5%85%B3-fb82ccb2f729