我正在尝试用防火墙规则替换现有的隧道:
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