我认为以下内容对于桌面(非服务器)上的传出 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 无关。