我有一个带有 2 个 NIC 作为网关的 CentOS 7 机器;一个 NIC 连接到 Internet,而另一个 NIC 连接到我们的 LAN。
第一个 NIC 属于 firewalld 的“外部”区域,它伪装并设置为将端口 22、80 和 443 转发到内部网络中管理 SSH 和 Web 服务器的那些盒子;假设从互联网上,该框在地址“1.2.3.4”处显示为“example.com”,而在 LAN 中其名称为“gateway.lan”,地址为“192.168.1.1”。
一切正常,但有一个重要的警告;因为我们希望能够使用盒子的互联网名称(ssh example.com)通过 SSH 连接,也可以在 LAN 内(SSH 盒子名为“server.lan”,地址为 192.168.1.10),唯一的完成这项工作的方法似乎是在 firewalld 的“内部”区域中设置规则,将所有对“1.2.3.4”端口 22 的访问转发回 SSH 框的端口 22:
internal (active)
target: default
icmp-block-inversion: no
interfaces: XXXXXX
sources:
services: dns
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" destination address="1.2.3.4" forward-port port="22" protocol="tcp" to-port="22" to-addr="192.168.1.10"
除非为“内部”区域启用伪装,否则仅此规则不起作用;不幸的是,这显然也导致外部 IP 敲击该框,试图暴力破解 root 密码,在“server.lan”的日志中显示为来自“192.168.1.1”(“gateway.lan”地址),这使得不可能在“server.lan”框上使用 Fail2Ban 来阻止每天尝试访问的数千次。
我究竟做错了什么?我认为在“内部”区域启用伪装在概念上是错误的,但我找不到其他方法使 firewalld 规则起作用。我毫不犹豫地保持伪装,但我想知道如何使 Fail2Ban 在网关后面工作......
对任何其他方式使这样的配置像我期望的那样工作有什么建议吗?
啊,我们做到了!而且它相对容易(好吧,一旦你知道如何)......
我们正确地推测“内部”区域的伪装不是全局启用的,而是仅限于来自 LAN 的数据包,这些数据包被路由到公共 IP。
这意味着不要使用--add-masquerade为整个区域不加选择地启用它,而是使用masquerade INSIDE 特定的丰富规则,形式如下:
有一段时间我们被这样一个事实所愚弄:我们在规则中坚持使用公共IP“1.2.3.4”作为“目标地址”而不是内部IP“192.168.1.10”;我们没有明白,一旦通过“内部”区域,针对“1.2.3.4”的端口 22 的数据包已经被富规则转换为 SSH 框的 LAN 地址。此外,此语法不允许指定端口。
“内部”区域的最终状态如下:
哪个:
干杯!