将服务限制在连接两个 LAN 的 Linux 机器上的特定 LAN 上?

将服务限制在连接两个 LAN 的 Linux 机器上的特定 LAN 上?

我有一个假设性的问题,关于网络堆栈在 Linux 上的工作原理。如果我有一台有两个 NIC 的机器,位于不同的 LAN 上。类似这样的情况:

  • LAN A 上的 NIC A,192.168.1.3/24
  • LAN B 上的 NIC B,192.168.2.5/24

现在,如果我在 192.168.2.5:80 上有一个 Web 服务,旨在仅为 LAN B 的主机提供服务,我该如何阻止 LAN A 的主机访问它?

我的理解是,如果我不向 netfilter/iptables/nftables 添加任何内容,默认的 Linux 内核将传递从 NIC A 的邻居(LAN A)发送到 NIC B 的 IP 地址的请求。默认情况下,该盒子将像路由器一样工作。对吗?

答案1

我的理解是,如果我不向 netfilter/iptables/nftables 添加任何内容,默认的 Linux 内核将传递从 NIC A 的邻居(LAN A)发送到 NIC B 的 IP 地址的请求。默认情况下,该盒子将像路由器一样工作。对吗?

差不多。可以在内核中启用或禁用 LAN 段之间的转发。您可以检查/proc/sys/net/ipv4/ip_forward它是否已为 IPv4 启用(并且可以通过将01写入此伪文件来设置它)。

此外,许多人忘记的是,路由必须适用于全部参与者。例如,LAN A 中的机器需要知道 LAN B 中的 IP 地址,数据包首先需要转到 192.168.1.3 才能到达具有两个 NIC 的机器。如果 192.168.1.3 是网关(默认路由)适用于 LAN A 上的所有计算机,则此操作会自动执行。如果没有,则 LAN A 中的计算机需要额外的路由信息​​(例如,可以通过 DHCP 分发)。

还,iptables 未进行路由。太多人阅读了用于iptables路由的教程,然后混淆了这两者。iptables用于过滤(即防火墙)。您无需iptables编译到内核即可进行路由。

因此,在您的场景中:如果您想让 LAN A 中的主机不知道 LAN B 中的主机(反之亦然),只需在具有两个 NIC 的机器上禁用路由。如果他们原则上应该能够互相看到,除了 192.168.2.5:80 上的 Web 服务,然后您需要在路由之上制定过滤规则来准确排除此 Web 服务。

并且整个场景可能会变得更加复杂,具体取决于 LAN A 和 LAN B 如何访问“互联网”。

(一般建议:如果你想问任何有关网络的问题,首先画一个网络图以及所有重要部分)。


典型的家用路由器具有对 LAN(原始问题中的 LAN B)开放的 Web 登录,我猜测默认情况下此登录不能通过 WAN(LAN A)访问。

在这种情况下,路由器的设置已经有所不同:LAN 端使用私有地址 IP 范围,而这些 IP 不应该出现在 WAN 端(因为有多个私有 LAN 连接到此 WAN,它们都可能使用相同的地址)。因此,路由器会进行网络地址转换 (NAT):对于从 LAN A 发送到 WAN 的每个传入请求,此请求将输入到表中(连接跟踪),并且该请求的所有传出和传入数据包都将被修改,将 LAN a 中的 IP 地址(和端口)替换为路由器在 WAN 上的 IP 地址(以及为此连接随机选择的端口)。

仅此一点就可以阻止 WAN 中的任何东西发起与 LAN A 中的任何东西的连接,包括 LAN A 中路由器的接口。

最重要的是,您有防火墙规则可以阻止来自 WAN 的任何传入内容路由到 LAN A,但源自 LAN A 的连接除外。

如果您想允许这样做,您需要设置“端口转发”。

那么,什么机制会阻止WAN登录呢?

所以在上述场景中,登录服务器仅仅绑定在 LAN A 中的 IP 地址上。

我认为默认情况下 Linux 应该允许访问(并且 ip_forward 对于这种特定情况是一个不相关的选项)所以应该是一些防火墙规则禁止它,对吗?

原则上是的,但请参阅上面描述的详细信息(防火墙规则之上的 NAT)。

相关内容