如何在没有物理适配器的机器上创建虚拟以太网接口?

STW*_*STW 94 networking ip ethernet iproute network-interface

我有一台戴尔 XPS 13 超级本,它有一个 wifi 网卡,但没有物理以太网网卡(wlan0,但没有 eth0)。我需要为使用与流浪NFS创建一个虚拟适配器,但我发现,典型的ifup eth0:1...失败ignoring unknown interface eth0:1=eth0:1。我也尝试创建一个针对 的虚拟接口wlan0,但收到了相同的结果。

如何在这台没有物理接口的机器上创建虚拟接口?

slm*_*slm 132

设置虚拟接口

如果您想创建网络接口,但没有物理 NIC 来支持它,您可以使用虚拟链接类型。您可以在此处阅读有关它们的更多信息:iproute2 Wikipedia page

创建 eth10

要制作此界面,您首先需要确保已加载虚拟内核模块。你可以这样做:

$ sudo lsmod | grep dummy
$ sudo modprobe dummy
$ sudo lsmod | grep dummy
dummy                  12960  0 
Run Code Online (Sandbox Code Playgroud)

现在加载驱动程序后,您可以创建您喜欢的虚拟网络接口:

$ sudo ip link add eth10 type dummy
Run Code Online (Sandbox Code Playgroud)

注意:在旧版本中,ip您会像这样执行上述操作,但在此过程中似乎发生了变化。将其保留在此处以供参考,但根据评论的反馈,上述内容现在有效。

$ sudo ip link set name eth10 dev dummy0
Run Code Online (Sandbox Code Playgroud)

并确认:

$ ip link show eth10
6: eth10: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default 
    link/ether c6:ad:af:42:80:45 brd ff:ff:ff:ff:ff:ff
Run Code Online (Sandbox Code Playgroud)

更改 MAC

然后,您可以根据需要更改 MAC 地址:

$ sudo ifconfig eth10 hw ether 00:22:22:ff:ff:ff
$ ip link show eth10
6: eth10: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default 
    link/ether 00:22:22:ff:ff:ff brd ff:ff:ff:ff:ff:ff
Run Code Online (Sandbox Code Playgroud)

创建别名

然后,您可以在 eth10 之上创建别名。

$ sudo ip addr add 192.168.100.199/24 brd + dev eth10 label eth10:0
Run Code Online (Sandbox Code Playgroud)

并像这样确认它们:

$ ifconfig -a eth10
eth10: flags=130<BROADCAST,NOARP>  mtu 1500
        ether 00:22:22:ff:ff:ff  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ ifconfig -a eth10:0
eth10:0: flags=130<BROADCAST,NOARP>  mtu 1500
        inet 192.168.100.199  netmask 255.255.255.0  broadcast 192.168.100.255
        ether 00:22:22:ff:ff:ff  txqueuelen 0  (Ethernet)
Run Code Online (Sandbox Code Playgroud)

或使用ip

$ ip a | grep -w inet
    inet 127.0.0.1/8 scope host lo
    inet 192.168.1.20/24 brd 192.168.1.255 scope global wlp3s0
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
    inet 192.168.100.199/24 brd 192.168.100.255 scope global eth10:0
Run Code Online (Sandbox Code Playgroud)

删除这一切?

如果你想放松这一切,你可以运行这些命令来做到这一点:

$ sudo ip addr del 192.168.100.199/24 brd + dev eth10 label eth10:0
$ sudo ip link delete eth10 type dummy
$ sudo rmmod dummy
Run Code Online (Sandbox Code Playgroud)

参考

  • 我应该将此设置放在 rc.local 中,以便它在重新启动后仍然存在吗? (2认同)

phe*_*mer 34

您可以使用iproute2工具包创建虚拟接口。

ip link add veth0 type veth peer name veth1
Run Code Online (Sandbox Code Playgroud)

这将创建 2 个接口,veth0veth1. 将它们视为管道的两端。发送到的任何流量veth0都会出来veth1,反之亦然。

如果您希望路由流量,您可以执行以下操作:

