我有一台带有两个网卡的 Linux 机器(交钥匙核心 14.2)。
eth0
是一个公共 IP,WAN(我们称之为123.123.123.123
)。
eth1
是我的网络,LAN。
我想SSH
通过 WAN进行阻止iptables
。
我使用命令
sudo iptables -A INPUT -p tcp -s 123.123.123.123 --dport 22 -j DROP
如果我然后写
sudo iptables -L
我得到了答案
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 123.123.123.123 anywhere tcp dpt:ssh
PuTTY
问题是,如果我用来连接 123.123.123.123,我不会被阻止。
知道我做错了什么吗?
答案1
-s
您按源地址(选项)而不是目标地址(选项)匹配流量-d
,这就是您的规则不会丢弃来自其他主机的任何流量的原因。
您还可以通过输入接口(而不是地址)与-i
选项进行匹配。例如,丢弃所有传入端口的流量22 号为了以太网0:
iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
答案2
正如 @sebasth 回答的那样,因为您想要阻止尝试连接到您的公共 IP 的流量,123.123.123.123
所以将是以下架构:
source `INTERNET`
destination `123.123.123.123`
所以你可以将-s
(源)更改为-d
(目标)
关于您的iptables
行,我建议使用-I
(插入)而不是-A
(附加)添加它,因为如果您出于任何原因有一条接受所有传入流量的旧规则port 22
,那么-A
将在您的行的最后添加该规则iptables
并且它将采取它找到的第一条规则。
iptables -I INPUT -p tcp -d 123.123.123.123/32 --dport 22 -j DROP
从man iptables
-A, --append chain 规则规范 将一个或多个规则附加到所选链的末尾。当源名称和/或目标名称解析为多个地址时,将为每个可能的地址组合添加一条规则。
-I, --insert chain [rulenum] 规则规范 在所选链中插入一个或多个规则作为给定的规则编号。因此,如果规则编号为 1,则将一条或多条规则插入到链的头部。如果未指定规则编号,这也是默认值。