Linux 中的alias address
作者: 小馬哥 rstevens (rstevens2008@hotmail.com)
歡迎轉載,未經允許,請勿用於商業目的
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。