如何允许特定 IP 地址访问 iptables 中的 dport?例如:我有2个客户端,第一个客户端的IP地址是182.3.3.1,第二个客户端的IP地址是202.4.5.6,我有一个端口,比如说2222。我想要的是,只有这些IP地址可以访问端口2222。
我写了这个规则:
iptables -A INPUT -p tcp ! -s 182.3.3.1 --dport 2222 -j REJECT
iptables -A INPUT -p tcp ! -s 202.4.5.6 --dport 2222 -j REJECT
发生的情况是只有 1 个地址可以访问,另一个地址被阻止。怎么了 ?
答案1
iptables 处理规则的方式是:抓取一个数据包并尝试将其与规则集进行匹配,从上到下。如果规则匹配,则执行它并停止进一步处理(特殊情况除外,例如目标是另一个链、LOG、RETURN 等)。
每个链还有一个默认策略(默认情况下为接受),这就是不匹配任何规则的数据包所发生的情况。
现在,如果你有两条这样的规则:
iptables -A INPUT -p tcp ! -s 182.3.3.1 --dport 2222 -j REJECT
iptables -A INPUT -p tcp ! -s 202.4.5.6 --dport 2222 -j REJECT
如果您从 IP 182.3.3.1 访问,则第一个规则匹配并应用(不执行任何操作,并且该规则由链 DEFAULT Policy 处理,我认为是 ACCEPT)。在第二种情况下,如果 IP 是 202.4.5.6,则第一个规则也匹配并应用(通过拒绝访问)。
您可能想要的是这样的(不要只是在您的系统上输入这些规则,否则您会将自己锁在门外!):
iptables -P DROP INPUT # Changes the INPUT Chain default policy to DROP
iptables -A INPUT -p tcp -s 182.3.3.1 --dport 2222 -j ACCEPT # Allows the access of IP 182.3.3.1
iptables -A INPUT -p tcp -s 202.4.5.6 --dport 2222 -j ACCEPT # Allows the access of IP 202.4.5.6
请了解,通过使用这些规则,您需要更新规则集以允许访问其他服务(例如允许您自己访问服务器上的 SSH 和其他服务,因此建议您不要将自己锁定在服务器之外)。