我有一个假设性的问题,关于网络堆栈在 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 启用(并且可以通过将0
或1
写入此伪文件来设置它)。
此外,许多人忘记的是,路由必须适用于全部参与者。例如,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)。