假设我们需要 iptables 中的一些 ssh 规则。但我们还想为所有规则指定另一个链。我们可以使用这样的东西:
iptables -t filter -N ssh
iptables -t filter -N tcp
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j tcp
iptables -t filter -A tcp -p tcp --dport 22 -m conntrack --ctstate NEW -j ssh
iptables -t filter -A ssh -p tcp --dport 22 -m conntrack --ctstate NEW -s 10.10.10.10/32 -m mac --mac-source 10:10:10:10:10:10 -j ACCEPT
iptables -t filter -A ssh -p tcp --dport 22 -m conntrack --ctstate NEW -s 11.11.11.11/32 -m mac --mac-source 11:11:11:11:11:11 -j ACCEPT
我们是否必须在每个规则中指定所有选项,或者可以在较低的链中省略吗?例如,最终的 ssh 规则可能如下所示:
iptables -t filter -A ssh -s 10.10.10.10/32 -m mac --mac-source 10:10:10:10:10:10 -j ACCEPT
iptables -t filter -A ssh -s 11.11.11.11/32 -m mac --mac-source 11:11:11:11:11:11 -j ACCEPT
答案1
如果你想避免这种情况,那么你需要一个新的链:
iptables -N sshgroup1
# or reset with iptables -F sshgroup1 if it already exists
iptables -t filter -A ssh -s 10.10.10.10/32 -m mac \
--mac-source 10:10:10:10:10:10 -j sshgroup1
iptables -t filter -A sshgroup1 ... -j ACCEPT
iptables -t filter -A sshgroup1 ... -j ACCEPT
答案2
如果您只想允许 LAN 中的两台主机进行 ssh 连接,那么您应该将此规则保留在顶部,以使 iptables 运行得更快。
iptables -I INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -s 10.10.10.10/32 -m mac --mac-source 10:10:10:10:10:10 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -s 11.11.11.11/32 -m mac --mac-source 11:11:11:11:11:11 -j ACCEPT
否则,根据您的网络、策略和流量,有很多组合。
经验法则是:尽量避免重复规则,并最小化匹配级别以获得更快的性能。