R2S刷入Armbian指南
R2S 是一台优秀的迷你Arm服务器,其功耗低、双千兆以及价格低的优势,让这个设备非常流行
大部分R2S的教程都是刷入 openwrt 为主,这是实现透明代理网关比较简单的方案
除了 openwrt 外,R2S 其实还支持许多第三方系统,例如原生的 Linux 系统 Armbian
Armbian 可以完美地实现透明代理网关,设置起来不像openwrt一样,在Web界面上又繁琐又复杂,还经常找不到设置选项在哪里
使用 R2S + Armbian 来实现类openwrt的效果,其思路与之前的文章Linux透明网关思路一致
本文可以看成是R2S版的透明网关实现,其网络拓补图如下:
在上图中,我省略了光猫的部分,R2S将取代原来路由器的位置,2个千兆接口分别接入路由器的 WAN口 和光猫 拨号LAN口
R2S 将负责宽带拨号以及网络转发、网络分流的功能,这一点与openwrt版的R2S是一模一样的
下面将一步一步地实现拨号、DNS解析以及针对不同IP分别处理直连与科学代理
2. Armbian
Armbian是一个基于Linux的操作系统发行版,专门为ARM架构的单板计算机(如树莓派、Orange Pi等)设计和优化
这当中也包括了R2S,可以从Armbian的官网上下载得到属于R2S的Armbian系统镜像
2.1. 系统安装
R2S的官方镜像地址
https://www.armbian.com/nanopi-r2s/下载后的系统镜像是一个 .xz
文件,无需解压 .xz
,直接将镜像写入到内存卡上插入 R2S 即可开机
写入内存卡后,将内存卡插入R2S中,从路由器的 LAN口 连接网线到 R2S 的 LAN口
再接入电源和网线,并观察 LAN 灯是否亮起
如亮起,说明已连接到路由器下,登录到路由器后台,查看R2S被分配到的IP,之后使用SSH远程登录
默认账户:root 默认密码:1234登录后会提示你进行初始化设置,包括ROOT账户密码以及一个具备管理员权限的账户
2.2. 系统设置
如果访问外网不畅通,可以将 Armbian 的源更换到清华源
清华源 - /etc/apt/sources.list 清华源 - /etc/apt/sources.list.d/armbian.list安装要用的一些必要软件以及我的一些常用软件
Bashcontent_copy# 更新软件包 apt update -y # 更新系统 apt upgrade -y # 安装必要软件 apt install -y supervisor gcc make iproute2 ipset pppoeconf vim wget git curl unzip dnsutils net-tools tree # 安装我常用的软件(可选) apt install -y btop proxychains openssl
此外,Armbian也支持sudo权限管理,如果有用户设置的需求,请自行编辑sudo文件进行权限分配,以下默认采用Root用户进行操作
2.3. 宽带拨号
在初始化成功后,编辑:/etc/netplan/armbian-default.yaml
YAMLcontent_copynetwork: version: 2 renderer: NetworkManager ethernets: lan0: # 请确保你的LAN口名称是lan0 dhcp4: no addresses: [192.168.1.1/24] eth0: # 请确保你的WAN口名称是eth0 dhcp4: yes nameservers: addresses: [114.114.114.114]
编辑完成后,拔除网线,将路由器的 WAN口 接入 R2S 的 LAN口 ,将R2S的 WAN口 接入光猫的拨号口,将路由器设置为:
静态IP:192.168.2.1 静态网关(R2S的IP):192.168.1.1 静态DNS服务(R2S的IP):192.168.1.1接着使用ssh会话连接到 192.168.1.1 ,即你的R2S,再进行宽带拨号
Bashcontent_copypppoeconf
根据提示填入宽带帐号密码即可
再编辑:/etc/sysctl.conf
Bashcontent_copy... # 允许IPV4的流量转发 net.ipv4.ip_forward=1
并更新支持IP转发的设置
Bashcontent_copysysctl -p
然后添加临时转发规则方便进行测试
Bashcontent_copyiptables -t nat -I POSTROUTING -j MASQUERADE
在局域网内,使用任意设备通过 ping 114.114.114.114
确认网络是否畅通
如果没问题,这里就已经实现了 R2S 拨号并转发网络数据
3. 透明代理网关
网络透明代理(Transparent Proxy)是一种网络代理的方式,在代理服务器和用户之间进行中间层的数据传输
对用户来说,它是透明的,用户无需进行任何额外的配置,这种代理不用在每一个设备上安装代理软件
对于一些游戏机、特定系统的设备来说很友好
3.1. 透明代理(Gost)
代理我使用的是 gost,服务端的部分可以使用商业代理或者自建服务器,这里假设代理协议是 ss
下载gost:
https://github.com/go-gost/gost/releases/tag/v3.0.0-rc8下载到 /root/gost/
中,解压后目录如下
$ tree . ├── gost ├── gost_3.0.0-rc8_linux_arm64.tar.gz ├── LICENSE ├── README_en.md └── README.md 0 directories, 5 files
编辑:/root/gost/config.yaml
YAMLcontent_copyservices: - name: "1080-red" addr: :1080 handler: chain: chain-0 type: red listener: type: red - name: "1080-dns" addr: :1080 handler: chain: chain-0 type: dns listener: type: dns metadata: mode: udp forwarder: nodes: - name: Google-1 addr: tls://8.8.8.8:853 - name: Google-2 addr: tls://8.8.4.4:853 chains: - name: chain-0 hops: - name: hop-0 nodes: - name: "1.2.3.4" addr: "1.2.3.4:48888" # ss协议的地址和端口 connector: type: ss auth: username: chacha20-ietf-poly1305 # ss协议加密方式 password: my-passwd # ss协议密码
根据你的 ss 协议,自行修改地址、端口、加密方式、密码,然后运行gost服务进行测试
Bashcontent_copy/root/gost/gost -C /root/gost/config.yml
运行没有错误输出后,可以使用 supervisor 配置为后台进程
编辑:/etc/supervisor/conf.d/gost.conf
TEXTcontent_copy[program:gost]
command=/root/gost/gost -C /root/gost/config.yaml
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=20MB
stdout_capture_maxbytes=1MB
user=root
更新supervisor运行,并检查运行状态
Bashcontent_copysupervisorctl update supervisorctl status
3.2. DNS解析(Overture)
Overture 是一个开源的 DNS 加速器和广告过滤器。它旨在提供更快的 DNS 查询响应速度,并屏蔽广告和恶意网站
稍加配置 Overture 也可以解决 DNS 污染
overture仓库地址:
https://github.com/shawn1m/overture/releases由于 R2S 的 Armbian 自带DNS服务 systemd-resolved.service
,需要先将其禁用
systemctl stop systemd-resolved.service systemctl disable systemd-resolved.service
在禁用掉自带的DNS服务后,下载后(V1.8版本)到 /root/overture
中解压,目录输出如下:
$ tree . ├── config.yml ├── domain_alternative_sample ├── domain_primary_sample ├── domain_ttl_sample ├── hosts_sample ├── ip_network_alternative_sample ├── ip_network_primary_sample ├── overture-linux-arm64 └── overture-linux-arm64.zip 0 directories, 9 files
在运行 Overture 之前,先查找运营商指定的DNS服务地址
Bashcontent_copycat /etc/ppp/resolv.conf
服务商的DNS服务地址有CDN加速,公共DNS在访问时无法享受CDN加速
接着编辑:/root/overture/config.yml
YAMLcontent_copybindAddress: :53 debugHTTPAddress: :55555 dohEnabled: false primaryDNS: # 服务商的DNS服务地址,这里填的是 114.114.114.114 的公共DNS服务 - name: domestic_dns address: 114.114.114.114:53 protocol: udp socks5Address: timeout: 3 ednsClientSubnet: policy: disable externalIP: noCookie: true onlyPrimaryDNS: false alternativeDNS: # 国外DNS服务(在Gost中配置为Google) - name: foreign_dns address: 127.0.0.1:1080 # 此处UDP对应GOST中的`mode`参数值,可选`tcp`、`udp` protocol: udp socks5Address: timeout: 6 ednsClientSubnet: policy: disable externalIP: noCookie: true ipv6UseAlternativeDNS: false alternativeDNSConcurrent: false whenPrimaryDNSAnswerNoneUse: primaryDNS # 通过文件中的 IP 网络段来决定哪些 IP 地址的请求应该被定向到特定的 DNS 服务器 ipNetworkFile: # 符合 `china_ip_list.txt` 中的IP则优先使用 `primary` DNS服务的结果 primary: /root/china_ip_list.txt alternative: /root/overture/ip_network_alternative_sample # 通过文件中的域名决定哪些 IP 地址的请求应该被定向到特定的 DNS 服务器 domainFile: primary: /root/overture/domain_primary_sample # 符合 `gfw_all_domain.txt` 中的域名则优先使用 `alternative` DNS服务的结果 alternative: /root/gfw_all_domain.txt matcher: full-map hostsFile: hostsFile: /root/overture/hosts finder: full-map minimumTTL: 3600 domainTTLFile: /root/overture/domain_ttl_sample # 缓存的结果数量 cacheSize: 10240 cacheRedisUrl: cacheRedisConnectionPoolSize: rejectQType: - 255
配置中重要的部分已添加了注释,在配置中使用到的1个国内IP文件与国外GFW域名名单:
/root/china_ip_list.txt /root/gfw_all_domain.txt2个文件的来源:
国内IP段 国外域名由于这两个文件都是需要定期更新,所以写一个脚本来实现
编辑: /root/update_china_and_gfw.sh
Bashcontent_copy#/bin/bash #author:Chancel.Yang #date:2023/09/21 wget https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt 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 > temp_gfwlist.txt curl https://raw.githubusercontent.com/hq450/fancyss/master/rules/gfwlist.conf | sed 's/ipset=\/\.//g; s/\/gfwlist//g; /^server/d' > temp_koolshare.txt cat temp_gfwlist.txt temp_koolshare.txt | sort -u > gfw_all_domain.txt rm -f temp_gfwlist.txt temp_koolshare.txt
在 /root
下执行该脚本会产生 china_ip_list.txt
和 gfw_all_domain.txt
2个文件,如下:
$ tree -L 1 . ├── china_ip_list.txt ├── gfw_all_domain.txt ├── update_china_and_gfw.sh ├── iptables.sh └── overture 1 directory, 4 files
运行overture
Bashcontent_copyoverture-linux-arm64 -c config.yaml
使用 dig 程序来验证是否能够顺利进行DNS解析
Bashcontent_copy$ dig www.github.com @127.0.0.1 ; <<>> DiG 9.18.4 <<>> @127.0.0.1 www.github.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8772 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;www.github.com. IN A ;; ANSWER SECTION: www.github.com. 1552 IN CNAME github.com. github.com. 60 IN A 192.30.255.113 ;; Query time: 243 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP) ;; WHEN: Tue Jul 26 18:46:44 CST 2022 ;; MSG SIZE rcvd: 107
运行没有错误输出后,可以使用 supervisor 配置为后台进程
编辑:/etc/supervisor.d/overture.conf
TEXTcontent_copy[program:overture]
command=/root/overture/overture-linux-arm64 -c /root/overture/config.yaml
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=20MB
stdout_capture_maxbytes=1MB
user=root
更新supervisor运行,并检查状态
Bashcontent_copysupervisorctl update supervisorctl status
3.3. 网络分流(iptables)
在完成 gost 与 overture 设置后,需要将进入 R2S 的流量进行分流
分流规则为:
国内IP直连 国外IP转发编辑:/root/iptables.sh
Bashcontent_copy#/bin/bash #date:2023/09/21 /usr/sbin/ipset -N china hash:net # china_ip_list.txt文件在overture中已经下载 for i in $(cat /root/china_ip_list.txt ); do /usr/sbin/ipset -A china $i; done # 创建一个NAT规则集`SSNAT` /sbin/iptables -t nat -N SSNAT # 忽略国内IP /sbin/iptables -t nat -A SSNAT -p all -m set --match-set china dst -j RETURN # 忽略局域网IP /sbin/iptables -t nat -A SSNAT -d 0.0.0.0/8 -j RETURN /sbin/iptables -t nat -A SSNAT -d 10.0.0.0/8 -j RETURN /sbin/iptables -t nat -A SSNAT -d 127.0.0.0/8 -j RETURN /sbin/iptables -t nat -A SSNAT -d 169.254.0.0/16 -j RETURN /sbin/iptables -t nat -A SSNAT -d 172.16.0.0/12 -j RETURN /sbin/iptables -t nat -A SSNAT -d 192.168.0.0/16 -j RETURN /sbin/iptables -t nat -A SSNAT -d 224.0.0.0/4 -j RETURN # 将剩下IP段(国外)的流量全部转发到gost的透明代理网口1080中 /sbin/iptables -t nat -A SSNAT -p tcp -j REDIRECT --to-port 1080 # 最后将所有进入R2S的数据包转入`SSNAT`规则集合中 /sbin/iptables -t nat -A PREROUTING -p tcp -j SSNAT # 将出站数据包的源地址进行NAT避免被防火墙拦截 /sbin/iptables -t nat -I POSTROUTING -j MASQUERADE
请再次检查你的 /root
目录,文件应如下:
$ tree -L 1 . ├── update_china_and_gfw.sh ├── china_ip_list.txt ├── gfw_all_domain.txt ├── iptables.sh └── overture ├── gost 2 directory, 4 files
然后借助 crontab 设置脚本开机自动执行
Bashcontent_copycrontab -e
# 在crontab界面中添加开机运行iptables.sh脚本
...
@reboot /bin/sh /root/iptables.sh
设置完毕后,重启R2S
3.4. 网络测试
在重启后,打开R2S的SSH会话,查看iptables的nat表,参考如下:
Bashcontent_copy$ iptables -L -n -v -t nat Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 5371 341K SSNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 10260 1026K MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0 Chain SSNAT (1 references) pkts bytes target prot opt in out source destination 2530 171K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 match-set china dst 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/8 3 120 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 234 14040 RETURN all -- * * 0.0.0.0/0 192.168.0.0/16 0 0 RETURN all -- * * 0.0.0.0/0 224.0.0.0/4 2604 156K REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 redir ports 1080 0 0 REDIRECT udp -- * * 0.0.0.0/0 0.0.0.0/0 redir ports 1080 0 0 REDIRECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 redir ports 1080
再检查gost与overture的运行日志是否有异常
/var/log/supervisor/gost.log /var/log/supervisor/overture.log最后,使用任意连入 WI-FI 的任意设备访问下 google/bilibili 观察下国内外加载速度,验证是否成功分流
4. DHCP服务
如果路由器支持有线中继,那么也可以让 R2S 充当DHCP服务器,从而实现更强的控制效果,例如:
有线中继后,192.168.2.0/24段将舍弃,由 R2S 负责分配IP,动态分配192.168.1.128到192.168.1.255之间的IP给所有设备 IP段在192.168.1.128到192.168.1.255之间的IP则不经过透明代理 IP段在192.168.1.1到192.168.1.127之间的IP则经过透明代理4.1. 动态IP分配(isc-dhcp-server)
安装 DHCP 分配服务
Bashcontent_copyapt update apt install isc-dhcp-server
编辑:/etc/dhcp/dhcpd.conf
TEXTcontent_copy...
# 默认的租约时间12小时
default-lease-time 43200;
# 允许的最大租约时间7天
max-lease-time 604800;
...
# 局域网设备将自动分配 192.168.1.128 到 192.168.1.254 的IP段
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.128 192.168.1.254;
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
}
编辑:/etc/default/isc-dhcp-server
TEXTcontent_copy...
# 限定 DHCP 服务作用的接口为 `lan0`
INTERFACESv4="lan0"
启动和开机自启 isc-dhcp-server
服务
systemctl enable --now isc-dhcp-server
最后开启路由器的有线中继模式,开启成功后,可以在 R2S 中查看当前已分配的IP列表:
Bashcontent_copy$ dhcp-lease-list Reading leases from /var/lib/dhcp/dhcpd.leases MAC IP hostname valid until manufacturer =============================================================================================== 40:31:3c:d9:ef:65 192.168.11.171 chunmi-cooker- 2024-07-09 08:43:22 XIAOMI Electronics,CO.,LTD 64:82:14:b4:f6:6c 192.168.11.165 NarwalRobotics 2024-07-09 08:43:49 FN-LINK TECHNOLOGY Ltd. 78:8b:2a:9d:e9:a1 192.168.11.166 chuangmi.camer 2024-07-09 08:44:09 Zhen Shi Information Technology (Shanghai) Co., Ltd. 7c:c2:94:23:e0:5b 192.168.11.168 zhimi-airpurif 2024-07-09 08:40:16 Beijing Xiaomi Mobile Software Co., Ltd 94:f8:27:b0:63:b1 192.168.11.157 chuangmi_camer 2024-07-09 08:44:05 Shanghai Imilab Technology Co.Ltd cc:b5:d1:7c:26:cb 192.168.11.164 midjd6-fridge- 2024-07-09 08:42:18 Beijing Xiaomi Mobile Software Co., Ltd d4:f0:ea:69:a2:0c 192.168.11.167 philips-light- 2024-07-09 08:42:36 Beijing Xiaomi Mobile Software Co., Ltd d4:f0:ea:6a:ae:7d 192.168.11.160 yeelink-light- 2024-07-09 08:42:09 Beijing Xiaomi Mobile Software Co., Ltd d4:f0:ea:85:10:5a 192.168.11.162 yeelink-light- 2024-07-09 08:42:08 Beijing Xiaomi Mobile Software Co., Ltd d4:f0:ea:85:19:30 192.168.11.163 yeelink-light- 2024-07-09 08:42:13 Beijing Xiaomi Mobile Software Co., Ltd dc:ed:83:61:9b:fd 192.168.11.172 lumi-acpartner 2024-07-09 08:43:34 Beijing Xiaomi Mobile Software Co., Ltd dc:ed:83:ec:17:3c 192.168.11.170 lumi-acpartner 2024-07-09 08:43:52 Beijing Xiaomi Mobile Software Co., Ltd
如果分配IP出现问题,可以通过 journalctl
来查看 DHCP 服务日志排查问题:
journalctl -xeu isc-dhcp-server.service -f
4.2. 动态IP忽略透明代理(iptables)
在配置DHCP的IP分配后,局域网内的设备将默认被分配到 192.168.1.128 到 192.168.1.254 之间
结合之前 iptables 脚本就可以实现对动态IP不进行透明代理的效果
编辑:/root/iptables.sh
Bashcontent_copy#/bin/bash #date:2023/09/21 /usr/sbin/ipset -N china hash:net # china_ip_list.txt文件在overture中已经下载 for i in $(cat /root/china_ip_list.txt ); do /usr/sbin/ipset -A china $i; done # 创建一个NAT规则集`SSNAT` /sbin/iptables -t nat -N SSNAT # 国内IP /sbin/iptables -t nat -A SSNAT -p all -m set --match-set china dst -j RETURN # 忽略局域网IP /sbin/iptables -t nat -A SSNAT -d 0.0.0.0/8 -j RETURN /sbin/iptables -t nat -A SSNAT -d 10.0.0.0/8 -j RETURN /sbin/iptables -t nat -A SSNAT -d 127.0.0.0/8 -j RETURN /sbin/iptables -t nat -A SSNAT -d 169.254.0.0/16 -j RETURN /sbin/iptables -t nat -A SSNAT -d 172.16.0.0/12 -j RETURN /sbin/iptables -t nat -A SSNAT -d 192.168.0.0/16 -j RETURN /sbin/iptables -t nat -A SSNAT -d 224.0.0.0/4 -j RETURN # 忽略192.168.1.128到192.168.1.255之间的IP /sbin/iptables -t nat -A SSNAT -s 192.168.1.128/25 -j RETURN # 将剩下IP段(国外)的流量全部转发到gost的透明代理网口1080中 /sbin/iptables -t nat -A SSNAT -p tcp -j REDIRECT --to-port 1080 # 最后将所有进入R2S的数据包转入`SSNAT`规则集合中 /sbin/iptables -t nat -A PREROUTING -p tcp -j SSNAT # 将出站数据包的源地址进行NAT避免被防火墙拦截 /sbin/iptables -t nat -I POSTROUTING -j MASQUERADE
对于需要使用透明代理的设备,则可以通过 DHCP 服务来指定分配到 192.168.1.2 至 192.168.1.127 之间的IP,这些IP将被透明代理处理
编辑:/etc/dhcp/dhcpd.conf
TEXTcontent_copy...
# 默认的租约时间12小时
default-lease-time 43200;
# 允许的最大租约时间7天
max-lease-time 604800;
...
# 局域网设备将自动分配 192.168.1.128 到 192.168.1.254 的IP段
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.128 192.168.1.254;
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
# 固定某个设备的IP为192.168.1.2
host My-Windows-PC {
hardware ethernet 00:a0:ae:aa:a0:ac;
fixed-address 192.168.1.2;
}
}
在编辑成功后,如果发现网络有异常或者没有走透明代理,可以使用 watch 结合 iptables 来监控数据包走向来判断问题:
Bashcontent_copywatch -n 1 iptables -L -n -v -t nat
5. nftables(可选)
nftables 是一个用于 Linux 操作系统的网络包过滤和分类框架,旨在替代 iptables 及其相关的工具(如 ip6tables、arptables 和 ebtables)
由 Netfilter 项目开发,并在 Linux 内核 3.13 版本中引入,相较于 iptables 而言,对高并发、高流量的场景性能提升很大
在设备性能不佳的情况下,采用 nftables 来取代 iptables 提升性能可缓解性能上的问题,改写上面 iptables 的脚本如下:
Bashcontent_copy#!/bin/bash #date:2023/09/21 # 清除旧的 /usr/sbin/nftables 规则(如果有) /usr/sbin/nft flush ruleset # 创建一个新的 `nat` 表 /usr/sbin/nft add table ip nat # 创建 NAT 链 /usr/sbin/nft add chain ip nat SSNAT { type nat hook prerouting priority 0\; } /usr/sbin/nft add chain ip nat POSTROUTING { type nat hook postrouting priority 100\; policy accept\; } # 创建一个名为 `china` 的集合,添加 'flags interval' 以支持前缀 /usr/sbin/nft add set ip nat china { type ipv4_addr\; flags interval\; } # 创建一个临时文件 temp_file=$(mktemp) # 从文件中读取 IP 地址并添加到临时文件中 echo "add element ip nat china {" > $temp_file while read -r ip; do echo "$ip," >> $temp_file done < /root/china_ip_list.txt echo "}" >> $temp_file # 将临时文件中的内容导入到 /usr/sbin/nftables /usr/sbin/nft -f $temp_file # 删除临时文件 rm $temp_file # 符合国内IP列表的则直接转发出去 /usr/sbin/nft add rule ip nat SSNAT ip daddr @china return # 局域网以及一些常见网段也选择直接转发 /usr/sbin/nft add rule ip nat SSNAT ip daddr 0.0.0.0/8 return /usr/sbin/nft add rule ip nat SSNAT ip daddr 10.0.0.0/8 return /usr/sbin/nft add rule ip nat SSNAT ip daddr 127.0.0.0/8 return /usr/sbin/nft add rule ip nat SSNAT ip daddr 169.254.0.0/16 return /usr/sbin/nft add rule ip nat SSNAT ip daddr 172.16.0.0/12 return /usr/sbin/nft add rule ip nat SSNAT ip daddr 192.168.0.0/16 return /usr/sbin/nft add rule ip nat SSNAT ip daddr 224.0.0.0/4 return # 来源IP为192.168.11.100到192.168.11.254的IP也RETURN /usr/sbin/nft add rule ip nat SSNAT ip saddr 192.168.11.128/25 return # 不代理的特定IP /usr/sbin/nft add rule ip nat SSNAT ip daddr 103.99.178.98 return # 将剩下IP段(国外)的流量全部转发到gost的透明代理网口1080中 /usr/sbin/nft add rule ip nat SSNAT tcp dport "{ 1-65535 }" redirect to :1080 # 将出站数据包的源地址进行NAT避免被防火墙拦截 /usr/sbin/nft add rule ip nat POSTROUTING masquerade
将以上脚本取代 iptables.sh 文件,并设置开机执行
Bashcontent_copy... # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command @reboot /bin/bash /root/nftables.sh
重启后检查规则是否正确:
Bashcontent_copynft list ruleset
6. 尾语
以上内容较为复杂,还需耐心检查每一步的日志输出
文章来源:
Author:chancel
link:http://www.chancel.me/markdown/r2s-brush-into-armbian-guide