我的 ISP 路由一个 /29 网络(8 个 IP 地址)。第一个和最后一个当然是网络和广播地址,第二个由 ISP 分配给调制解调器。调制解调器有一个以太网 LAN 端口,带有 /29 网络,我可以使用。不幸的是,我无法访问或更换调制解调器,只有 ISP 可以访问它。需要将其视为黑盒来进行讨论。我的端点是提供 /29 网络的调制解调器的 LAN 连接。
当然,我可以将剩余的 5 个 IP 地址分配给不同的机器,并通过以太网端口将它们连接到调制解调器。这就是我现在正在做的事情。
但是,我希望在中间放置一个数据包过滤器(防火墙)。通常防火墙需要两个接口和两个子网。从技术上讲,我可以将 /29 分成两个 /30 网络,并将防火墙放在它们之间。
另一种选择是将所有五个静态 IP 分配给防火墙并执行 NAT 和端口转发。
第三种选择是让所有 L2 流量通过我的防火墙,将其配置为网桥并使用基本的 L2 过滤。
这些选择对我来说都不具吸引力。
有没有一个好的方法可以在我的 IP 网络前面放置防火墙没有需要 NAT 或 L2 过滤吗?
答案1
理想情况下,整个 /29 应位于防火墙的“内部”接口上,防火墙本身应使用完全独立的 /31(或 /30)进行连接,ISP 应路线通过防火墙的主 /29...值得尝试致电您的 ISP 并询问他们是否可以进行这种“点对点”配置。
如果做不到,可以假装使用代理地址解析协议在防火墙上。只要它回答路由器的 ARP 查询,它就会接收这些 IP 地址的流量,即使这些 IP 地址实际上没有在防火墙上配置。
这适用于基于 Linux 的防火墙(并且一般思路应该适用于 OpenBSD),但不保证设备也能正常工作:
像往常一样使用 /29 中的地址配置防火墙的“内部”接口。
ip addr add 193.256.181.193/26 dev int0
配置防火墙的“外部”接口相同的地址,但将其设为 /32。
在 Linux 上,您可以使用“点对点”寻址样式,将调制解调器的地址指定为“对等点”。
ip addr add 193.256.181.193 peer 193.256.181.254/32 dev ext0
如果不可能,请使用常规 /32 并为调制解调器的地址单独添加“本地”路由。
ip addr add 193.256.181.193/32 dev ext0 ip route add 193.256.181.254/32 dev ext0
照常添加默认路由。
ip route add default via 193.256.181.254 dev ext0
在“外部”接口上启用代理 ARP。在 Linux 上,您可以使用内核实现(通过 启用
sysctl
)或用户空间守护进程(“parpd”)。因为内核实现让我困惑不已,所以使用
parpd
更简单(也因为在我的情况下我需要配置例外到整个子网代理,这是 parpd 可以做到的,但内核不能做到),所以这里有一个 /etc/parpd.conf:interface ext0 # Make the ISP router think the entire subnet is still on-link proxy 193.256.181.192/26 # But don't answer for the ISP router's own address ignore 193.256.181.254
您还可以为“内部”接口启用 ARP 代理,这样静态配置的 LAN 主机就可以继续将 ISP 路由器的地址作为其“默认网关”,而无需立即在所有地方更改它:
interface int0 # Make the LAN hosts think the ISP router is still on-link proxy 193.256.181.254
Linux 上的内核代理 ARP 实现可以在
sysctl net.ipv4.conf.ext0.proxy_arp[_pvlan]
以及下找到ip neigh add .. proxy
。(经过几次尝试,我仍然不确定后者是否需要启用 sysctl,或者它们是否正交。)请注意,在这种情况下,“代理”并不意味着中继请求(尽管这也是可能的);相反,防火墙本身将代表代理地址进行回答。
就这样,现在只需将防火墙视为标准路由器并编写您的 iptables 规则。
这种机制的优点(与 NAT 或 ebtables 相比)布鲁廷1)除了“外部”接口看起来有点奇怪之外,你的防火墙仍然像一个完全标准第 3 层路由器 - 代理 ARP 不会以任何方式改变 IP 数据包,并且几乎可以实现与 ISP 只是通过防火墙路由 /29 相同的结果。
(同样的方法也适用于使用代理 NDP 的 IPv6,但希望您不需要这样做,而只需让 ISP 正确路由它,例如通过 DHCPv6-PD?)
请注意,即使您最初计划将 /29 拆分为两个 /30,仍然需要代理 ARP,因为 ISP 的路由器完全不知道这种拆分 - 它会继续针对整个 /29 发出 ARP 查询。
如果答案是您可以致电 ISP 并要求他们调整路由以便可以使用两个 /30...那么您也可以首先要求他们将整个 /29 路由到您的防火墙(在这种情况下他们会为调制解调器 - 防火墙链路分配专用的点对点 /30)。
1 Linux 软件桥支持一项功能,其中某些数据包可以提升到 L3 处理(路由/iptables),而其他数据包则继续由 L2 桥转发。一些防火墙设备(如 Untangle)使用了此功能。这太可怕了,我希望永远不会再在网络上看到它。
答案2
通常防火墙需要两个接口和两个子网。
防火墙还会根据需要执行 NAT,这意味着只有“外部”子网是您的 /29,“内部”子网是私有地址范围,可以根据需要设置得任意大(例如10.0.0.0/8
)。
这可以是“静态”NAT,因此您可以拥有 5 个内部 IP,并将它们一对一映射到 5 个外部 IP。或者您喜欢的任何其他方式。
因此,在您的环境中使用 NAT 确实没有任何缺点。NAT 不限于“将整个内部子网映射到单个 IP 地址”,这是家用路由器上的默认操作。
有没有一种好的方法可以在我的 IP 网络前面放置防火墙,而不需要 NAT 或 L2 过滤?
我的意思是,您要么继续使用 L2,然后需要 L2 过滤,要么转到 L3,然后需要路由,因此需要 NAT。所以只能选择其中一种。
只是因为“不喜欢 NAT”(或无论出于何种原因)而将外部 IP 地址浪费在有内部防火墙的机器上并不是对 IP 地址等昂贵资源的良好利用。