在树莓派上搭建软路由

出发点

  • 很早的时候一直在用网件 wndr4300 刷了 openwrt 以及 lede 这种开放式的路由系统,一直沉迷于无界浏览无法自拔。因为笔者最近在学习的一些东西比较新,在国内看不到详细的文档,能上 google 当然是最好的。

要求提升

  • 当然不能满足于可以访问,作为一个年轻人就要有敢于折腾的精神。速度慢点的路由已经满足不了笔者的需求了。刚好前几天买了个树莓派3,不折腾下似乎有点过分了啊。

准备工具

需要的设备

  • 电脑一台
  • 树莓派 or 其他linux平台
  • 网卡2个,有线,无线,usb网卡都行
  • 网线一根

需要的软件

  • dnsmasq or isc-dhcp-server
  • overture or DNScrypt
  • v2ray shadowsocks or shadowsocks-rss

网络拓扑

网络拓扑图

开始动手

配置网卡

  • 先把提供本机dhcp服务的网卡地址配置好,给自己赋予一个静态地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo vim /etc/network/interfaces

# 加入以下内容
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 192.168.20.1
network 192.168.20.0
netmask 255.255.255.0
broadcast 192.168.20.255
  • 解释下eth0eth1是我的树莓派上两张网卡,这个网卡名字不一定都是这种,根据自己的网卡名称进行修改,输入ifconfig来查看

  • eth0是连接上级路由的,它的网段是192.168.10.0,我直接连上就能上网了,把这张卡设置dhcp,自动从上级路由获取ip,如果是无线网卡一般是wlan0

  • eth1是本机用来提供路由服务的,设置自己的网段,并且赋予自己固定ip

配置 dnsmasq

  • 首先安装 dnsmasq 来提供 dhcp 和 dns 缓存服务
1
sudo apt-get install dnsmasq
  • 安装完成后查看安装状态

pi@raspberrypi:~ $ dnsmasq -v
Dnsmasq version 2.76 Copyright (c) 2000-2016 Simon Kelley
Compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify

  • 编辑 dnsmasq 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 不需要提供dhcp服务的网卡,一般是连接外网的那张卡
no-dhcp-interface=eth0
dhcp-range=192.168.20.10,192.168.20.100,72h

cache-size=102400
log-facility=/var/log/dnsmasq/dnsmasq.log

# 指定返回给客户端的ttl时间,一般不需要设置
max-ttl=28800
# 本地 hosts 文件的缓存时间,通常不要求缓存本地,这样更改hosts文件后就即时生效。
local-ttl=360
# 对于上游返回的值没有ttl时,dnsmasq给一个默认的ttl,一般不需要设置
neg-ttl=28800
# 设置在缓存中的条目的最大 TTL。
max-cache-ttl=28800
# 设置在缓存中的条目的最小 TTL。
min-cache-ttl=10800

conf-dir=/etc/dnsmasq.d/
  • 如果你是使用了isc-dhcp-server这种额外的 dhcp 服务器,那么就把上面
1
2
no-dhcp-interface=eth0
dhcp-range=192.168.20.10,192.168.20.100,72h
  • 这两句删掉吧,如果不设定dhcp-range dnsmasq 默认是不开启 dhcp 的,然后这么配置isc-dhcp-server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sudo vim /etc/dhcp/dhcpd.conf

# 添加以下内容
ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;

# 网段
subnet 192.168.20.0 netmask 255.255.255.0 {

# DHCP 分配ip范围
range 192.168.20.10 192.168.20.100;

# DHCP 给接入设备分配的网关
option routers 192.168.20.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.20.255;

# 分配的DNS服务器
option domain-name-servers 192.168.20.1;
}
  • 建议直接用 dnsmasq 好了,忽略上面两条内容即可

  • 添加 gfwlist

1
2
3
4
5
6
cd 
git clone https://github.com/cokebar/gfwlist2dnsmasq.git
cd gfwlist2dnsmasq
chmod a+x gfwlist2dnsmasq.sh
./gfwlist2dnsmasq -o gfwlist.conf -s gfwlist
sudo cp gfwlist.conf /etc/dnsmasq.d/
  • gfwlist.conf中都是这样的存在
1
2
3
4
5
server=/030buy.com/127.0.0.1#5300
ipset=/030buy.com/gfwlist
server=/0rz.tw/127.0.0.1#5300
ipset=/0rz.tw/gfwlist
...
  • 127.0.0.1#5300代表匹配的域名通过这个服务器和端口进行 DNS 解析,而这个端口是多少取决于一会你的防污染 DNS 服务器开启的端口,刚生成的是 5353 端口,我的因为被占用了,查找并替换改成 5300
