在我的服务器上,我有一个到接口的默认路由eth0
。它有公共互联网地址并面向 ISP 网络。我启用了数据包转发,并且有几个带有私有10.x.x.x
地址的本地接口/网桥。此外,所有传出到 ISP 网络的数据包都是伪装的。问题是:如果我理解正确的话,任何发往不存在192.168.x.x
地址的数据包都将通过公共服务器接口(上行链路)转发到我的 ISP。这不是我想要的。
如何配置 Linux 以防止通过公共网络接口转发任何具有私有网络地址目标的数据包?我猜只添加一个 iptables 规则是不够的,因为有多个标准私有网络空间(10.xxx、192.16.xx、172.16.xx 以及其他。此外还有 ipv6 地址)。是否有任何 iptables 插件/系统策略可以实现这一点?我希望某些系统策略将接口标记为面向互联网的上行链路。
原因:我的 ISP 不喜欢任何带有私有网络范围目的地的软件包。我使用通过 VPN 访问的 DNS 服务器来工作。因此,当 VPN 发生故障时,我的 ISP 会收到对私有网络地址的 DNS 请求并锁定整个互联网连接。他们说这样做是为了安全(以防某些病毒将我的系统 DNS 覆盖为自定义 DNS)。
答案1
任何与系统上的路由规则不匹配的数据包都将被定向到默认路由(如果有)。默认情况下,如果您在给定网络上分配了 IP,则将自动添加路由规则,将该流量转发到分配的接口。如果您的服务器不在您想要阻止的这些网络上,那么最好检查生成该流量的任何东西,以便完全摆脱它,否则您仍然会受到它在您的本地网络设备上的困扰。
IANA 私有网络 IP 范围定义得非常明确,只有 4 个,这一点在这维基百科文章。我建议您在允许实际使用的范围后,向这些网络范围添加防火墙出站阻止规则作为目的地。
iptables 命令示例:
iptables -A FORWARD -d 10.0.0.0/8 -j REJECT
iptables -A FORWARD -d 172.16.0.0/12 -j REJECT
iptables -A FORWARD -d 192.168.0.0/16 -j REJECT
ip6tables -A FORWARD -d fd00::/8 -j REJECT
注意:发往这些范围的流量会被 ISP 丢弃,因为他们无处转发。但是,如果您泄露这些数据包,有些 ISP 可能会对您的流量施加限制。此外,如果您担心 ISP 级别的流量检查或泄露,这远非您保护自己所需要做的唯一事情。
答案2
您有一个公共编号的接口eth0
,这是您的默认路由,并且您不希望任何流量从任何私有编号的接口转发到公共接口之外。尝试
iptables -A FORWARD -o eth0 -j REJECT
将规则放在FORWARD
链中的正确位置留作练习。您还应该能够从那里推广到 ipv6。
编辑:您可以使用 关闭所有 v4 转发echo 0 > /proc/sys/net/ipv4/ip_forward
,并使用 关闭所有 v6 转发echo 0 > /proc/sys/net/ipv6/conf/all/forwarding
。但您并没有说要关闭所有转发,只是转发“通过公用网络接口往返于私有网络地址“。我不知道有任何/proc
结构可以仅禁用 RFC1918 流量的转发,如果有的话我会感到惊讶。