sysctl -w net.ipv4.conf.veth0.forwarding=1
Run Code Online (Sandbox Code Playgroud)

这将告诉内核转发来自veth0(因此veth1用于使用的端点)的流量。

另一种选择是veth0与另一个接口建立桥接。然后,任何通过虚拟接口的流量都将路由到网络,就好像您的机器只是充当交换机一样。

您还可以使用此流量做许多其他事情(伪装、重定向、DNAT 等),但这取决于您要完成的任务。

拆掉它:

ip link del veth0
Run Code Online (Sandbox Code Playgroud)


Gab*_*les 8

在 Linux 上添加虚拟(虚拟)接口设备

\n

...以及命令介绍ip address以及添加或删除 IP 地址和网络掩码。

\n

在 Ubuntu 18.04 和 22.04 上测试。

\n

快速总结

\n

简洁版本:

\n
# create a virtual `eth_dummy` interface\nsudo ip link add eth_dummy type dummy\n# Add some required IPs and netmasks to it\nsudo ip address add 10.0.0.1/24 dev eth_dummy\nsudo ip address add 192.168.2.1/24 dev eth_dummy\nsudo ip address add 200.201.202.203/24 dev eth_dummy\n# view it\nip a  \n# delete it when all done using the interface and running your tests\nsudo ip link delete eth_dummy\n
Run Code Online (Sandbox Code Playgroud)\n

稍微详细一点的版本:

\n
# See all network interface devices and their IPs and netmasks\nip address\nip a  # Or (same thing) short version\n\n# Create a virtual (dummy) interface named `eth_dummy`.\nsudo ip link add eth_dummy type dummy\n# see that it exists now\nip a\n\n# Give it 3 IP addresses with netmask `/24` (255.255.255.0)\nsudo ip address add 10.0.0.1/24 dev eth_dummy\nsudo ip address add 192.168.2.1/24 dev eth_dummy\nsudo ip address add 200.201.202.203/24 dev eth_dummy\n# See that it has these 3 IP addresses with netmask `/24` now\nip a\n\n# Delete `200.201.202.203/24` on the `eth_dummy` virtual (dummy) interface\nsudo ip address del 200.201.202.203/24 dev eth_dummy\n# See that the above IP is gone now\nip a \n\n# Delete the whole `eth_dummy` interface\nsudo ip link delete eth_dummy\n# See that it is gone now\nip a\n
Run Code Online (Sandbox Code Playgroud)\n

细节

\n

1. 基础知识