1
2
3
4
5
# 开启dnsmasq
sudo service dnsmasq start

# 设置开机自启动
sudo systemctl enable dnsmasq

配置转发服务

1
2
3
4
5
6
7
sudo vim /etc/sysctl.conf

# 修改一项,把前面注释号#去掉,或者自己加
net.ipv4.ip_forward = 1

# 让上述修改立刻生效
sysctl -p
  • iptables开启网段定向转发
1
2
3
4
5
6
7
sudo iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o eth0 -j MASQUERADE

# 上面这条命令重启就没了,写入文件中保证长期有效
sudo vim /etc/rc.local

# 在 exit0 前加入
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o eth0 -j MASQUERADE
  • ok, 至此,一个具有正常功能的普通路由就可以使用了,连接的设备也是可以上网的了

配置无污染的上级 DNS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
"BindAddress": ":5300",
"PrimaryDNS": [
{
"Name": "DNSPod",
"Address": "119.29.29.29:53",
"Protocol": "udp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": ""
}
},
{
"Name": "114",
"Address": "114.114.114.114:53",
"Protocol": "udp",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": ""
}
}
],
"AlternativeDNS": [
{
"Name": "OpenDNS",
"Address": "208.67.222.222:443",
"Protocol": "tcp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": ""
}
}
],
"OnlyPrimaryDNS": false,
"RedirectIPv6Record": true,
"IPNetworkFile": "./ip_network_sample",
"DomainFile": "./domain_sample",
"DomainBase64Decode": true,
"HostsFile": "./hosts_sample",
"MinimumTTL": 0,
"CacheSize" : 0,
"RejectQtype": [255]
}
  • 然后直接运行就行 ./overture-linux-arm, 这样不能关闭这次连接的终端,否则就关闭了,可以选择开一个 screen 来运行,或者./overture-linux-arm &

  • DNSCrypt 可以代替 overture 不过配置麻烦,读者可以自行研究,功能更加强大稳定

配置 v2ray

1
2
3
4
cd 
wget https://install.direct/go.sh
sudo bash go.sh
sudo vim /etc/v2ray/config.json
  • 客户端配置出一个socks5代理端口 8080 (以备不时之需)、一个透明代理端口 1080
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
"log": {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbound": {
"port": 8080,
"listen": "192.168.20.1",
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": false
}
},
"inboundDetour": [
{
"protocol": "dokodemo-door",
"port":1080,
"settings":{
"network": "tcp,udp",
"timeout": 30,
"followRedirect": true
}
},
{
"protocol": "dokodemo-door",
"port":5300,
"settings":{
"address":"8.8.8.8",
"port":53,
"network": "udp",
"timeout": 30,
"followRedirect": false
}
}
],
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "yourserver.com",
"port": 12345,
"users": [
{
"id": "1sb4165e-1234-4310-9d57-a8a2994r5e0d",
"alterId": 32,
"security": "auto"
}
]
}
]
},
"streamSettings":{
"network":"kcp",
"kcpSettings": {
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5,
"downlinkCapacity": 100,
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "none"
}
}
},
"mux": {
"enabled": true
}
},
"outboundDetour": [
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
],
"dns": {
"servers": [
"8.8.8.8",
"localhost"
]
}
}
  • iptables 和 ipset 设置
1
2
3
4
5
6
7
8
9
10
11
12
sudo apt-get install ipset
sudo ipset -N gfwlist iphash
sudo iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
sudo iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080

# 把路由配置写入文件中,长久保存
sudo vim /etc/rc.local

# 在exit0前把这三句加上
ipset -N gfwlist iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
  • 开启无限制的世界
1
2
3
4
sudo service v2ray start

# 把 v2ray 设置为开机自启动
sudo systemctl enable v2ray

效果展示

树莓派连接

housirvipdeiMac:~ housirvip$ dig www.google.com

; <<>> DiG 9.8.3-P1 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23438
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.google.com. IN A

;; ANSWER SECTION:
www.google.com. 1978 IN A 172.217.26.36

;; Query time: 17 msec
;; SERVER: 192.168.20.1#53(192.168.20.1)
;; WHEN: Thu Aug 17 23:59:10 2017
;; MSG SIZE rcvd: 48

google ip 验证

youtube测试