注意: OpenWrt 新版已经使用最新版 dnsmasq, 请参考 nftable透明代理折腾记后续
最近路由器很不稳定, 老是无缘无故没网, 是时候折腾一下了.
之前版本用的20.02, 最新版本是20.02.2.
用imagebuilder打包后安装一切顺利.
只是之前 dnsmasq+ipset+iptables组合用不了了.
在新版本中nftable替代了iptable, 折腾了一天, 顺便学习下nftable.
dnsmasq目前稳定版本并不支持nftable的set,
目前测试版已经开始支持, 喜欢尝鲜的可以自己编译试试看.
本文主要记录下在官方版本没支持nftable set的情况下, 用一些简单的手段先凑合用着.
#!/bin/bash
ipset_gfwlist=/etc/shadowsocks-libev/ipset_gfwlist
local_gfwlist=/etc/shadowsocks-libev/local_gfwlist
nft_gfwlist=/etc/shadowsocks-libev/nft_gfwlist
ssrules_nft="/etc/nftables.d/99-ss-rules.nft"
ipset list gfwlist|grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' > $ipset_gfwlist
cat $ssrules_nft|grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' > $local_gfwlist
cat $local_gfwlist $ipset_gfwlist | sort -n|uniq -c|awk '{print $2}' > $nft_gfwlist
gfwlist=$(cat $nft_gfwlist|sort -n|uniq -c|awk '{print $2}'|sed ':label;N;s/\n/, /;b label'|sed 's/$/& }/g'|sed 's/^/{ &/g')
echo """
set gfwlist {
type ipv4_addr
size 65536
counter
elements = $gfwlist
}
chain prerouting {
type nat hook prerouting priority -100;
ip daddr @gfwlist ip protocol tcp counter redirect to 1081
}
""" > $ssrules_nft
fw4 reload
设置个cron job 每5分钟跑一次
*/5 * * * * /etc/shadowsocks-libev/nft_update.sh
另外记录下nftable常用命令
nft list set inet fw4 gfwlist
nft list chain inet fw4 prerouting
参考: