如何使用firewalld仅伪装特定子网?

如何使用firewalld仅伪装特定子网?

我在跑CentOS 7 上的 openvpn防火墙。我已经在公共(默认)区域启用了伪装,并且效果很好。然而,我偶尔需要在 localhost/127.0.0.1 上运行服务,而伪装却把它弄乱了。服务正确绑定到 127.0.0.1,但尝试连接到它的客户端代码似乎将 127.0.0.1 的目标 IP 地址映射到 eth0 的 IP 地址,其中服务器未侦听(已配置为 127.0.0)仅.0.1)。

如何将伪装限制为仅特定子网,以便 openvpn 仍然有效,但我也可以在本地主机上访问本地服务而不会受到伪装干扰?

另一种表达我的问题的方式是:如何防止环回地址的伪装?

我有一些想法,但不知道如何做(或者在不破坏其他东西的情况下做):

  • 将 openvpn 的伪装限制为仅 10.8.0.0/16
  • 通过将 eth0 的 IP 地址移动到另一个区域来限制伪装
  • 通过将环回接口移至受信任区域并将 eth0 的 IP 地址添加为受信任区域中的源来容忍伪装

答案1

我找到了一个解决方案:

external
  interfaces: eth0
  masquerade: yes

internal
  interfaces: tun0
  masquerade: no

public (default)
  interfaces:      # not used
  masquerade: no

trusted
  interfaces: lo
  masquerade: no

为了实现这一点,我必须明确声明它lo在该trusted区域中,tun0在该internal区域中,并且eth0在该区域中external。为此,我使用了(例如):

firewall-cmd --permanent --zone=external --add-interface=eth0
firewall-cmd --permanent --zone=internal --add-interface=tun0
firewall-cmd --permanent --zone=trusted  --add-interface=lo
firewall-cmd --reload

对于eth0,还需要添加ZONE="external"to/etc/sysconfig/network-scripts/ifcfg-eth0才能使其在重新启动后继续工作。对于其他接口来说这不是必需的。

实际的服务/端口在trustedinternal区域中打开,我保留其默认值。我确保默认区域 ( public) 上有 ssh(默认)以应对紧急情况(例如更新重命名接口eth0),并添加了我想要向该区域公开的服务external

masquerade默认情况下,该区域中已开启external,而其他区域则已关闭。

此设置适用于防火墙d-0.3.9-14.el7.noarch 我不确定为什么需要将它们放在单独的区域中,以排除环回接口的伪装(打开伪装会设置规则:-A POST_external_allow ! -i lo -j MASQUERADE,这对我来说已经足够了,但我不是专家)。然而,我发现这个错误这可能是相关的,并且该问题可能会在未来的版本中得到解决。

相关内容