我有一台 centos 机器,希望只允许到某些远程机器的端口 587 的出站连接,并丢弃尝试连接所有其他主机的数据包。
如果他们要访问 gmail 的 SMTP 服务器(所有 IP 都在后面smtp.gmail.com
),我只想允许在端口 587 上进行访问。有什么方法可以实现吗?
答案1
您可以使用-d
iptables 规则开关,使规则仅适用于提供的地址,然后阻止其他所有内容,例如
iptables -I OUTPUT -p tcp --dport 587 -j DROP
iptables -I OUTPUT -d smtp.gmail.com -p tcp -m tcp --dport 587 -j ACCEPT
应该可以满足您的要求。这首先会在 OUTPUT 链的开头插入一条 DROP all outgoing connections on port 587 规则。然后,它会在 OUTPUT 链的开头插入一条允许 smtp.gmail.com 端口 587 的规则。这可以允许连接到 smtp.gmail.com:587 并阻止端口 587 上的所有其他内容,例如
iptables -L OUTPUT -n
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 173.194.66.109 tcp dpt:587
ACCEPT tcp -- 0.0.0.0/0 173.194.66.108 tcp dpt:587
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:587
请注意,smtp.gmail.com 解析为两个 IP 地址,这就是上面有两个 ACCEPT 规则的原因。规则添加到内核时,名称仅解析一次,因此如果地址发生变化,则与 gmail 的连接也将被阻止,您需要重新加载规则。
答案2
答案3
我建议将这整个过程自动化,这样你就不必继续担心它了。
它iptables -I OUTPUT -p tcp --dport 587 -j DROP
应该包含在您的基本系统配置中,该配置可能位于您机器上的 /etc/sysconfig/iptables 中。
将此脚本放入编辑器并保存到某个位置,然后使用 chmod 将其标记为可执行。作为示例,我将其放在 /opt/sysadminscripts/iptables.smtp.gmail.sh 中
/bin/bash #!/bin/bash IPLIST=$(主机 smtp.gmail.com | grep'有地址'| awk'{打印 $4}') 对于 $IPLIST 中的 x 做 $(iptables -L -nv | grep“$x”>> /dev/null) 如果 [[ “$?” -ne '0' ]]; 那么 $(iptables -I OUTPUT -p tcp -m tcp -d“$x”--dport 587 -j 接受) 菲 完毕
然后在系统 crontab 中添加类似这样的条目:
*/10 * * * * 根/opt/sysadminscripts/iptables.smtp.gmail.sh
确保该行不是 /etc/crontab 中的最后一行。如果该行没有终止换行符,它将不会运行。(我建议将注释保留为 /etc/crontab 的最后一行。)
答案4
你需要制定如下规则:
iptables -A FORWARD -p tcp -d smtp.gmail.com --dport 587 -j ACCEPT
iptables -A FORWARD -p tcp --dport 587 -j DROP
问题是您需要找到可能的 IP smtp.gmail.com
。不建议在 iptables 中使用该名称。这是因为 iptables 不会识别 IP 名称映射更改。您可能需要不断检查 IP 更改并相应地更新规则。
FORWARD
您需要根据要控制的流量在上面的示例中选择正确的链。