Linux 允许一个网络接口拥有多个 IPv4 地址,除了第一个地址外,其它的称为 alias 地址
通过 ‘ifconfig’ 可以添加一个 alias 地址。例如以下命令,为 eth0 添加一个新的地址 192.168.2.2,
# ifconfig eth0:0 192.168.2.2
用 ‘ifconfig’ 可以看到系统中多了一个 eth0:0 的接口,但实际它不是接口,而是标签 (label),只不过 ‘ifconfig’ 把它显示成一个接口的样子。内核中也并不存在这样的 struct net_device 的结构。如果用工具 ‘ip’ 就可以更清楚的看到这一点。
在内核中,net_device 并不保存 IP 地址,这是因为它是一个通用的结构,可用于不同的协议族,除了 IPv4,还可以用于 IPv6 或者其它协议族。
因此, IPv4 协议族有专门的结构:struct in_device
而这个结构中的 ifa_list 用于保存 IPv4 地址
struct in_ifaddr *ifa_list;
struct in_ifaddr
{
struct in_ifaddr *ifa_next;
struct in_device *ifa_dev;
struct rcu_head rcu_head;
u32 ifa_local;
u32 ifa_address;
u32 ifa_mask;
u32 ifa_broadcast;
u32 ifa_anycast;
unsigned char ifa_scope;
unsigned char ifa_flags;
unsigned char ifa_prefixlen;
char ifa_label[IFNAMSIZ];
};
前面的 eth0:0 就保存在这个结构的 ifa_label 成员中。可以通过系统调用 ioctl() 来为接口设置一个 alias address。