美文网首页LinuxLinux学习之路
Linux命令学习手册-ip

Linux命令学习手册-ip

作者: QuietHeart | 来源:发表于2020-05-12 09:30 被阅读0次

    摘自 man 手册:

    ip [ OPTIONS ] OBJECT { COMMAND | help }
    ip [ -force ] -batch filename
      
    OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |netns | l2tp | tcp_metrics | token | macsec }
    
    OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link} | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] |-ts[hort] | -n[etns] name | -a[ll] | -c[olor] -br[ief] }
    

    功能

    Linux下的 ip 命令可以显示和操作路由表、网络设备、网络接口和隧道等。

    举例

    网口相关

    显示当前接口信息

    $ip link list
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
        link/ether f0:de:f1:f0:08:60 brd ff:ff:ff:ff:ff:ff
    3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        link/ether 44:6d:57:5e:28:6c brd ff:ff:ff:ff:ff:ff
    

    这里,显示出有一个 eth0 网卡,一个无线网卡 wlan0 和一个回环 lo ,其中 eth0 卡处于 down 的状态(因为使用 ifconfig eth0 down 将其禁用,使用 ifconfig 无法再看见 eth0 只能用 ifconfig -aip link list 开查看)。

    启用网口

    $ip link set eth0 up
    

    也可用 ifconfig eth0 up ,建议用较新的 ip 命令。

    关闭网口

    $ip link set eth0 down
    

    也可用 ifconfig eth0 down

    显示 neighbor/arp

    $ip neigh show
    192.168.1.1 dev wlan0 lladdr ec:17:2f:3e:5b:4e STALE
    

    IP地址相关

    删除 eth0 的一个 ip 地址

    #ip addr del 192.168.1.222 dev eth0
    

    注: 一个网卡是可以有多个 ip 地址的, ip 地址是吊链的结构, ip 会返回网卡的所有 ip 地址,而 ifconfig 只返回首次设置的, ip 使用 netlink 设置网卡,而 ifconfig 直接使用 ioctl

    eth0 添加一个 ip 地址

    #ip addr add 192.168.1.111 dev eth0
    

    添加之后,在原有网址基础上,可以也可访问 192.168.1.111 到达本机,但是只有第一次添加的 addrifconfig 中显示。

    查看 ip 地址

    #ip addr show
    

    查看网卡上的 ip 地址,相对 ifconfig ,此命令显示一个网卡上所有的 ip ,而 ifconfig 只显示第一个。

    删除所有的 ip 地址

    #ip addr flush dev eth0
    

    路由表相关

    显示所有路由表

    $ip rule list
    0:      from all lookup local 
    32766:  from all lookup main 
    32767:  from all lookup default
    

    表名和编号对应信息可以查看 /etc/iproute2/rttables

    显示路由表信息

    $ip route show
    default via 192.168.1.1 dev wlan0  proto static 
    192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.100  metric 2
    

    这里,默认显示 main 的路由表信息。通过 ip route 显示内核路由表,比只用 route 更为强大,后者只能对系统确认默认路由操作,而前者可以实现策略路由。

    显示指定路由表信息

    $ip route list table local
    broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
    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
    broadcast 192.168.1.0 dev wlan0  proto kernel  scope link  src 192.168.1.100
    local 192.168.1.100 dev wlan0  proto kernel  scope host  src 192.168.1.100
    broadcast 192.168.1.255 dev wlan0  proto kernel  scope link  src 192.168.1.100
    

    实践

    一个实践问题

    假设:

    无线网卡:192.168.0.109
    有线网卡:192.168.0.216
    两者在同一网段。
    

    一般内核默认配置的路由表在 route 命令下可以操作和查看,但是会有问题。例如,

    #netstat -rn
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    default     192.168.0.1         255.255.255.0   U         0 0          0 eth0
    192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
    192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 wlan0
    

    拔网线之后,如果其 route 显示的路由还有 eth0 的选项,那么匹配的时候还是选择从 eth0 口发送数据,这时候将会导致网络不通。

    所以采用如下:

    $ip rule delete from 192.168.0.216
    $ip rule delete from 192.168.0.109
    $ip rule delete to 192.168.0.216
    $ip rule delete to 192.168.0.109
    $ip route flush table main
    $ip route flush table 200
    $ip route flush table 201
    $ip route flush cache
    

    这里,将所有内容清空。

    $ip route add 192.168.0.0/24 dev eth0 table 200
    $ip route add 192.168.0.0/24 dev ra0 table 201
    $ip rule add from 192.168.0.216 table 200
    $ip rule add from 192.168.0.109 table 201
    $ip route flush cache
    

    这里,添加路由规则,然后使用 ip route flush cache 使其立即生效。注意这里的 from ,表示数据发自哪里。这个例子表示,如果来自 192.168.0.216 则使用 table 200 指定的路由表,如果来自 192.168.0.109 则使用 table 201 指定的路由表。

    $route add -net 192.168.0.0/24 dev ra0
    $route add -net 192.168.0.0/24 dev eth0
    $route add default gw 192.168.0.1 dev eth0
    

    这里设置的实际是 main 路由,实际没有作用, 路由规则指定使用的是 table 200table 201

    如上设置之后,当外部

    $ping 192.168.0.109
    

    会使用201的路由。

    当外部

    $ping 192.168.0.216
    

    会使用200的路由。

    插拔网线不会影响ip rule建立的规则,所以不会影响网络的通畅。

    例子总结

    设置命令:

    # ip rule delete from 192.168.0.216
    # ip rule delete from 192.168.0.109
    # ip route flush table main
    # ip route flush table 200
    # ip route flush table 201
    # ip route flush cache
    # ip route add 192.168.0.0/24 dev eth0 table 200
    # ip route add 192.168.0.0/24 dev ra0 table 201
    # ip rule add from 192.168.0.216 table 200
    # ip rule add from 192.168.0.109 table 201
    # ip route flush cache
    # route add -net 192.168.0.0/24 dev ra0
    # route add -net 192.168.0.0/24 dev eth0
    # route add default gw 192.168.0.1 dev eth0
    

    查看路由与规则设置

    1. 查看路由规则

      # ip rule list
      0:      from all lookup local 
      32764:  from 192.168.0.109 lookup 201 
      32765:  from 192.168.0.216 lookup 200 
      32766:  from all lookup main 
      32767:  from all lookup default
      

      规则的优先级小的靠前,(即由上到下依次进行), 找到匹配的路由则进入,无论是否可达目的,找不到则找下一条规则对应路由直至匹配。

    2. 查看指定路由

      # ip route list table 200
      192.168.0.0/24 dev eth0
      

      这里,假设设置了: ip route add to unreachable 192.168.0.0/24 table 200 ,这样根据前面的 rule 匹配规则,进行 ping 192.168.0.216 也会进入这里,并且返回网络不可达(即便后面的 main 中有正确的路由项信息也不会使用)。

      # ip route list table 201
      192.168.0.0/24 dev ra0 
      
      # ip route list table main
      192.168.0.0/24 dev eth0 
      192.168.0.0/24 dev ra0 
      default via 192.168.0.1 dev eth0
      
    3. 查看默认路由

      这里, 对于前面最后的 main 默认 table ,也可用如下三种命令查看:

      #ip route
      192.168.0.0/24 dev eth0 
      192.168.0.0/24 dev ra0 
      default via 192.168.0.1 dev eth0 
      
      # netstat -rn
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
      192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
      192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 ra0
      0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0
      
      # route 
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
      192.168.0.0     *               255.255.255.0   U     0      0        0 ra0
      default         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
      

      这里, netstat -rnroute 要快一些。

    4. 其它

      注意: ip route add 中的 src 信息不太懂,还有使用 ip addr del 删除 ip 会导致所有表里对应内容消失。

    其它

    未整理

    以下内容也是来自实际例子,尚未仔细整理仅供参考。

    杂乱

    创建两个路由表

    创建主要有三个过程,如下。

    1. (1)建立映射表。

      #echo 200 T1 >>/etc/iproute2/rttables
      #echo 300 T2 >>/etc/iproute2/rttables
      

      如果不建立映射,则在后面的命令中直接使用 tableid 而非别名。

    2. (2)添加路由表。

      #ip rule add from 1.1.1.1 table T1
      #ip rule add to 1.1.1.1 table T2
      

      这里,指定了创建时使用该路由表的网络包对应的规则,这样符合特定规则的网络包,就可选择特定的路由表(main路由表无规则,所以没有匹配那个路由表的时候,就用main)。

      例如此处来自 1.1.1.1 的包使用 T1 路由表,通往 1.1.1.1 的包使用 T2 路由表。

    3. (3)向指定路由表追加表项。

      例如:

      # ip route add 1.1.1.0/24 dev eth0 table T1
      # ip route add 1.1.1.0/24 dev ra0 table T2
      

      意思是, T1 路由表通过 eth0 网络设备传输(一般是有线网卡), T2 路由表通过 ra0 网络设备传输(一般是无线网卡)。

    4. 默认路由表

      如无特殊规则,会使用默认路由表,对于 main 默认路由表,也可如下添加

      # route add -net 1.1.1.0/24 dev ra0
      # route add -net 1.1.1.0/24 dev eth0
      # route add default gw 1.1.1.1 dev eth0
      

      路由表项的意思是自动会以 1.1.1.1 为默认网关,通过 eth0 来传输网络包,而 1.1.1.0/24 网段的包,由于后添加的,在 route 命令输出中显示在前面,所以有限采用 eth0 传输。

    双网卡机器的网络设置

    假设当前状况是:

    • 有线网卡 ETH0: 192.168.27.120
    • 无线网卡 WLAN0: 192.168.1.100
    1. 向默认路由表 main 添加路由项

      # ip route add default via 192.168.27.1 dev eth0
      # ip route add 192.168.27.0/24 src 192.168.27.120 dev eth0
      # ip route add 192.168.1.0/24 src 192.168.1.100 dev wlan0
      

      将相关的表项添加默认路由表中。这样,不同ip地址的数据包,会对应到对应的网卡上。

    2. 显示默认路由表 main 的内容

      # ip route
      default via 192.168.27.1 dev eth0  proto static 
      169.254.0.0/16 dev wlan0  scope link  metric 1000 
      192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.100  metric 2 
      192.168.27.0/24 dev eth0  proto kernel  scope link  src 192.168.27.120  metric 1
      

      这里用 route 命令显示的就是 main 路由表的内容。

    3. 设置其它路由表名称映射

      # echo 300 eth_table >>/etc/iproute2/rttables
      # echo 400 wifi_table >>/etc/iproute2/rttables
      

      这会为 id300400 的路由表分别建立两个名字映射 eth_tablewifi_table

    4. eth_table 路由表添加规则和内容

      # ip rule add from $ETH_IP table eth_table
      # ip route add default via $ETHGATE_IP dev eth0 table eth_table
      # ip route add $ETH_NET src $ETH_IP dev eth0 table eth_table
      

      这里, ip rule 指定来源于 $ETH_IP 的包,使用 eth_table 这个路由表。添加之后使用 ip route flush cache 才能立即生效。

    5. 显示 eth_table 路由表内容

      # ip route list table eth_table
      default via 192.168.27.1 dev eth0 
      192.168.27.0/24 dev eth0  scope link  src 192.168.27.120
      

      注意,这里显示特定的路由表(非默认)的时候,使用的是 ip route list table xxx 命令。

    6. wifi_table 路由表添加规则和内容

      # ip rule add from $WIFI_IP table wifi_table
      # ip route add default via $WIFIGATE_IP dev wlan0 table wifi_table
      # ip route add 192.168.1.0/24 src 192.168.1.100 dev wlan0 table wifi_table
      
    7. 显示 witi_table 路由表内容

      #ip route list table wifi_table
      default via 192.168.1.1 dev wlan0 
      192.168.1.0/24 dev wlan0  scope link  src 192.168.1.100
      
    8. 检查总路由规则

      至此,我们看到规则:

      # ip rule list
      0:      from all lookup local 
      32764:  from 192.168.1.100 lookup wifi_table 
      32765:  from 192.168.27.120 lookup eth_table 
      32766:  from all lookup main 
      32767:  from all lookup default
      

      不同的情况,会使用不同的路由表。

    9. 测试结果

      经过实践,我们可以得到如下测试结果:

      PC->192.168.1.102 ok
      

      经过 wifi_table

      PC->192.168.3.16 ok
      

      经过……(应该是 main)

      192.168.1.102->192.168.1.100 ok
      192.168.3.16-> 192.168.1.100 ok
      

    NEXT 其它操作

    以下是比较常用的操作,具体结果可能在不同环境有所不同,有待实践,这里仅供参考。

    • 按照特定的优先权设置下一跳

      #ip route add default scope global nexthop via 192.168.27.1 dev eth0 weight 50 nexthop via 192.168.1.1 dev wlan0 weight 50
      #ip route add default scope global nexthop via 192.168.1.1 dev eth0 weight 50 nexthop via 192.168.1.1 dev ra0 weight 50
      
    • 更换网段

    • 删除路由

    • 关于优先权

      #ip rule add priority 100 xxx
      

      priority 由高到低,越来越大。

    • 清空路由 main

      #ip route flush table main
      
    • 添加一个不可达网络

      #ip route add to unreachable 192.168.0.0/24
      

      这里,不要指定 dev

    在运行任何这些命令都需要发送 ip route flush cache 命令来刷新路由缓冲,否则命令在一段时间以后才会生效,这段时间的长短依赖于路由表结构的大小和负载。

    参考

    相关文章

      网友评论

        本文标题:Linux命令学习手册-ip

        本文链接:https://www.haomeiwen.com/subject/lazwrhtx.html