第一次向 ServerFault 发帖,我会尽力做好 :)
我有多个环境(例如 prod、dev、test 等),并且我正在尝试为我的 RHEL 6.6 服务器编写 IPTables 文件,以允许特定的机器组在定义的端口上在这些环境之间进行通信。
最初,在自己的线路上为每个不同的目标或源子网定义规则是可行的 - 但是生成的 iptables 文件非常大。为了简化/清理规则集,我尝试使用相同的端口合并多个源或目标 IP 的规则。
我找到了一篇关于这个主题的 ServerFault 文章IPTables 多个源 IP但评价最高的例子似乎对我来说不起作用。
例如,尝试结合以下两个规则:
-A INPUT -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV1 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Source 1"
-A INPUT -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV2 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Source 2"
变成这样:
-A INPUT -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV1,$CV2 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Not Working!"
我也有混合多个源 IP 和多个目标 IP 的规则(同样没有成功):
-A INPUT -i $INTERFACE -s $FOO1,$FOO2 -d $FOO1,$FOO2 -p tcp --dport 8400:8403 -j ACCEPT
-A OUTPUT -o $INTERFACE -s $FOO1,$FOO2 -d $FOO1,$FOO2 -p tcp --dport 8400:8403 -j ACCEPT
注意:/etc/sysconfig/iptables 文件由我的自定义配置脚本编写(因此有 $ 变量),其中 IP 定义如下:
CV1=10.1.1.0/27
CV2=10.25.128.128/29
FOO1=10.1.30.140/30
FOO2=10.2.30.140/30
流量故障由 IPTables 文件底部的拒绝/日志规则捕获:
-A INPUT -i $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Rejected. "
-A FORWARD -i $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Forward Rejected. "
-A OUTPUT -o $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Dropped. "
-A INPUT -i $INTERFACE -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i $INTERFACE -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -o $INTERFACE -j REJECT --reject-with icmp-host-prohibited
参照 IPTables 手册页条目,它看起来应该可以工作:
[!] -s,--源地址[/掩码][,...]
源指定。地址可以是网络名称、主机名、网络 IP 地址(带 /mask)或纯 IP 地址。在将规则提交给内核之前,主机名只会解析一次。请注意,使用远程查询(如 DNS)指定要解析的任何名称都是一个非常糟糕的想法。掩码可以是网络掩码或纯数字,指定网络掩码左侧 1 的数量。因此,掩码 24 相当于 255.255.255.0。地址指定前的“!”参数会反转地址的含义。标志 --src 是此选项的别名。
可以指定多个地址,但这将扩展到多个规则(使用 -A 添加时),或者导致多个规则被删除(使用 -D)。[!] -d, --目标地址[/掩码][,...]
目标指定。有关语法的详细说明,请参阅 -s(源)标志的说明。标志 --dst 是此选项的别名。
有人能告诉我我在这里做错了什么吗?
答案1
我将您的第一个组合 iptables 规则复制到我的 Ubuntu 机器中并且它对我有效:
iptables -A INPUT -i wlan0 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s 172.16.10.0/24,172.16.9.0/24 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Working! :)"
我没有收到该命令后的输出,这表示成功。我还成功运行了您的多源目标命令:
iptables -A INPUT -i wlan0 -s 172.16.10.0/24,172.16.9.0/24 -d 172.16.10.0/24,172.16.9.0/24 -p tcp --dport 8400:8403 -j ACCEPT
我对您的命令所做的唯一更改是针对接口和源网络,因为我没有使用脚本来测试您的命令。
您在问题中发布了网络变量,但没有发布 $INTERFACE 变量。脚本中缺少该变量吗?或者如果此脚本与声明变量的脚本分开,则可能无法访问?
当您使用组合的源/目标规则运行 iptables 脚本时,输出是什么?