\n
    \n
  1. 创建虚拟(虚拟)适配器/接口设备

    \n
    # 1. Install the "dummy" socket interface Linux kernel module.\nsudo modprobe dummy\n\n# 2. Ensure the "dummy" Linux kernel module is installed.\nsudo lsmod | grep dummy\n\n# 3. View all existing socket interfaces/adapters, whether WiFi, Ethernet,\n# or virtual (dummy)\nip address\nip a  # or (short version of the command above)\n\n# 4. Create a virtual (dummy) interface named `eth_dummy`.\nsudo ip link add eth_dummy type dummy\n\n# 5. View it. You\'ll now see "eth_dummy" as one of your attached interfaces.\nip address\n\n# 6. Add an IP address and netmask to this new dummy interface. Use any IP\n# address and netmask you like. Ex: `10.0.0.1/24` in this case. \n# - Note that the `/24` means that the first (most-significant, or\n#   left-most) 24 bits of the 32-bit netmask will be set to 1\'s. This\n#   (`/24`) is the same as `255.255.255.0`. See below for details and a\n#   full list of possible netmasks.\n# - See `ip address help` for command syntax help. \nsudo ip address add 10.0.0.1/24 dev eth_dummy\n\n# 7. See the newly-created device and the IP address you just\n# assigned to it.\nip address\n
    Run Code Online (Sandbox Code Playgroud)\n

    就是这样!

    \n
  2. \n
  3. 将 IP 地址添加到您的接口:

    \n

    您可以向网络接口添加任意数量的 IP 地址。

    \n

    如果您使用套接字同时从许多不同的 IP 地址接收(绑定到并接收),您可以轻松地将它们全部添加到这一虚拟接口。

    \n

    在这里,我添加了另外两个我认为合适的 IP 地址和网络掩码:

    \n
    sudo ip address add 192.168.2.1/24 dev eth_dummy\nsudo ip address add 10.5.4.1/8 dev eth_dummy\n
    Run Code Online (Sandbox Code Playgroud)\n

    ip addresseth_dummy现在显示我的虚拟 ( ) 接口的以下内容type dummy。因此,我可以将我的 C、C++、Python 等套接字绑定到此接口上的 IP 地址10.0.0.1192.168.2.1、 和10.5.4.1。当您需要测试网络和模拟输出数据包而无需将真正的网络交换机插入计算机时,这对于飞机旅行非常有用(当我写这篇文章时,我正在飞机上。很确定这让我处于“英里”状态)高”编码俱乐部)。

    \n
    10: eth_dummy: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000\n    link/ether 4a:e7:bc:8f:2e:2d brd ff:ff:ff:ff:ff:ff\n    inet 10.0.0.1/24 scope global eth_dummy\n       valid_lft forever preferred_lft forever\n    inet 192.168.2.1/24 scope global eth_dummy\n       valid_lft forever preferred_lft forever\n    inet 10.5.4.1/8 scope global eth_dummy\n       valid_lft forever preferred_lft forever\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 删除或更新接口上的现有 IP 地址:

    \n

    要更改接口上的现有 IP 地址,您必须删除并重新添加它。该ip address change命令完全是另一回事——它更改现有 IP 地址上的标志/配置参数。因此,删除并重新添加接口上的 IP 地址,如下所示:

    \n
    # general form\nsudo ip address del <current_ip_address> dev <interface_device_name>\nsudo ip address add <new_ip_address> dev <interface_device_name>\n\n# Example: change `10.5.4.1/8` above to `32.42.52.62/28`\nsudo ip address del 10.5.4.1/8 dev eth_dummy\nsudo ip address add 32.42.52.62/28 dev eth_dummy\n\n# verify the change\nip address\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
  7. 删除整个虚拟接口设备:

    \n
    # 1. Delete this `eth_dummy` dummy device you created.\nsudo ip link delete eth_dummy\n\n# 2. Ensure \'eth_dummy\' is deleted and doesn\'t show up here now.\nip address\n
    Run Code Online (Sandbox Code Playgroud)\n
  8. \n
\n

完毕!

\n

要了解有关ip address addip address changetype 命令的更多信息,请参阅:

\n
    \n
  1. ip address help, 也:
  2. \n
  3. 这个答案在这里:服务器故障:理解“ip addr更改”和“ip地址替换”命令
  4. \n
\n

2、非标准形式

\n

我观察到,就像@Martin on ServerFault一样:

\n
\n

如果我执行ip addr change 10.11.12.6/24 dev eth0or ip addr replace 10.11.12.6/24 dev eth0then10.11.12.6只是添加到eth0.

\n
\n

也是如此ip addr add 10.11.12.6/24 dev eth0

\n

因此,您还可以使用或代替 向接口添加新的 IP 地址。但是,不要这样做。这真是令人困惑。该命令旨在添加新的 IP 地址,该命令旨在更改现有 IP 地址中的配置标志。请注意,不会更新或更改 IP 地址本身。为此,请先删除现有 IP 地址,然后添加新 IP 地址。似乎没有人真正知道它的用途或它与. 源代码给出了我想的答案。ip address changeip address replaceip address addaddchangechangedeladdreplacechange

\n

所以从技术上讲,这些都做同样的事情:

\n
# add IP address 10.11.12.6/24\nsudo ip address add 10.11.12.6/24 dev eth_dummy     # standard way to add this IP (recommended)\nsudo ip address change 10.11.12.6/24 dev eth_dummy  # non-standard way to add this IP\nsudo ip address replace 10.11.12.6/24 dev eth_dummy # non-standard way to add this IP\n
Run Code Online (Sandbox Code Playgroud)\n

