当前位置: 首页 > 工具软件 > ebtables > 使用案例 >

Ubuntu 21.10 ebtables一个大坑:操作 broute 表报错: No chain/target/match by that name

程鸿畅
2023-12-01

背景

前一阵子研究透明代理这块,需要添加如下一条 ebtables 规则:

ebtables -t broute -A BROUTING -i ens37 -p ipv4 --ip-proto tcp --ip-dport 80 -j redirect --redirect-target DROP

结果在 Ubuntu 21.10【使用我自己编译的内核】 上执行却报错:

ebtables -t broute -A BROUTING -i ens37 -p ipv4 --ip-proto tcp --ip-dport 80 -j redirect --redirect-target DROP
ebtables: No chain/target/match by that name

郁闷。。。第一反应碰到这个问题,我的思路是确认这个命令参数有没有问题,因为我用的是最新的发行版,谁知道参数有没有改。花了一些时间确认这个命令是没有问题的。

第二个思路就是要编译 ebtables 。因为记得之前很早遇到过 iptables 报个这个问题,记得当时重新编译了 iptables 才把问题解决【因为内核是我自己编译的】。二话不说,从官网撸一份 ebtables 代码,直接来编译,结果编译出来的 ebtables 居然直接 coredump!!

root@ubuntu21:~/ebtables# ./ebtables
Segmentation fault (core dumped)

我还花了些时间确认为什么会发生 coredump。因为 ebtables 是要依赖内核一些数据结构定义的,就是在源码 include/linux 目录下的这些:

root@ubuntu21:~/ebtables# ls -lh include/
total 36K
-rw-r--r-- 1 root root 8.8K Apr  6 11:27 ebtables.h
-rw-r--r-- 1 root root  13K Apr  6 11:27 ebtables_u.h
-rw-r--r-- 1 root root 2.1K Apr  6 11:27 ethernetdb.h
drwxr-xr-x 3 root root 4.0K Apr 15 17:26 linux

折腾多次,我发现这些数据结构没问题,和我的 5.16 内核版本里是一样的,说明它这个代码写得有问题!!!算了,放弃这条路了,这个代码也没有人维护,说明就可能就是有问题的。

下一步再查资料,发现 ebtables 已经包含在 iptables 源码里了,于是直接撸个 iptables-1.8.7 代码,本地编译,编译安装后,/usr/local/sbin 目录多了这些东西:

root@ubuntu21:~/iptables-1.8.7# ls /usr/local/sbin/   
arptables              ebtables-restore          ip6tables-restore            iptables-nft-restore
arptables-nft          ebtables-save             ip6tables-restore-translate  iptables-nft-save
arptables-nft-restore  ip6tables                 ip6tables-save               iptables-restore
arptables-nft-save     ip6tables-apply           ip6tables-translate          iptables-restore-translate
arptables-restore      ip6tables-legacy          iptables                     iptables-save
arptables-save         ip6tables-legacy-restore  iptables-apply               iptables-translate
ebtables               ip6tables-legacy-save     iptables-legacy              unminimize
ebtables-nft           ip6tables-nft             iptables-legacy-restore      xtables-legacy-multi
ebtables-nft-restore   ip6tables-nft-restore     iptables-legacy-save         xtables-monitor
ebtables-nft-save      ip6tables-nft-save        iptables-nft                 xtables-nft-multi

无奈编译后的 ebtables 执行这个命令还是报这个错!问题没有解决!

到这里,我开始怀疑我编译的内核有问题,于是检查 ebtables 这些内核模块是否编译出来了,还手动把这些模块都加载了,但还是不行!

都快没办法了,无意中再随便敲敲 ebtables 命令:

root@ubuntu21:~/iptables-1.8.7# ebtables -t broute -L
ebtables v1.8.7 (nf_tables): table `broute' is incompatible, use 'nft' tool.

无语!!!这条命令提示 broute 表这个命令不兼容!以此为线索我查找到了这个回答,按这个回答进行下面的操作,结果报错:

root@ubuntu21:~# update-alternatives --set ebtables /usr/sbin/ebtables-legacy
update-alternatives: error: alternative /usr/sbin/ebtables-legacy for ebtables not registered; not setting

也就是没有 /usr/sbin/ebtables-legacy 这个程序!

我靠,编译出来的 iptables 都没有这个东西,那怎么办?那只有卸载再重装了!

解决方案

卸载重装后有了这个 ebtables-legacy 程序:

apt-get remove ebtables
apt-get install ebtables
update-alternatives --set ebtables /usr/sbin/ebtables-legacy

最后命令执行成功:

root@ubuntu21:~# ebtables -t broute -A BROUTING -i ens37 -p ipv4 --ip-proto tcp --ip-dport 80 -j redirect --redirect-target DROP
root@ubuntu21:~# ebtables -t broute -L
Bridge table: broute

Bridge chain: BROUTING, entries: 5, policy: ACCEPT
-p IPv4 -i ens37 --ip-proto tcp --ip-dport 80 -j redirect  --redirect-target DROP

总结

TMD 这个 ebtables 太坑了,这个破问题花了我一两天时间,就是因为它的破错误提示,!!!如果我执行那个命令时它也提示 table `broute’ is incompatible, use ‘nft’ tool. 那我也许很快就解决了,写代码的太坑了!!!

把这个问题记录下来,避免后人踩坑,帮大家节约时间。

 类似资料: