4

我正在尝试设置防火墙规则以将 80/tcp 转发到 8080-8081,该规则设置正确,但似乎只是部分工作。

问题是流量总是转发到 8080 而不是 8081,有什么问题吗?

下面是我的环境:

  • 在 192.168.30.30 上创建两个 http 服务器,分别监听 8080 和 8081
  • 设置防火墙规则来进行端口转发

    firewall-cmd --add-forward-port='port=80:proto=tcp:toport=8080-8081' --permanent

  • 从客户端, curl http://192.168.30.30:80 (始终转发到端口 8080)

以下是我的防火墙设置:

防火墙-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: ssh dhcpv6-client
  ports: 80/tcp
  protocols: 
  masquerade: yes
  forward-ports: port=80:proto=tcp:toport=8080-8081:toaddr=
  source-ports: 
  icmp-blocks: 
  rich rules:

sysctl -a | grep ip_forward

net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
4

1 回答 1

0

tl;dr Firewalld 未指定random何时使用 DNAT 范围。

端口范围被传递给iptables/ nftables,后者又使用内核中的连接跟踪。连接跟踪实际上是在做 DNAT(转发端口)。它从范围中选择一个端口。默认情况下,它会线性搜索范围。因此,如果连接跟踪当前没有元组的条目(dip、sip、dprot、sport 等),8080则将使用。当所有 ( 8080, sport) 对都已在使用时,才会8081考虑 dport。

您应该提交一个上游 firewalld 问题。我认为random在生成的 DNAT 规则中使用会产生预期的结果。

于 2021-10-25T14:34:04.693 回答