我正在尝试配置一条 iptables 规则,该规则查找匹配的 IP 并删除它在一行代码中找到的尽可能多的实例。我有该命令,它在具有路径变量的传统 shell 环境中工作。
这个脚本在没有 shell 终端的情况下运行,它是 openvpn 客户端断开连接脚本的一部分。我有一个可行的解决方案,使用以下命令来优化 --line-number,反向排序,然后循环删除每一行。问题是 IPtables 规则的动态特性可能导致意外删除错误的行。
工作:sudo -tt /sbin/iptables -t mangle -w -n -L --line-numbers | grep -w“$ifconfig_pool_remote_ip”| awk'{print $1}'| sort -nr
for i in $IPTABLES_RULEID ; do
echo "================= Removing IPv4 Mangle Rule ID $i ===================="
sudo -tt /sbin/iptables -w -t mangle -D PREROUTING $i
done
以下是我尝试替换的内容:
sudo -tt /sbin/iptables -t mangle -S PREROUTING | /usr/bin/grep -w "$ifconfig_pool_remote_ip" | sed 's/^-A //g' | /usr/bin/xargs -rL1 /sbin/iptables -t mangle -D
该错误表明它没有解析所有命令行选项
1 月 5 日 00:55:10 vpn1-udp-de openvpn[1240]: iptables v1.8.4 (nf_tables): 无法加载匹配set':No such file or directory Jan 5 00:55:10 vpn1-udp-de openvpn[1240]: Try
iptables -h' 或 'iptables --help' 以获取更多信息。 1 月 5 日 00:55:10 vpn1-udp-de openvpn[1240]: iptables v1.8.4 (nf_tables): 未知选项“--on-port” 1 月 5 日 00:55:10 vpn1-udp-de openvpn[1240]: 请尝试“iptables -h”或“iptables --help”以获取更多信息。
參考文獻:
/sbin/iptables -t mangle -S PREROUTING | grep -w 10.13.0.6
-A PREROUTING -s 10.13.0.6/32 -p udp -m set --match-set portsudp dst -j TPROXY --on-port 41201 --on-ip 127.0.0.1 --tproxy-mark 0x1/0x1
-A PREROUTING -s 10.13.0.6/32 -p tcp -j TPROXY --on-port 41201 --on-ip 127.0.0.1 --tproxy-mark 0x1/0x1
答案1
我想知道这样的东西是否会更好
sudo /sbin/iptables -t mangle -S PREROUTING |
/usr/bin/grep -w "$ifconfig_pool_remote_ip" |
sed 's/^-A /iptables -t mangle -D /g' |
sudo /bin/sh -ex
# the -x is just there to echo the commands for debugging.
答案2
不要为此使用 xargs。获取脚本的输出并将其视为标准输入iptables-apply
。您可以使用即时 BASH 文件描述符来执行此操作,例如:
iptables-apply <(myscript.sh)
或者,我猜,更传统的方法:
myscript.sh | iptables-apply
请注意,两者之间没有空格<
,(
否则此方法无效。只要 myscript.sh 输出的格式与 iptables save 给出的格式类似,此方法就有效,并且根本不需要 xargs。