#!/bin/bash
IPT="/sbin/iptables"
对 IPTABLES 使用 drop all 策略
echo "Set default policy to 'DROP'"
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
尝试为包含域的所有子域的 OUTPUT 连接定义特定规则。原因是在多步骤协议中,服务器会收到可能未知子域的回调 URL。
这些幼稚的规则不起作用......
$IPT -A OUTPUT -p tcp -d "*.example.com" -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp -d "example.com" -m state --state NEW,ESTABLISHED -j ACCEPT
读了周围的内容后,我发现通配符不起作用,并且 IPTABLES 不是 DNS 解析器……!!哇!后一条规则不应该适用于所有端口和所有子域吗?
到目前为止,我唯一的解决方案是允许所有像这样的输出流量
$IPT -I OUTPUT -o eth0 -d 0.0.0.0/0 -j ACCEPT
$IPT -I INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
我在想也许使用这个“conntrack”规则会更合适?
#$IPT -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
我希望更加严格,如何为域及其子域创建特定规则/规则集?
答案1
不,iptables 不是完成这项任务的正确工具。
在 iptables 工作的层面上,主机名不适用。当您为“example.com”添加规则时,它会被解析为 IP 地址并以此方式存储。如果 example.com 的 DNS 发生变化,该规则将不再按预期工作。
如果您尝试限制与 DNS 名称的出站连接,则需要使用涉及解析 DNS 的某些东西。例如,要将域名列入黑名单,例如“coinhive.com”,我的/etc/hosts
文件中有以下内容:0.0.0.0 coinhive.com
。无论互联网上的 IP 地址指向哪个,这都可以阻止任何东西联系该域。
为了通过域名列入白名单,您可以在本地运行 DNS 解析器并仅提供您想要的条目而不转发未知的主机名。
我确信还有其他一些方法可以实现这一点,但 iptables 不是其中之一。