如果允许源端口为80,iptables防火墙仅允许互联网流量


3

我正在配置iptables防火墙,目前只是为了允许http和https流量。它正在工作但是在一个特别奇怪的规则下 - 我必须允许源端口为80的传入连接。

如果传入流量的目标端口不是80,那对我来说没有意义吗?

下面是我的配置示例。如果我删除允许端口80上的传入流量的规则,那么我无法访问谷歌或其他任何东西,激活规则,这一切都有效。Web服务器是否应该侦听此端口并从随机端口发送?

# Set all major commands to DROP by default
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Allow HTTP and HTTPS
# Need to consider limiting to ESTABLISHED, RELATED for OUTPUT
# consider NEW for INPUT
# configure source ports in range 1024:65535

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT

# ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# allow loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

# Logging before Drop for troubleshooting
iptables -A INPUT -j LOG
iptables -A INPUT -j LOG

Answers:


2

如果Web服务器通过随机端口响应您的请求,那么您的操作系统如何知道将该流量发送到您的浏览器?

以下是它的工作原理:

  1. 您的浏览器希望与服务器建立传出连接,因此它要求操作系统提供套接字。
  2. 除非浏览器做了一些奇怪的事情,否则它并不关心它所获得的套接字端口是什么,因此操作系统会随机分配一个免费的端口。
    • 对于这个例子,我将使用53904作为我们的随机浏览器端口。
  3. 浏览器要求操作系统将此套接字连接到服务器的IP(通常由DNS找到)和侦听端口(对于纯文本HTTP通常为80,对于HTTPS通常为443;有时在URL中指定其他内容)。
    • 对于此示例,我们假设您通过端口80执行纯文本HTTP。
  4. 操作系统向指定的浏览器发送TCP连接(SYN)请求,其中包含以下详细信息:源IP:您的网络接口的IP; 源端口:53904; 目标IP:服务器的IP; 目的港:80
  5. TCP请求通过您和服务器之间的网络进行路由。
    • 网络地址转换(NAT)可能会更改源IP(到路由器的IP)和端口(路由器映射到它从您收到的原始连接的随机端口),但不会影响目标。
    • 执行NAT的路由器将侦听新的“源”端口,并将响应流量转换为对计算机原始请求的响应。
    • 为简单起见,我不再在本例中进入NAT; 我们假设您的地址和服务器都是唯一可公开路由的IP。
  6. 请求到达服务器的端口80(或443或其他)。Web服务器进程已告知服务器的操作系统它希望accept该端口上的传入TCP连接。
  7. 服务器的OS创建并发送确认(SYN-ACK)作为响应。它必须具有与传入数据包相同的详细信息,但源和目标是相反的:源IP:服务器的IP; 源端口:80; 目的地IP:您的IP; 目的港:53904
  8. 此响应通过Internet回到您的计算机,您的操作系统一直在监听它是否从该IP地址获得端口53904上的SYN-ACK。
    • 还有一个名为“序列号”和“确认号码”的东西,用于验证连接是否应该是它应该是什么,并阻止其他计算机假装它是你试图与之交谈的服务器。
    • 当然,这种防止伪造(欺骗)服务器的保护仅在攻击者无法观察/拦截您发送的流量时才有效。SSL / TLS的一个重要部分是为HTTPS增加安全性,它是一种更强大的机制,用于验证服务器。
  9. 您的操作系统获取SYN-ACK并使用自己的ACK进行响应,再次反转源和目标(或者只是重新使用原始源和目标;同样的事情)。
  10. 现在双方已经确认了连接,您的操作系统让您的浏览器知道它现在可以通过套接字发送数据。
  11. 服务器的操作系统现在已经收到机器的确认(并验证了序列号),为Web服务器软件创建了一个新的套接字。此套接字用于为刚刚完成的TCP连接传递流量,并绑定到服务器IP上的端口80和IP上的端口53904; 它将在端口80上接收数据并从端口80发送数据

从那里,浏览器和Web服务器通过该TCP通道相互通话。不过,我不打算详细介绍。这只是为了说明为什么您的防火墙确实需要允许来自服务器端口80的入站数据包,如果您希望能够从该服务器获取HTTP响应。


我没有阅读你的整个答案,但你的最后一段有一些多余的信息使得事情变得更加具体,并且开辟了一种可能甚至没有意义的可能性。您写道“您的防火墙确实需要允许来自服务器端口80的入站数据包...如果它们是您的计算机启动的TCP连接的一部分,至少。” < - 这是一个奇怪的“如果”你要添加,因为,在什么情况下,网络服务器会或可能发起与人的机器的连接,这甚至意味着什么?
barlop

1

你写

..如果我删除允许端口80上的传入流量的规则,那么我无法访问谷歌或其他任何东西,激活规则,这一切都有效。Web服务器是否应该侦听此端口并从随机端口发送?

没有.www.google.com会从端口80发送到您的随机端口。

同样,您运行的任何Web服务器都不会只监听端口80,它会发送源端口为80的数据包。

当然,您的网络服务器不会与谷歌网络服务器通信。

因此,无论谁访问您的Web服务器,都会有一个随机端口打开他的端

当您访问Google时,您可以使用随机端口打开您的终端。

您的困惑是没有意识到INPUT与“传入连接”没有特别关系。它是所有进入的数据包..包括来自传出连接的数据包。

所以你的服务器在端口80和443上侦听

我不是专家但是

我将给出一个共同的设置,如“朝向完美的规则集”(或指向它的那些人所使用的)所描述的

http://inai.de/documents/Perfect_Ruleset.pdf

- 让一切都出来

- 允许所有已建立和相关(相关包括来自它的新连接,例如旧协议FTP所需的 - 不是您使用FTP。它包括ICMP错误)

- 允许所有数据包到您的服务器端口。

所以你的政策就是

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

使用-m conntrack是和--ctstate-m state和更新--state

除了政策,你的规则也是如此

iptables -A INPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 

iptables -A INPUT -p tcp -m multiport --sports 80,443 -j ACCEPT

你使用的那种风格以及我上面写的与你的形式保持一致的是命令行风格,但有些人可能会说使用iptables脚本更专业。并且一行将读取-A输入而不是iptables -A输入。和iptables-save>文件和iptables-restore <文件。


0

你真的需要2个处理端口80和443的规则,即HTTP; 流量始终在端口80上传输,但是您需要2个规则...第一个规则允许您发送对远程页面的请求...第二个规则让该请求的答案(由目标HTTP服务器发送)返回到你的浏览器。

这些是规则

iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT 

你应该删除这个规则

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT

0

还需要:

iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

DNS回复规则需要限制在实际回复中:

iptables -A INPUT -p udp -i eth0 --sport 53 -m state --state ESTABLISHED -j ACCEPT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.