我有一个关于网络堆栈如何在 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 地址的请求。默认情况下,该盒子将像路由器一样工作。那是对的吗?
几乎。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端使用私有地址IP范围,并且这些IP不应该出现在WAN端(因为有多个私有LAN连接到这个WAN,都可以使用相同的地址)。因此路由器进行网络地址转换 (NAT):对于从 LAN A 发往 WAN 的每个传入请求,该请求将被输入一个表(连接跟踪),并且该请求的所有传出和传入数据包都将被修改,替换LAN a 中的 IP 地址(和端口)与路由器在 WAN 上的 IP 地址(以及用于此连接的随机选择的端口)。
仅此一项就可以防止 WAN 中的任何东西发起与 LAN A 中任何东西的连接,包括 LAN A 中路由器的接口。
最重要的是,您有防火墙规则,防止从 WAN 传入的任何内容被路由到 LAN A,但源自 LAN A 的连接除外。
如果你想允许这个,你需要设置“端口转发”。
所以在上面的场景中,登录服务器只是绑定在 LAN A 中的 IP 地址上。
原则上是的,但请参阅上面描述的详细信息(防火墙规则之上的 NAT)。