您也可以将 IP 地址放在命令末尾,但这也是一种非标准形式。显示单词之前ip address help的IP(如IFADDR或“接口地址”)。因此,以下是替代形式:dev

\n
sudo ip address add 10.11.12.6/24 dev eth_dummy     # standard way to add this IP (recommended)\nsudo ip address add dev eth_dummy 10.11.12.6/24     # non-standard way to add this IP\n
Run Code Online (Sandbox Code Playgroud)\n

而且您不必输入整个单词address。该ip命令足够智能,一旦它看到某些参数address,它就会接受它,因为在这个位置没有其他参数以ip开头a。所以,这些都有效:

\n
sudo ip address add 10.11.12.6/24 dev eth_dummy  # standard form\n# "short", non-standard forms:\nsudo ip addres add 10.11.12.6/24 dev eth_dummy\nsudo ip addre add 10.11.12.6/24 dev eth_dummy\nsudo ip addr add 10.11.12.6/24 dev eth_dummy\nsudo ip add add 10.11.12.6/24 dev eth_dummy  # yeah that\'s confusing: `add add...`\nsudo ip ad add 10.11.12.6/24 dev eth_dummy\nsudo ip a add 10.11.12.6/24 dev eth_dummy\n
Run Code Online (Sandbox Code Playgroud)\n

最后,不要忘记/number最后指定网络掩码的部分。考虑以下:

\n
# This:\nsudo ip address add 10.11.12.6 dev eth_dummy\n# Defaults to this, which isn\'t very useful\nsudo ip address add 10.11.12.6/32 dev eth_dummy\n\n# So, remember to specify your own useful netmask, such as \n# `/24` (255.255.255.0), instead, like this:\nsudo ip address add 10.11.12.6/24 dev eth_dummy\n
Run Code Online (Sandbox Code Playgroud)\n

3. 网络掩码

\n

以下是将 IP 地址和网络掩码设置为 时可能的网络掩码的完整列表ip/netmask,例如10.0.0.1/24。这里/24的意思是 32 位网络掩码的第一个(最重要的或最左边的)24 位将被设置为1s。网络掩码/24与 相同255.255.255.0

\n

以下是可能的网络掩码的完整列表:

\n

全字节网络掩码:

\n
/32 = 255.255.255.255\n/24 = 255.255.255.0     # <== most common\n/16 = 255.255.0.0\n/8  = 255.0.0.0\n/0  = 0.0.0.0           # (I don\'t even know if this is a valid option)\n
Run Code Online (Sandbox Code Playgroud)\n

所有网络掩码:

\n
/32 = 255.255.255.255\n/31 = 255.255.255.254\n/30 = 255.255.255.252\n/29 = 255.255.255.248\n/28 = 255.255.255.240\n/27 = 255.255.255.224\n/26 = 255.255.255.192\n/25 = 255.255.255.128\n/24 = 255.255.255.0     # <== most common\n/23 = 255.255.254.0\n/22 = 255.255.252.0\n/21 = 255.255.248.0\n/20 = 255.255.240.0\n/19 = 255.255.224.0\n/18 = 255.255.192.0\n/17 = 255.255.128.0\n/16 = 255.255.0.0\n/15 = 255.254.0.0\n/14 = 255.252.0.0\n/13 = 255.248.0.0\n/12 = 255.240.0.0\n/11 = 255.224.0.0\n/10 = 255.192.0.0\n/9 = 255.128.0.0\n/8 = 255.0.0.0\n/7 = 254.0.0.0\n/6 = 252.0.0.0\n/5 = 248.0.0.0\n/4 = 240.0.0.0\n/3 = 224.0.0.0\n/2 = 192.0.0.0\n/1 = 128.0.0.0\n/0 = 0.0.0.0            # (I don\'t even know if this is a valid option)\n
Run Code Online (Sandbox Code Playgroud)\n

4.更多细节

\n

lsmod显示“Linux 内核中模块的状态”(请参阅​​ 参考资料man lsmod)。试试看!只需输入

\n
/32 = 255.255.255.255\n/24 = 255.255.255.0     # <== most common\n/16 = 255.255.0.0\n/8  = 255.0.0.0\n/0  = 0.0.0.0           # (I don\'t even know if this is a valid option)\n
Run Code Online (Sandbox Code Playgroud)\n

