我把主机用作网关
net.ipv4.conf.all.rp_filter=0
和,用于替代
iptables -t raw -A PREROUTING -m rpfilter --invert -j LOG-DROP-RP
我的主机有两个接口,eth1与IP 10.0.0.1/8,eth2与IP 192.168.0.1/16。如果有IP 192.168.0.2的主机在eth1上发送数据包,它将被丢弃并登录。转发表还阻止了eth1和eth2之间的转发。数据包从eth1上的10.0.0.2到eth2上的192.168.0.2被转发规则阻塞和记录。
但是,如果eth1上IP为10.0.0.2的主机将数据包发送到192.168.0.1,它就会通过。rpfilter只是忽略了它。转发表似乎也被忽略了。
我该怎么预防呢?因为这个主机上可能有一些私有接口eth3,私有服务监听它,并且可以从任何不需要的地方访问它。
发布于 2020-11-20 17:48:16
Linux使用弱宿主模型:分配给任何接口的任何IP地址都属于整个主机。当您从10.0.0.2到192.168.0.1之间到达时,不需要转发,因为目标地址属于主机:数据包由过滤器/输入处理,而不是过滤器/转发(因此不会对此数据包进行评估)。详细的数据包行程原理图可以找到那里。
这不是路由异常,因此不会触发严格反向路径转发,无论是在路由栈中还是在iptables的rpfilter模块中。
因此,您还必须添加带有IP地址的显式规则。如果仍然希望将其放在原始表中,那么addrtype匹配甚至可以在那里找到目的地是否是本地的(或者也是广播的)。您可以在SRPF测试之后添加这些规则(如果多个IP地址被分配给主机,而不仅仅是.1地址),这些规则就能工作:
iptables -t raw -A PREROUTING -s 10.0.0.0/8 ! -d 10.0.0.0/8 -m addrtype --dst-type LOCAL,BROADCAST -j DROP
iptables -t raw -A PREROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 -m addrtype --dst-type LOCAL,BROADCAST -j DROP
我不知道iptables如何添加不包括与使用中的特定地址相关的详细信息的通用规则。使用nftables是可能的:
丢弃未在传入接口过滤器上配置的数据包,预输出filter。iif类型!= {本地、广播、多播}丢弃
https://unix.stackexchange.com/questions/620748
复制相似问题