为什么必须使用 iptables 授权环回流量才能访问 Web?

为什么必须使用 iptables 授权环回流量才能访问 Web?

我认为以下内容对于桌面(非服务器)上的传出 HTTP 是必要的:

iptables -A INPUT  -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

但是,事实证明我需要这两个才能使其工作。我不知道为什么:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

我知道最后一条规则允许 UDP 访问该lo接口。

但是,我认为我需要的只是outgoing TCP for NEW/ESTABLISHED connections+ incoming TCP for ESTABLISHED connections。这对我来说似乎违反直觉(因为我仍在学习)。

答案1

您显然不需要lo访问互联网。但也许您有一个正在运行的本地 DNS 服务器(转发器)。 DNS使用UDP,Web访问除了HTTP之外还需要DNS。

顺便说一句,您的规则不允许(相关)ICMP 响应。这可能会导致问题(除非您使用较低的 MSS/MTU 值)。但您甚至不允许传出 ICMP,因此路径 MTU 发现甚至无法工作。

答案2

我只能做出假设,因为您还没有列出默认策略。在 的输出顶部找到iptables -S。我假设你受到限制并且你有类似的事情。

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP

伟大的!现在,您的机器对于 IP 数据包来说是完全隐形的、被蒙住眼睛的、被束缚的和被堵住的。这几乎与将其从以太网中拔出一样好。

所以,如果你想在这个残酷、黑暗的世界里抱有希望,你就必须制定一些规则来接受一些数据包,也许会遇到拿着刀的人来割断你的绳索,但哪些数据包是正确的呢?

需要一个输出规则来允许数据包到达服务器用于 http/https 流量的端口

-A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

需要 INPUT 规则来允许数据包从用于 http/https 流量的端口进入浏览器。

-A INPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

因此,现在您可以从 Web 浏览器建立新的 http/https 连接,并接收通过这些已建立的连接返回的信息。

那有什么问题呢?无法获取 DNS 信息,您应该能够在网络浏览器中输入要访问的网站的 IP 地址,但这并不是我们想要的。 DNS 流量通过端口 53 使用 UDP 协议进行处理。

-A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

为了收到这些方便的答复,我们需要在眼罩上再切一些洞。

-A INPUT -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT

现在有一些光,你可以听到它,说如果你对谷歌的服务器之一进行 DNS 查询

dig @8.8.8.8 slashdot.org

这样的反应!但也许你的浏览器仍然无法弄清楚slashdot到底在世界上的哪个地方。至少有一个发行版(Ubuntu)设置为使用内部 DNS 代理,因此您需要能够通过设置规则来与自己对话(无论如何世界其他地方都很无聊),以允许您作为服务器进行通信端口53

-A OUTPUT -o lo -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A INPUT -i lo -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

请注意这些“我是我自己的服务器”规则和之前的“我只想看看世界规则”之间的细微差别。另外,-o lo-i lo表明该服务器将只为该机器提供服务,这是避免陷入某些复杂的 DNS 反弹类型攻击的好措施。

您现在应该看到浏览器再次正常工作了。

答案3

INPUT这将取决于和/或链是否OUTPUT设置为ACCEPT不匹配的数据包。如果是的话,您根本不需要任何规则。如果您没有更改它,这可能是默认值。

最后 2 条规则允许来自或流向lo接口(即 127.0.0.1 / ::1)的任何流量,而不仅仅是 UDP。除非您连接到本地桌面上的 Web 服务器,否则它们与 HTTP 无关。

相关内容