我有一个 CentOS 7 盒子,其中有 2 个 NIC 用作网关;一个 NIC 连接到互联网,而另一个 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"
除非对“内部”区域启用了伪装,否则规则本身无法发挥作用;不幸的是,这显然也会导致试图暴力破解 root 密码的外部 IP 在“server.lan”日志中显示为来自“192.168.1.1”(“gateway.lan”地址),这使得无法在“server.lan”框上使用 Fail2Ban 来阻止每天数千次的访问尝试。
我做错了什么?我认为在“内部”区域启用伪装在概念上是错误的,但我找不到其他方法使防火墙规则起作用。我毫不犹豫地保持伪装,但我想知道如何在网关后面使 Fail2Ban 工作...
还有什么建议可以让这样的配置按照我期望的方式工作吗?
答案1
啊,我们做到了!而且这相对容易(当然,一旦你知道怎么做的话)...
我们正确地推测,“内部”区域上的伪装不会在全球范围内启用,而应该仅限于来自 LAN 并路由到公共 IP 的数据包。
这意味着不要不加区别地启用它--添加伪装对于整个区域,但使用化装舞会在特定的丰富规则内,形式如下:
firewall-cmd --zone=internal --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 destination address=192.168.1.10 masquerade'
有一段时间,我们被这样一个事实所欺骗:我们坚持在规则中使用公共 IP“1.2.3.4”作为“目标地址”,而不是内部 IP“192.168.1.10”;我们没有意识到,一旦通过“内部”区域,以“1.2.3.4”的端口 22 为目标的数据包就已经被 rich 规则转换为 SSH 框的 LAN 地址。此外,此语法不允许指定端口。
“内部”区域的最终状态如下:
internal (active)
target: default
icmp-block-inversion: no
interfaces: XXXXXX
sources:
services: dns
ports:
protocols:
masquerade: no
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"
rule family="ipv4" source address="192.168.1.0/24" destination address="192.168.1.10" masquerade
哪个:
- 正确地将 SSH 访问从互联网重新路由到 SSH 盒 - 当然这也需要在“外部”区域中将端口 22 转发到“内部”区域中的相同端口;
- 让 LAN 机器以其公共名称或 LAN 名称随意通过 SSH 进入该框;
- 不会屏蔽从互联网到盒子的恶意 SSH 尝试的地址,以便 Fail2Ban 可以执行其工作。
干杯!