如何使用 iproute2 仅删除 IPv6 地址?

jon*_*rry 3 networking linux dhclient

我正在尝试编写一个可以更改本地机器 IP 地址的应用程序。在做一些实验时,我注意到如果我刚连接到无线网络,我会被分配一个 IPv6 地址,它是 MAC 地址的函数。考虑以下命令序列:

<disconnect wireless and reconnect>
$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:0c:29:7d:7c:42  
          inet addr:192.168.2.98  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe7d:7c42/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST...
$ sudo ip addr flush dev eth0
$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:0c:29:7d:7c:42  
          UP BROADCAST RUNNING MULTICAST...
$ sudo dhclient eth0
$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:0c:29:7d:7c:42  
          inet addr:192.168.2.98  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST
Run Code Online (Sandbox Code Playgroud)

请注意,刷新后,我丢失了 IPv4 和 IPv6 地址,但使用 续订后dhclient,我只重新初始化了我的 IPv4 地址。为什么是这样?我该怎么做才能自动重新分配我的 IPv6 地址?

lit*_*ude 5

您可以只刷新 IPv4 地址,而不是从接口刷新所有 ip 地址。这是一个示例,其中我有一个带有 IPv4 和 IPv6 地址的接口:

# ip address show qemu-br2
5: qemu-br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether ca:b8:97:12:0a:30 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.1/24 scope global qemu-br2
   valid_lft forever preferred_lft forever
inet6 fe80::c8b8:97ff:fe12:a30/64 scope link
   valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

仅刷新 IPv4:

# ip -4 address flush qemu-br2
Run Code Online (Sandbox Code Playgroud)

看到 IPv6 仍然存在:

# ip address show qemu-br2
5: qemu-br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether ca:b8:97:12:0a:30 brd ff:ff:ff:ff:ff:ff
inet6 fe80::c8b8:97ff:fe12:a30/64 scope link
   valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

一般来说,您可以分别添加-4-6使iproute2命令仅作用于 IPv4 或 IPv6 地址。