我正在尝试编写一个适用于基于变量的多个接口的 iptables 规则。哪条规则更有效/更快?有没有更好的方法用最少的代码编写这个规则?
#Variable
Ext_INTF="eth0 usb0 tun0 tun1"
1)
for i in $Ext_INTF;
do
iptables -A FORWARD -i $i -j DROP
done
2)
iptables -A FORWARD -i $Ext_INTF -j DROP
答案1
方法 2 不起作用 — 它会产生无效的iptables
调用。无论您认为它会做什么,它都只会添加一个 iptables 规则,并且您无法在单个规则中匹配任意一组接口。方法1是正常的方法,而且几乎是唯一的方法。
设置 iptables 规则的效率并不是一个问题。你必须非常努力地去做一些明显不是最佳的事情。这里的关注点是使规则正确,可能是规则本身的效率,并保持脚本的可读性以便于维护。
写入$Ext_INTF
(双引号外的变量替换)将变量的值拆分为空格分隔的部分,然后将每个部分扩展为匹配文件名的通配符模式。这里的变量不包含任何通配符 ( \[*?
)。因此for i in $Ext_INTF; …
循环遍历变量值中的单词。一般来说,您应该只在双引号内使用变量替换, 因为$Ext_INTF
表示仅在双引号内的“值Ext_INTF
”,但这里您希望进行拆分,并且这些部分不包含任何 shell 通配符。
Ext_INTF="eth0 usb0 tun0 tun1"
for i in $Ext_INTF; do
iptables -A FORWARD -i "$i" -j DROP
done
在 bash 和 ksh 中,但不能在普通 sh 中,您可以使用数组而不是字符串变量。 (在 zsh 中,您必须使用数组或显式请求使用 进行拆分$=Ext_INTF
。)您必须再输入一些字符,但这会使意图更清晰,并允许元素在需要时包含空格和通配符。
Ext_INTF=(eth0 usb0 tun0 tun1)
for i in "${Ext_INTF[@]}"; do
iptables -A FORWARD -i "$i" -j DROP
done