我正在运行Debian 8.11
和iptables v1.4.21
。ipset v6.23, protocol version: 6
我试图阻止除一小部分主机之外的所有主机访问某些端口,但它似乎不起作用。
首先,我将一小部分 IP 地址放入ipset
名为 的列表中allowed-hosts
。然后,在运行sudo /sbin/iptables -F
和后sudo /sbin/iptables -X
,我发出以下命令:
sudo /sbin/iptables -I INPUT -p tcp -m multiport --destination-port 110,143,993,995 -j DROP
sudo /sbin/iptables -I INPUT -p tcp -m multiport --destination-port 110,143,993,995 -m set --match-set allowed-hosts src -j ACCEPT
但是,即使执行此操作后,来自不存在的 IP 地址的客户端allowed-hosts
仍然可以成功连接到所有指定端口。
没有其他iptables
有效的规则。
sudo /sbin/iptables -L
以下是...的结果
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere multiport dports pop3,imap2,imaps,pop3s match-set allowed-hosts src
DROP tcp -- anywhere anywhere multiport dports pop3,imap2,imaps,pop3s
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
sudo /sbin/iptables-save
这是......的结果
# Generated by iptables-save v1.4.21 on Wed Jun 8 11:53:09 2022
*security
:INPUT ACCEPT [16777464:2727427757]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [18889599:33356814491]
COMMIT
# Completed on Wed Jun 8 11:53:09 2022
# Generated by iptables-save v1.4.21 on Wed Jun 8 11:53:09 2022
*raw
:PREROUTING ACCEPT [21444955:3000669583]
:OUTPUT ACCEPT [18889599:33356814491]
COMMIT
# Completed on Wed Jun 8 11:53:09 2022
# Generated by iptables-save v1.4.21 on Wed Jun 8 11:53:09 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Wed Jun 8 11:53:09 2022
# Generated by iptables-save v1.4.21 on Wed Jun 8 11:53:09 2022
*mangle
:PREROUTING ACCEPT [21444955:3000669583]
:INPUT ACCEPT [21444952:3000669415]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [18889599:33356814491]
:POSTROUTING ACCEPT [18889599:33356814491]
COMMIT
# Completed on Wed Jun 8 11:53:09 2022
# Generated by iptables-save v1.4.21 on Wed Jun 8 11:53:09 2022
*filter
:INPUT ACCEPT [2130649:527089827]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4465281:1887206637]
-A INPUT -p tcp -m multiport --dports 110,143,993,995 -m set --match-set allowed-hosts src -j ACCEPT
-A INPUT -p tcp -m multiport --dports 110,143,993,995 -j DROP
COMMIT
# Completed on Wed Jun 8 11:53:09 2022
我可能做错了什么?
先感谢您。
**更新**
首先,确实指定了“src”,这与下面评论中的建议相反。它出现在上面的“... src -j ACCEPT”行中。
其次,我使用的这些命令的语法iptables
来自文档iptables
和通过网络搜索找到的讨论中显示的内容。
第三,看上面的iptables -L
输出。这清楚地表明,对于列表中的 IP 地址,应接受从source=anywhere
到到端口的连接。这也清楚地表明,对于以下 IP 地址,应将与端口的连接从删除:destination=anywhere
allowed-hosts
source=anywhere
destination=anywhere
不是在allowed-hosts
列表中。
至少这似乎iptables
是在告诉我。但是,allowed-hosts
我的计算机仍然接受来自不在列表中的 IP 地址到这些端口的连接。
另外,如果我这样做ipset test allowed-hosts aaa.bbb.ccc.ddd
,其中“aaa.bbb.ccc.ddd”代表一个IP地址,即不是在 中allowed-hosts
,我正确地得到以下输出:
aaa.bbb.ccc.ddd is NOT in set allowed-hosts.
如果我这样做ipset test allowed-hosts www.xxx.yyy.zzz
,其中“www.xxx.yyy.zzz”代表一个IP地址是在 中allowed-hosts
,我正确地得到以下输出:
www.xxx.yyy.zzz is in set allowed-hosts.
查看上面的输出iptables-save
,我的配置中还有什么可能导致这些端口连接不被allowed-hosts
接受?
再次感谢您,提前。
答案1
事实证明,这毕竟是有效的。对于这次误报,我感到非常非常抱歉。
我错误地认为它由于以下原因无法正常工作......
我正在使用postfix
和dovecot
,并且我已设置postfix
用于dovecot
执行其身份验证服务。
我已设置dovecot
将其调试和日志消息写入名为 的文件/var/log/mailclient.log
,同时postfix
配置为通过 进行日志记录syslog
。
我没有考虑清楚,并且忘记了这样一个事实,即postfix
的身份验证尝试也会导致条目出现在同一个dovecot
日志文件中,因为这dovecot
是执行此身份验证的文件postfix
。
我仅使用我的iptables
规则来阻止pop3
和imap
(端口 110、143、993 和 995),并且我不阻止postfix
的端口。
鉴于我设置身份验证的方式postfix
,该文件中/var/log/mailclient.log
包含所有postfix
登录尝试以及dovecot
登录尝试的条目。当我阅读此日志文件中的这些条目时,我没有很好地注意,并且我错误地认为它们是 和 的登录尝试pop3
,imap
而不是smtp
登录尝试。因此,我将这些smtp
登录尝试(我没有阻止)误认为是pop3
和imap
登录尝试。
一旦我理解了我的错误,我就更仔细地检查和分析了我的dovecot
日志文件,现在我意识到,实际上,除了那些源自我放入我的主机的小子集的主机之外,没有pop3
任何连接都不会到达dovecot。 imap
“允许的主机”ipset
列表。
因此,iptables
我上面列出的条目是毕竟确实工作正常。
我再次为我的误报道歉,我很高兴这能奏效。
也许这个问题和讨论可以帮助将来可能犯与我相同错误的人。