为什么在本机发往本机 ip 的流量都走 lo 网卡?

359 天前
 lindas

最近我在学习策略路由,因此接触到了 ip ruleip route 命令。在使用 ip route show table local 命令查看本地路由表时,我注意到了一条路由的信息如下:

local 192.168.2.37 dev ens18 proto kernel scope host src 192.168.2.37

这条路由似乎表示,源 IP 地址为 192.168.2.37 ,目标 IP 地址也为 192.168.2.37 的流量将从 ens18 网卡输出。然而,当我使用 ip route get from 192.168.2.37 to 192.168.2.37 命令查询路由时,输出结果显示 dev 为 lo:

local 192.168.2.60 from 192.168.2.37 dev lo uid 0 
    cache <local> 

因此,我有以下几个疑问:

  1. 除了 ip route 命令之外,是否还有其他机制控制本机发往本机的流量?
  2. 当添加本地路由时(例如 ip route add table local local 5.5.5.6 dev ens19),dev 字段的作用是什么?我进行了测试,无论将 dev 设置为 ens18 、ens19 还是 lo ,查询路由的结果始终输出到 dev lo

麻烦大佬指点一下~


补充一下我系统的信息

系统版本:

[root@archlinux ~]# uname -a
Linux archlinux 6.1.10-hardened1-1-hardened #1 SMP PREEMPT_DYNAMIC Tue, 07 Feb 2023 19:30:39 +0000 x86_64 GNU/Linux

ip 地址:

[root@archlinux ~]# ip address
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: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 3a:9a:34:ce:3f:86 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.2.37/24 brd 192.168.2.255 scope global dynamic noprefixroute ens18
       valid_lft 84848sec preferred_lft 84848sec
    inet6 fe80::fa61:fb21:1948:3202/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 46:df:d2:42:02:63 brd ff:ff:ff:ff:ff:ff
    altname enp0s19
    inet 192.168.2.60/24 brd 192.168.2.255 scope global dynamic noprefixroute ens19
       valid_lft 84848sec preferred_lft 84848sec
    inet6 fe80::f895:5e74:b58f:583f/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

local 路由表:

[root@archlinux ~]# ip route show table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 
local 192.168.2.37 dev ens18 proto kernel scope host src 192.168.2.37 
local 192.168.2.60 dev ens19 proto kernel scope host src 192.168.2.60 
broadcast 192.168.2.255 dev ens18 proto kernel scope link src 192.168.2.37 
broadcast 192.168.2.255 dev ens19 proto kernel scope link src 192.168.2.60 
1918 次点击
所在节点    Linux
12 条回复
bingfengfeifei
359 天前
`local - the destinations are assigned to this host. The packets are looped back and delivered locally.`
应该写了 local 就只能是往 lo 发了吧,我感觉 dev 是给屏蔽掉了。
Huelse
359 天前
据我所知,所有本地流量都会走 lo 接口的,无论你分配什么网卡
iBugOne
359 天前
对于 local 类型的路由,dev 的意义在于响应 ARP/NDP ,尤其是当你设置 net.ipv4.conf.all.arp_filter=1 的时候
githmb
359 天前
感觉很合理啊,机器可能接入不同的子网,这些子网直接可能无法通信,一个绑定到 A 网的 socket 无法连接到 B 网的其它机器,但是仍然可以和本机的 B 网 IP 通信
artnowben
359 天前
Linux 手机按摩膏,两个 IP 在同一个主机上,就没有必要出网卡。
如果有两个网卡,分别用 DPDK 程序相互通讯,就会出网卡,看起来就像两个主机之间通讯一样,因为 dpdk 程序是 bypass kernel ,直接使用网卡,不经过 Linux kernel 的协议栈。dperf 可以做这种试验,一个网卡做客户端,一个网卡做服务器 https://github.com/baidu/dperf
artnowben
359 天前
还有一种试验,把两个网卡分别放到一个独立的 network namespace 里面,他们之间通讯也会出网卡。
参考代码:
NIC=eth1
ADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1

ip netns list
ip netns add ns1
ip link set $NIC netns ns1
sleep 4

ip netns exec ns1 ifconfig $NIC up

ip netns exec ns1 ip addr add $ADDR/$PREFIX dev $NIC
ip netns exec ns1 route add default gw $GATEWAY
mrzx
359 天前
请问 OP 一下,你是出于什么需求或者场景,需要用策略路由啊?
digimoon
359 天前
@mrzx 一般最简单的场景是,哪个网卡进来的数据,就从哪个网卡原路出去
lindas
359 天前
@mrzx 多网卡环境下给不同网卡配置默认路由的时候会用到
lindas
359 天前
@artnowben 还真是,看来在 Linux kernel 里的协议栈有对本机发本机的流量做什么处理
lindas
359 天前
@githmb 对呀,接触到 ip route 的 local 路由表之前一直觉得很正常,看到 ip route 的 local 路由表之后也只是对 ip route 产生疑问而已
julyclyde
347 天前
@lindas 应该不存在“不同网卡的”默认路由这个概念
route 和 interface 是不同层次的概念

multihomed 主机配置路由的时候,如果不用策略路由、源路由等特殊情况,那基本上就只能有一个“默认”了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/937793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX