ifconfig和ip addr的区别?

1,107 views
Skip to first unread message

Guangyu Zhang

unread,
Jan 2, 2014, 8:08:53 AM1/2/14
to ustc_lug
我的电脑用ip addr可以看到两个地址,用ifconfig只能看到一个地址

ip addr

2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether d8:50:e6:db:a0:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.23/24 brd 192.168.1.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet 192.168.1.245/24 brd 192.168.1.255 scope global secondary enp3s0
       valid_lft forever preferred_lft forever
    inet6 2001:da8:d800:1472:da50:e6ff:fedb:a072/64 scope global dynamic 
       valid_lft 86381sec preferred_lft 14381sec
    inet6 fe80::da50:e6ff:fedb:a072/64 scope link 
       valid_lft forever preferred_lft forever

ifconfig

enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.23  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::da50:e6ff:fedb:a072  prefixlen 64  scopeid 0x20<link>
        inet6 2001:da8:d800:1472:da50:e6ff:fedb:a072  prefixlen 64  scopeid 0x0<global>
        ether d8:50:e6:db:a0:72  txqueuelen 1000  (Ethernet)
        RX packets 14492  bytes 10880712 (10.3 MiB)
        RX errors 0  dropped 14  overruns 0  frame 0
        TX packets 9217  bytes 1396181 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

配置网络是通过netctl配置的

cat /etc/netctl/mynetwork

Description='A basic static ethernet connection'
Interface=enp3s0
Connection=ethernet
IP=static
Gateway='192.168.1.1'
DNS=('202.38.64.56')
IP6=stateless

Bojie Li

unread,
Jan 2, 2014, 2:59:59 PM1/2/14
to ustc...@googlegroups.com
这是个好问题。ifconfig 和 ip addr 分别代表了 ip alias 和 secondary IP 两种机制。每个IP地址都有一个网卡 alias,还有一个标志位表示是 primary 还是 secondary IP。

IP的网卡 alias 就是 /etc/networking/interfaces 里那些 eth0:0, eth0:1……这些虚拟的网卡名称仅仅是为了给一块网卡添加多个IP地址。secondary IP 是独立的另一套机制。同一块网卡上的多个IP,只要网络号(网段)不一样,就都是 primary IP;像楼主这样同一个网段里设了多个IP的,第一个IP是primary,后面添加的都是secondary。当primary被删掉时,secondary 默认会自动提升成 primary。

primary 和 secondary IP 的主要区别是本地发包的时候如果 socket 没有 bind 特定IP,会选出口网卡上的 primary IP 作为源IP。楼主可以试试写一个 UDP server(不用自己动手,iperf 就行)监听0.0.0.0,然后发一个UDP包到 secondary IP,看回复包的源IP是什么。再试试 TCP server,由于建立了连接,回复包源IP就不会错。

ifconfig 是通过 ioctl,查看IP的时候,内核会遍历 ip alias 列表,对每个网卡 alias 只显示第一个IP(注意,不是把 primary IP 都打印出来)。而 ip addr 则是通过 netlink,会把所有IP都取出来,是否 secondary 的信息也会打印出来。ip addr 在设置IP的时候,又是不认网卡 alias 的。楼主可以试试用 ifconfig 设一个同网段的IP,会发现早先用 ip addr 添加的那些IP都不见了,因为它加进去的是 primary IP,会把原有的同网段 secondary IP 都干掉。

想不到一个小小的IP里面有这么多坑爹事吧。
--
-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en
 
---
You received this message because you are subscribed to the Google Groups "USTC_LUG" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ustc_lug+u...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Guangyu Zhang

unread,
Jan 3, 2014, 12:59:24 AM1/3/14
to ustc_lug
原来是这样。长知识了

Guangyu Zhang

unread,
Jan 3, 2014, 1:01:36 AM1/3/14
to ustc_lug
还有个问题就是我的网络设备名为什么是enp3s0呢?以前都是eth0什么的。我还有一台机器是从老的Archlinux一路升级过来的,设备名就还是eth0。这个东西是哪里设置的?

Chunhui He

unread,
Jan 3, 2014, 2:37:08 AM1/3/14
to ustc...@googlegroups.com
设备名是靠udev rules决定的,配置文件在/etc/udev/rules.d/70-persistent-net.rules

enp3s0这种形式好像是按照物理插槽来命名的,这样相比以前的ethX,多张网卡的时候不容易搞混。

wzyboy

unread,
Jan 5, 2014, 9:14:13 AM1/5/14
to ustc...@googlegroups.com
2014/1/3 Guangyu Zhang <zguan...@gmail.com>:
> 还有个问题就是我的网络设备名为什么是enp3s0呢?以前都是eth0什么的。我还有一台机器是从老的Archlinux一路升级过来的,设备名就还是eth0。这个东西是哪里设置的?


这是新版 udev 搞的。具体来说是自带的一个 /usr/lib/udev/rules.d/80-net-name-slot.rules
文件,规定用这种新式命名法来命名网卡。如果你不喜欢(我就不喜欢)这种新命名法的话,可以在 /etc/udev/rules.d/
通过配置文件去覆盖掉。可以 touch 一个同名的空文件,也可以创建一个到 /dev/null 的 symlink。

总之 udev 的自带规则放在 /usr/lib/udev/rules.d/ 里,自定义规则放在 /etc/udev/rules.d/
里。如果对自带规则不满意,就用自定义规则去覆盖掉即可。

Arch Linux 的话,早期版本的安装器会在 udev 装完后在 /etc/udev/rules.d 里放一个只有注释的
80-net-name-slot.rules,于是它就超驰了
/usr/lib/udev/rules.d/80-net-name-slot.rules 。
--
wzyboy
Link: https://wzyboy.im/
Twitter: @wzyboy

Guangyu Zhang

unread,
Jan 8, 2014, 7:52:53 PM1/8/14
to ustc_lug
正解啊 !太感谢了
Reply all
Reply to author
Forward
0 new messages