如何绕过 iptables 中的默认丢弃策略?

如何绕过 iptables 中的默认丢弃策略?

我是新手iptables,我需要阻止除特定 IP 之外的所有 HTTP/HTTPS 流量(我使用以下 IP example.com)。

iptables -A INPUT -p tcp -s 93.184.216.34 --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d 93.184.216.34 --sport 443 -j ACCEPT
iptables -A INPUT -p tcp -s 93.184.216.34 --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d 93.184.216.34 --sport 80 -j ACCEPT

对于 DNS 解析,我还有:

iptables -A INPUT -p udp -s 192.168.1.253 --dport 53 -j ACCEPT

但是,每次我将默认策略设置为DROPiptables -P INPUT DROP等)时,尽管我设置了规则,我还是无法访问 IP。我尝试过使用,-m state --state NEW,ESTABLISHED但没有成功。我在这里遗漏了什么?

答案1

我在这里遗漏了什么?

您可能严重混淆了源和目标。可能不是-s-d,而是--sport--dport

OUTPUT链中,您处理在您的机器上生成(源)并发往其他地方(目的地)的数据包。在链中,INPUT您处理在其他地方生成(源)并发往您的机器(目的地)的数据包。选项如、和test分别-s--sport-d--dports来源或d目的地。

让我们分析一下你的一条规则:

iptables -A INPUT -p tcp -s 93.184.216.34 --dport 80 -j ACCEPT

这意味着你正在接受由93.184.216.34TCP 端口生成并发往该端口的传入数据包80 在你的机器上,就像您托管 HTTP 服务器一样。下一条规则:

iptables -A OUTPUT -p tcp -d 93.184.216.34 --sport 80 -j ACCEPT

会让您的服务器做出响应。但随后您说“尽管我制定了规则,但我还是无法访问 IP”,因此我认为您的目标是访问 HTTP 服务器,93.184.216.34而您机器上的 HTTP 服务器(如果有)根本不在您的考虑范围之内。如果是这样,那么您应该首先让您的机器访问远程服务器:

iptables -A OUTPUT -p tcp -d 93.184.216.34 --dport 80 -j ACCEPT

在您的示例要点中,以下行将允许您的机器获得响应:

# not the best idea though, see below
iptables -A INPUT -p tcp -s 93.184.216.34 --sport 80 -j ACCEPT

但假设有一台服务器正在监听您的机器(不一定是 HTTP,任何使用 TCP 的服务器),并且您设置了其他iptables规则以仅允许一个或几个受信任的 IP 地址连接。控制的攻击者93.184.216.34可能会尝试从其端口连接80到您的服务器,并且上述规则将接受该连接。

因此,最好使用-m state或者-m conntrack) 只允许来自已ESTABLISHED连接的数据包进入(也许还有RELATED,请参阅man 8 iptables-extensions了解这些名称的含义)。这将接受属于您的机器发起的连接的数据包,但不接受发起新连接的数据包:

# not the most practical, see below
iptables -A INPUT -p tcp -s 93.184.216.34 --sport 80 -m state --state ESTABLISHED -j ACCEPT

在实践中,通常这样做:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

其理念是,它不会匹配那些试图无缘无故访问您机器的完全外部连接,但它会接受由您的机器发起的任何连接或与您的机器发起的连接相关的任何连接的传入部分。现在使用链OUTPUT来管理可以发起的内容,上述规则将处理所有响应。

例如,假设192.168.1.253是 DNS 服务器,您允许您的机器访问它:

iptables -A OUTPUT -p udp -d 192.168.1.253 --dport 53 -j ACCEPT

并且链中的通用规则INPUT将接受响应。


了解了所有这些之后,我们现在可以引入一个可以完成您想要的操作的代码片段:

# assuming non-default tables (e.g. raw) don't interfere
iptables -P  INPUT DROP
iptables -P OUTPUT DROP
iptables -F
iptables -A  INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp -d 192.168.1.253 --dport  53  -j ACCEPT
iptables -A OUTPUT -p tcp -d 93.184.216.34 --dport  80  -j ACCEPT
iptables -A OUTPUT -p tcp -d 93.184.216.34 --dport 443  -j ACCEPT

此外,您可能希望添加允许 ICMP ( -p icmp) 或特定 ICMP 类型 ( -p icmp --icmp-type …) 的规则 – 这对 很有用ping。我不会在这里讨论这个主题。

相关内容