为什么第一条规则在iptables中没有被匹配

我有iptables规则,我希望从2 ips允许ssh。

为什么柜台增加了第二条规则,而不是第一条规则。

即使我尝试从两个IP我不能ssh到它。

Chain INPUT (policy ACCEPT 87 packets, 6188 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT tcp -- * * !115.xx71 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable 14 1400 REJECT tcp -- * * !115.xx176 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable 

是不是像当我从115.xx71 ssh s匹配第一条规则,我应该得到的访问,它不会匹配秒,即使我从115.xx176 ssh它是违反第一条规则,它会被拒绝,但我不能从第一个ip甚至ssh。

这将永远不会工作!

原因:

  1. 如果你从.71连接,第二个规则将拒绝你的连接
  2. 如果您从任何地方连接,第一条规则将拒绝您的连接

对此的共鸣是因为如果规则不匹配在iptables它将继续到下一个规则。

您必须允许.71和.176之间的连接,然后拒绝所有其他连接。

为什么柜台不按第一条规则增加:我不知道。

编辑澄清事情有点:

iptables检查规则。 如果一个规则与目前的结果相匹配, 因此,对于你的规则, iptables将执行以下操作:

  1. 如果你从.71连接
    • 第一条规则不匹配(因为src!xxx71不匹配)
    • 第二条规则拒绝请求(因为src!xxx176匹配),结果应该是REJECT
  2. 如果你从其他地方连接(例如xxx176)
    • 第一条规则匹配(因为src!xxx71匹配),因此连接被拒绝。

因此,为了满足您的要求,您必须首先接受来自.71和.176的连接,然后拒绝所有其他连接。

请阅读有关iptables一些教程,了解它是如何工作的,也可以从dmourati看一个运行示例的答案 。

 iptables -A INPUT -p tcp --dport 22 -s IP-ADDR-1 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -s IP-ADDR-2 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j REJECT