记一次iptables错误解决过程
一次使用代理抓包时,设置iptables重定向流量,结果报错unknown option "--dport",命令示例如下
iptables -t nat -I PREROUTING -p tcp -s 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8000
查了半天,大致是以下说法:
- 需要指定协议,如
-p tcp - 需要root权限
- 重装或者降版本
但是这些方法都没用,然后我发现我iptables版本后面有个nf_tables
$ iptables -V
iptables v1.8.7 (nf_tables)
经过查询,这个好像是兼容nftables的版本,nftables是用于取代iptables的东西?
实在查不到解决办法,就只能去看nft语法了,但是nft语法完全变了,一时半会没法上手。
最后还是继续搜iptables报错,不过每报错一个unknown option "xxxx" ,就吧xxxx给删掉再执行,如下
$ iptables -t nat -I PREROUTING -p tcp -s 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8000
iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
$ iptables -t nat -I PREROUTING -p tcp -s 127.0.0.1 -j REDIRECT --to-ports 8000
iptables v1.8.7 (nf_tables): unknown option "--to-ports"
Try `iptables -h' or 'iptables --help' for more information.
$ iptables -t nat -I PREROUTING -p tcp -s 127.0.0.1 -j REDIRECT
iptables v1.8.7 (nf_tables): Chain 'REDIRECT' does not exist
Try `iptables -h' or 'iptables --help' for more information.
最后一次报REDIRECT不存在,直接搜这个报错,终于找到了原因,直接切换iptables的版本就行
$ update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/sbin/iptables-nft 20 auto mode
1 /usr/sbin/iptables-legacy 10 manual mode
2 /usr/sbin/iptables-nft 20 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode
$ iptables -V
iptables v1.8.7 (legacy)
切换为legacy之后,运行之前的命令,但是还报错
$ iptables -t nat -I PREROUTING -p tcp -s 172.18.209.174 -j REDIRECT
iptables v1.8.7 (legacy): Couldn't load target `REDIRECT':No such file or directory
搜了一下,添加环境变量可以解决(参考2)
export XTABLES_LIBDIR=/lib/x86_64-linux-gnu/xtables/
这里要注意/lib/x86_64-linux-gnu/xtables/这个路径需要按实际情况填写,搜到的文章里面写的是/lib/xtables/,如果没有这个目录,就自己在/lib/里面搜xtables目录
最后可以正常执行iptables命令了