最近我在学习策略路由,因此接触到了 ip rule
和 ip 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>
因此,我有以下几个疑问:
ip route
命令之外,是否还有其他机制控制本机发往本机的流量?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
1
bingfengfeifei 2023-05-06 14:10:13 +08:00
`local - the destinations are assigned to this host. The packets are looped back and delivered locally.`
应该写了 local 就只能是往 lo 发了吧,我感觉 dev 是给屏蔽掉了。 |
2
Huelse 2023-05-06 14:23:13 +08:00
据我所知,所有本地流量都会走 lo 接口的,无论你分配什么网卡
|
3
iBugOne 2023-05-06 14:25:59 +08:00 via Android 1
对于 local 类型的路由,dev 的意义在于响应 ARP/NDP ,尤其是当你设置 net.ipv4.conf.all.arp_filter=1 的时候
|
4
githmb 2023-05-06 14:36:10 +08:00
感觉很合理啊,机器可能接入不同的子网,这些子网直接可能无法通信,一个绑定到 A 网的 socket 无法连接到 B 网的其它机器,但是仍然可以和本机的 B 网 IP 通信
|
5
artnowben 2023-05-06 15:13:21 +08:00 1
Linux 手机按摩膏,两个 IP 在同一个主机上,就没有必要出网卡。
如果有两个网卡,分别用 DPDK 程序相互通讯,就会出网卡,看起来就像两个主机之间通讯一样,因为 dpdk 程序是 bypass kernel ,直接使用网卡,不经过 Linux kernel 的协议栈。dperf 可以做这种试验,一个网卡做客户端,一个网卡做服务器 https://github.com/baidu/dperf |
6
artnowben 2023-05-06 15:16:51 +08:00 1
还有一种试验,把两个网卡分别放到一个独立的 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 |
7
mrzx 2023-05-06 15:42:01 +08:00
请问 OP 一下,你是出于什么需求或者场景,需要用策略路由啊?
|