Firxiao

记录些有用的东西

nftable透明代理折腾记

03 Apr 2022 » OpenWrt, nftable, dnsmasq
注意: OpenWrt 新版已经使用最新版 dnsmasq, 请参考 nftable透明代理折腾记后续

最近路由器很不稳定, 老是无缘无故没网, 是时候折腾一下了.

之前版本用的20.02, 最新版本是20.02.2.

imagebuilder打包后安装一切顺利.

只是之前 dnsmasq+ipset+iptables组合用不了了.

在新版本中nftable替代了iptable, 折腾了一天, 顺便学习下nftable.

dnsmasq目前稳定版本并不支持nftableset,

目前测试版已经开始支持, 喜欢尝鲜的可以自己编译试试看.

nftable讨论

测试版

更新记录

本文主要记录下在官方版本没支持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

参考: