查看我的上篇博文:rp_filter对流量的影响
作用:net.ipv4.conf.all.accept_local可以改变默认的行为,把它设为1则接受源IP是本机中的IP的报文通过。
因为Linux还有一个检测源IP地址的机制,若收到的IP报文源IP与本机上某一个IP相同,那么内核默认丢弃这个报文。这其实也很好理解,正常情况下,如果收到一个IP报文的源地址属于自己,那么可能这个IP报文是伪造的。
Linux的IP路由实现中有个限制,即任何从非loopback网卡进来的任何数据包的源地址不能是本机地址
当arp_filter设置为0时:如果从某张网卡上收到了一个arp请求同时目的ip在此主机上不论目的ip是否在接收到此arp请求的网卡上那么主机便会进行响应响应的mac地址为接收到此请求的网卡的mac地址。
当arp_filter设置为1时:如果从某张网卡上收到了一个arp请求同时目的ip在此主机上不要求目的ip是一定在接收到此arp请求的网卡上,那么主机便会查询到此请求的源ip的路由是通过哪张网卡,如果是接收到此arp请求的网卡则发送arp响应响应的mac地址为接收到此请求的网卡的mac地址。
作用:定义对目标地址为本机IP的ARP查询不同的应答模式
参数说明:
设置为0:(默认值回应任何网络接口上对任何本地IP地址的arp查询请求比如eth0=192.168.0.1/24, eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1. 2这样地址发起的对10.1.1.1的arp查询也会回应一而原本这个请求该是出现在eth1上也该由eth1回应的响应的mac自然是eth0的mac。
设置为1:只回答目标IP地址是来访网络接口本地地址的ARP查询请求比如eth0=192.168.0.1/24, eth1=10.1.1.1/24,那么当eth0收到对192.168.0.1的查询请求时会进行回复(不论arp请求源地址是啥)而对待查询的ip为10.1.1.1的arp查询不会进行回复
设置为2:只回答目标IP地址是来访网络接口本地地址并且请求源IP必须在该网络接口的子网段内的ARP查询请求。比如eth0=192.168.0.1/24, eth1=10.1.1.1/24, eth0收到对192.168.0.1的查询请求源地址为 10.1.1.2(不同网段)不会进行不会回答而会回答192.168.0.2发起的对192.168.0.1的arp查询请求
当某张网卡收到一个arp报文会先进行arp_filter检验如果检验失败直接丢弃报文。如果校验成功则会进行arp_ignore检验。可以理解为arp_filter是一个比较粗糙的检验而arp_ignore是一个比较细致的检验。
arp_announce的作用是控制系统在对外发送arp请求时如何选择arp请求数据包的源IP地址。比如系统准备通过网卡发送一个数据包a这时数据包a的源IP和目的IP一般都是知道的然后根据目的IP查询路由表确定发送数据包的网卡。链路层要转发数据需要获取下一跳的MAC地址通过发送arp请求得到。arp请求的目的IP是下一跳IP而arp请求的源IP是什么呢 可能第一反应会以为肯定是数据包a的源IP地址但是这个也不是一定的arp请求的源IP是可以选择的控制这个地址如何选择就是arp_announce的作用
在上述的几种条件下,被内核丢弃的报文又称为火星包(martian packet),意思就是不应该出现的报文。但不该出现的出现了怎么办?内核还提供了log_martians配置(也是对应2个文件),如果置为1则在丢弃时打印日志,可在/var/log/syslog查看。
Nov 16 02:58:47 ipfs3 kernel: [ 3519.473826] IPv4: martian source 192.168.1.2 from 192.168.2.2, on dev rb3
Nov 16 02:58:47 ipfs3 kernel: [ 3519.473831] ll header: 00000000: 3a f1 33 12 b1 10 36 38 ad 59 7b 71 08 00 :.3...68.Y{q..
Nov 16 02:58:48 ipfs3 kernel: [ 3520.498207] IPv4: martian source 192.168.1.2 from 192.168.2.2, on dev rb3
Nov 16 02:58:48 ipfs3 kernel: [ 3520.498212] ll header: 00000000: 3a f1 33 12 b1 10 36 38 ad 59 7b 71 08 00 :.3...68.Y{q..
配置参数:
sysctl -w net.ipv4.conf.all.log_martians=1