V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
lindas
V2EX  ›  Linux

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

  •  1
     
  •   lindas · 2023-05-06 11:16:19 +08:00 · 2067 次点击
    这是一个创建于 567 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近我在学习策略路由,因此接触到了 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 
    
    12 条回复    2023-05-18 16:24:49 +08:00
    bingfengfeifei
        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 是给屏蔽掉了。
    Huelse
        2
    Huelse  
       2023-05-06 14:23:13 +08:00
    据我所知,所有本地流量都会走 lo 接口的,无论你分配什么网卡
    iBugOne
        3
    iBugOne  
       2023-05-06 14:25:59 +08:00 via Android   ❤️ 1
    对于 local 类型的路由,dev 的意义在于响应 ARP/NDP ,尤其是当你设置 net.ipv4.conf.all.arp_filter=1 的时候
    githmb
        4
    githmb  
       2023-05-06 14:36:10 +08:00
    感觉很合理啊,机器可能接入不同的子网,这些子网直接可能无法通信,一个绑定到 A 网的 socket 无法连接到 B 网的其它机器,但是仍然可以和本机的 B 网 IP 通信
    artnowben
        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
    artnowben
        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
    mrzx
        7
    mrzx  
       2023-05-06 15:42:01 +08:00
    请问 OP 一下,你是出于什么需求或者场景,需要用策略路由啊?
    digimoon
        8
    digimoon  
       2023-05-06 15:49:26 +08:00
    @mrzx 一般最简单的场景是,哪个网卡进来的数据,就从哪个网卡原路出去
    lindas
        9
    lindas  
    OP
       2023-05-06 16:57:07 +08:00
    @mrzx 多网卡环境下给不同网卡配置默认路由的时候会用到
    lindas
        10
    lindas  
    OP
       2023-05-06 17:46:33 +08:00
    @artnowben 还真是,看来在 Linux kernel 里的协议栈有对本机发本机的流量做什么处理
    lindas
        11
    lindas  
    OP
       2023-05-06 17:48:57 +08:00
    @githmb 对呀,接触到 ip route 的 local 路由表之前一直觉得很正常,看到 ip route 的 local 路由表之后也只是对 ip route 产生疑问而已
    julyclyde
        12
    julyclyde  
       2023-05-18 16:24:49 +08:00
    @lindas 应该不存在“不同网卡的”默认路由这个概念
    route 和 interface 是不同层次的概念

    multihomed 主机配置路由的时候,如果不用策略路由、源路由等特殊情况,那基本上就只能有一个“默认”了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:04 · PVG 07:04 · LAX 15:04 · JFK 18:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.