Firewalld 端口转发失败

Firewalld 端口转发失败

我正在尝试用防火墙规则替换现有的隧道:

firewall-cmd --zone=public --add-forward-port=port=9999:proto=tcp:toport=9999:toaddr=100.1.1.1

这会将所有传入的 TCP 连接转发到 100.1.1.1

问题是它不起作用(端口保持关闭状态)。我试图了解我做错了什么,我唯一能想到的是目标 IP 地址位于不同的 NIC 上,并且由 Tailscale 创建(类似于 Wireguard VPN),因此它是一种虚拟 IP。

那么,转发到哪些 IP 有限制吗?有办法绕过这些限制吗?

external (active)
  target: default
  icmp-block-inversion: no
  interfaces: tailscale0
  sources:
  services: ssh
  ports:
  protocols:
  forward: yes
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

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

答案1

您可能需要在端口转发中添加伪装(将 SNAT 与 DNAT 端口转发一起应用,以便100.1.1.1知道通过防火墙主机进行响应)。

最简单的方法是将端口转发的传出接口(即 tailscale 接口tun0)添加到external区域:

firewall-cmd --zone=external --add-interface=tun0

Firewalld 的external区域默认启用伪装。如果您为 tailscale 接口使用自定义区域,请向其中添加伪装:

firewall-cmd --zone=myzone --add-masquerade
firewall-cmd --zone=myzone --add-interface=tun0

当然,请确保您已将端口转发的传入接口(可能是某些物理接口,例如eth0)添加到public区域(与您设置端口转发的区域相同):

firewall-cmd --zone=public --add-interface=eth0

相关内容