Linux rp_filter和arp_filter参数浅析

本文详细介绍了Linux系统在默认配置下如何处理ARP请求,并通过修改`arp_ignore`参数来调整接口响应行为。实验中展示了不同`arp_filter`和`rp_filter`设置对ARP响应的影响,以及网络接口优先级变化后对外提供的MAC地址。此外,还通过`tcpdump`展示了在关闭过滤参数后,两张网卡同时对外响应的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​ 在默认配置下,只要ARP请求中的目标IP配置在本机,无论其是否配置在收到ARP请求数据包的接口上,Linux收包接口都会以身MAC地址发送ARP响应。若是不希望接口响应所有本机IP,可以通过修改arp_ignore参数来调整

测试环境

网卡IP
机器1-ens33192.168.1.11
机器1-ens36192.168.1.12
机器2-ens160192.168.1.15
vmare1192.168.1.1

实验

# 查看网络信息
[root@node1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ec:1c:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.11/24 brd 192.168.1.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::624c:c1db:e3b4:9165/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ec:1c:37 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.12/24 brd 192.168.1.255 scope global noprefixroute ens36
       valid_lft forever preferred_lft forever
    inet6 fe80::5dab:f84:95b8:1f/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever


# 查看此时路由信息
[root@node1 ~]# ip route
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.11 metric 100 
192.168.1.0/24 dev ens36 proto kernel scope link src 192.168.1.12 metric 101

# arp_filter和rp_filter全开
    sysctl -w net.ipv4.conf.all.arp_filter=1
    sysctl -w net.ipv4.conf.all.rp_filter=1
    sysctl -w net.ipv4.conf.ens36.arp_filter=1
    sysctl -w net.ipv4.conf.ens36.rp_filter=1
    sysctl -w net.ipv4.conf.default.arp_filter=1
    sysctl -w net.ipv4.conf.default.rp_filter=1
    sysctl -w net.ipv4.conf.ens33.arp_filter=1
    sysctl -w net.ipv4.conf.ens33.rp_filter=1
    sysctl -w net.ipv4.conf.lo.arp_filter=1
    sysctl -w net.ipv4.conf.lo.rp_filter=1


# 机器2 ping 192.168.1.12
[root@localhost ~]# ping 192.168.1.12
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=0.397 ms
64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.393 ms
64 bytes from 192.168.1.12: icmp_seq=3 ttl=64 time=1.15 ms
64 bytes from 192.168.1.12: icmp_seq=4 ttl=64 time=0.583 

# 机器2查看arp,可以发现机器一对外只回复了ens33的MAC地址(因为ens36收到后,查询路由表发现需要把包从ens33发出,收发不是同一个接口,立刻把数据包丢了)
[root@localhost ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.1.12             ether   00:0c:29:ec:1c:2d   C                     ens160
192.168.1.1              ether   00:50:56:c0:00:01   C                     ens160
192.168.1.11             ether   00:0c:29:ec:1c:2d   C                     ens160

# 机器1升级ens36优先级
[root@node1 ~]# ip route
192.168.1.0/24 dev ens36 scope link 
192.168.1.0/24 dev ens33 scope link metric 100


# 机器2 查看MAC,发现此时对外MAC地址为ens36的了
[root@localhost ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.1.12             ether   00:0c:29:ec:1c:37   C                     ens160
192.168.1.1              ether   00:50:56:c0:00:01   C                     ens160
192.168.1.11             ether   00:0c:29:ec:1c:37   C                     ens160
# arp_filter和rp_filter全关
    sysctl -w net.ipv4.conf.all.arp_filter=0
    sysctl -w net.ipv4.conf.all.rp_filter=0
    sysctl -w net.ipv4.conf.ens36.arp_filter=0
    sysctl -w net.ipv4.conf.ens36.rp_filter=0
    sysctl -w net.ipv4.conf.default.arp_filter=0
    sysctl -w net.ipv4.conf.default.rp_filter=0
    sysctl -w net.ipv4.conf.ens33.arp_filter=0
    sysctl -w net.ipv4.conf.ens33.rp_filter=0
    sysctl -w net.ipv4.conf.lo.arp_filter=0
    sysctl -w net.ipv4.conf.lo.rp_filter=0

# 查看机器1 路由
[root@node1 ~]# ip route
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.11 metric 100 
192.168.1.0/24 dev ens36 proto kernel scope link src 192.168.1.12 metric 101

# 机器2 ping 机器1
[root@localhost ~]# ping -c 1 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.849 ms

--- 192.168.1.11 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.849/0.849/0.849/0.000 ms
[root@localhost ~]# ping -c 1 192.168.1.12
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=0.572 ms

--- 192.168.1.12 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.572/0.572/0.572/0.000 ms


# 查看机器的tcpdump抓包,发现现在二张网卡开始同时对外提供MAC地址了,在之前二张网卡只会对外响应一个MAC地址(但是在这种情况下先发的响应包可能会被后响应的覆盖)
[root@node1 ~]# tcpdump -i any arp -Nnv
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:06:09.155324 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.11 tell 192.168.1.15, length 46
09:06:09.155351 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.11 is-at 00:0c:29:ec:1c:2d, length 28
09:06:09.155632 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.11 tell 192.168.1.15, length 46
09:06:09.155641 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.11 is-at 00:0c:29:ec:1c:37, length 28
09:06:10.834215 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.12 tell 192.168.1.15, length 46
09:06:10.834238 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.12 is-at 00:0c:29:ec:1c:2d, length 28
09:06:10.834330 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.12 tell 192.168.1.15, length 46
09:06:10.834336 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.12 is-at 00:0c:29:ec:1c:37, length 28
<think>好的,用户想了解如何在Linux中配置使用rp_filter参数。首先,我需要回忆一下rp_filter的作用相关配置方法。 首先,rp_filter是反向路径过滤,用来防止IP地址欺骗,增强网络安全。它有三种模式:0(关闭)、1(严格模式)、2(宽松模式)。用户可能需要知道这些模式的区别应用场景。 接下来,配置方法。用户可以通过sysctl命令临时修改,或者编辑sysctl.conf文件永久生效。需要具体说明步骤,比如使用echo命令修改/proc下的文件,或者修改/etc/sysctl.conf后执行sysctl -p。 然后,需要注意不同网络接口可能需要单独设置,比如eth0、eth1,或者使用alldefault。还要提到Oracle RAC的情况,引用中的例子需要设置rp_filter为2,这可能多个私网网卡有关,应该引用用户提供的参考内容,特别是引用[2][3]。 用户可能遇到的常见问题,比如网络不通的情况,需要检查rp_filter设置是否导致丢包。可能需要指导如何临时关闭来测试,或者调整到宽松模式。 此外,相关参数arp_filterarp_ignore、arp_announce可能也需要一起配置,但用户的问题主要集中在rp_filter,所以可以简要提及,但主要回答rp_filter的配置。 还要确保回答结构清晰,分步骤说明配置方法,注意事项,以及验证方式。最后生成相关问题,覆盖应用场景、与其他参数的关系、Oracle RAC的特殊配置等,符合用户给的示例中的问题格式。</think>### 如何在Linux中配置使用rp_filter参数 #### 1. **rp_filter参数的作用** `rp_filter`(Reverse Path Filtering)是Linux内核用于验证数据包来源的机制,通过反向路径检查防止IP地址欺骗攻击。其工作模式如下: - **0(关闭)**:不进行反向路径验证。 - **1(严格模式)**:检查数据包的源地址是否可通过接收网卡的路由表返回,否则丢弃[^1]。 - **2(宽松模式)**:只要存在任一网卡可通过路由到达源地址即放行[^2]。 #### 2. **配置方法** ##### 临时生效(重启后失效) ```bash # 查看当前配置 sysctl net.ipv4.conf.all.rp_filter # 修改配置(以eth0网卡为例) echo 2 > /proc/sys/net/ipv4/conf/eth0/rp_filter ``` ##### 永久生效 1. 编辑`/etc/sysctl.conf`文件: ```bash # 全局设置 net.ipv4.conf.default.rp_filter = 2 net.ipv4.conf.all.rp_filter = 2 # 按网卡单独设置(例如私网网卡eth2、eth3) net.ipv4.conf.eth2.rp_filter = 2 net.ipv4.conf.eth3.rp_filter = 2 ``` 2. 应用配置: ```bash sysctl -p ``` #### 3. **特殊场景示例** - **Oracle RAC多私网网卡**:若使用HAIP实现私网冗余,需将所有私网网卡的`rp_filter`设为`2`以避免网络不通[^2]。 - **多网卡负载均衡**:结合`arp_filter=1`,确保ARP响应与路由表一致[^1]。 #### 4. **验证与调试** ```bash # 检查配置是否生效 cat /proc/sys/net/ipv4/conf/eth2/rp_filter # 网络测试(替换为目标IP) ping -I eth2 192.168.1.100 ``` 若出现丢包,可临时将`rp_filter`设为`0`进行问题排查[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔_牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值