iptables 防火墙仅在允许源端口 80 的情况下才允许互联网流量

iptables 防火墙仅在允许源端口 80 的情况下才允许互联网流量

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

对我来说这没有意义,传入流量的目标端口难道不应该是 80 吗?

下面是我的配置示例。如果我删除允许端口 80 上的传入流量的规则,那么我就无法访问 Google 或其他任何东西,激活规则后一切正常。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

答案1

如果 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)和端口(更改为路由器映射到从您那里收到的原始连接的随机 IP),但不会影响目的地。
    • 执行 NAT 的路由器将监听新的“源”端口,并将响应流量转换为对您的计算机原始请求的响应。
    • 为了简单起见,在这个例子中我不会再讨论 NAT;我们只假设您的地址和服务器的地址都是唯一的可公共路由 IP。
  6. 请求到达服务器的端口 80(或 443 或其他)。Web 服务器进程已经告知服务器的操作系统,它希望accept在该端口上接收传入的 TCP 连接。
  7. 服务器操作系统创建并发送确认 (SYN-ACK) 作为响应。它必须具有与传入数据包相同的详细信息,只是源和目标是相反的:源 IP:服务器的 IP;源端口:80;目标 IP:你的 IP;目标端口:53904
  8. 该响应通过互联网传回您的计算机,您的操作系统一直在监听以查看是否从该 IP 地址在端口 53904 上获得 SYN-ACK。
    • 还有一种称为“序列号”和“确认号”的东西,用于验证连接是否是它应该的连接,并防止其他计算机伪造它就是您正在尝试通信的服务器。
    • 当然,这种防止伪造(欺骗)服务器的保护措施只有在攻击者无法观察/拦截您发送的流量时才有效。SSL/TLS 的一个重要部分,即为 HTTPS 增加安全性的东西,是一种更强大的服务器身份验证机制。
  9. 您的操作系统获取 SYN-ACK 并使用其自己的 ACK 进行响应,再次反转源和目标(或者只是重新使用原始源和目标;同样的事情)。
  10. 现在双方都已确认连接,您的操作系统会让您的浏览器知道它现在可以通过套接字发送数据。
  11. 服务器的操作系统现在已收到您机器的确认(并验证了序列号),为 Web 服务器软件创建一个新的套接字。此套接字用于传输刚刚完成的 TCP 连接的流量,并绑定到服务器 IP 上的端口 80 和您 IP 上的端口 53904;它将在端口 80 上接收数据,并从端口 80 发送数据

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

答案2

你写

..如果我删除允许端口 80 传入流量的规则,那么我就无法访问 Google 或其他任何东西,激活规则后一切正常。Web 服务器不应该监听此端口并从随机端口发送吗?

不。www.google.com 将从端口 80 发送到您的随机端口。

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

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

因此,无论谁访问你的 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 >file 和 iptables-restore < file。

答案3

您确实需要 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

答案4

还需要:

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

相关内容