其中一个模块称为dummy. 让我们看看它是否在那里:

\n
/32 = 255.255.255.255\n/31 = 255.255.255.254\n/30 = 255.255.255.252\n/29 = 255.255.255.248\n/28 = 255.255.255.240\n/27 = 255.255.255.224\n/26 = 255.255.255.192\n/25 = 255.255.255.128\n/24 = 255.255.255.0     # <== most common\n/23 = 255.255.254.0\n/22 = 255.255.252.0\n/21 = 255.255.248.0\n/20 = 255.255.240.0\n/19 = 255.255.224.0\n/18 = 255.255.192.0\n/17 = 255.255.128.0\n/16 = 255.255.0.0\n/15 = 255.254.0.0\n/14 = 255.252.0.0\n/13 = 255.248.0.0\n/12 = 255.240.0.0\n/11 = 255.224.0.0\n/10 = 255.192.0.0\n/9 = 255.128.0.0\n/8 = 255.0.0.0\n/7 = 254.0.0.0\n/6 = 252.0.0.0\n/5 = 248.0.0.0\n/4 = 240.0.0.0\n/3 = 224.0.0.0\n/2 = 192.0.0.0\n/1 = 128.0.0.0\n/0 = 0.0.0.0            # (I don\'t even know if this is a valid option)\n
Run Code Online (Sandbox Code Playgroud)\n

是的,它就在那里。好的。该 Linux 内核模块必须存在,您才能运行sudo ip link add eth_dummy type dummy上述命令以使用内核模块创建虚拟接口dummy。如果您没有,请参阅@slm的回答

\n

在创建新的虚拟接口之前,请运行此命令以查看您已有的 IP 地址和接口:

\n
lsmod\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以看看这个:

\n
$ lsmod | grep dummy\ndummy                  16384  0\n
Run Code Online (Sandbox Code Playgroud)\n

创建新的虚拟接口后,您将在ip address上面命令的输出中看到它。注意:ifconfig可能不会显示您创建的虚拟虚拟设备,但ip address会显示。

\n
\n

等等,但我的同事跑了sudo ip addr change 10.0.0.1 dev eth_dummy, 代替sudo ip address change 10.0.0.1 dev eth_dummy(通知addr代替address)。或者,也许他们跑了sudo ip a change 10.0.0.1 dev eth_dummy(通知a代替address)。那是怎么回事!?

\n

嗯,这个特定的命令只需要足够的字符来确保它知道你的意思。换句话说,一旦命令中有足够的字符使其知道您不可能表示任何其他命令,它就会接受它。由于在ip以字母 , 开头a之后没有其他子命令ip a就足够了。因此,以下所有命令都是等效的:

\n
ip address\n
Run Code Online (Sandbox Code Playgroud)\n

help在共享信息和查看菜单和页面时请注意这种奇怪的事情man(如下面我的参考文献所示)。否则,您会像我一样感到困惑,无论您如何努力搜索,都找不到这些页面中任何位置列出的a(as in ip a) 或addr(as in ip addr) 命令。只要意识到这两个都是 的缩写address。啊...现在在帮助页面中!

\n
ifconfig\n
Run Code Online (Sandbox Code Playgroud)\n

参考

\n
    \n
  1. @slm 的回答在这里
  2. \n
  3. ip help
  4. \n
  5. man ip
  6. \n
  7. ip link help
  8. \n
  9. man ip link
  10. \n
  11. ip address help
  12. \n
  13. man ip address
  14. \n
  15. 服务器故障:理解“ip addrchange”和“ipaddrreplace”命令ip address add- 对于理解、ip address change、 和ip address replace以及 之间的区别非常有用ip address del
  16. \n
\n

也可以看看

\n
    \n
  1. [我的答案] AskUbuntu:如何任意启用/禁用网络(以太网或wifi)设备
  2. \n
  3. LinuxHandbook.com:如何在 Linux 中更改 IP 地址
  4. \n
\n