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

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

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

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

答案1

设置虚拟接口

如果您想要创建网络接口,但缺少物理网卡支持,则可以使用虚拟链接类型。您可以在这里阅读有关它们的更多信息:iproute2 维基百科页面

创建eth10

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

$ sudo lsmod | grep dummy
$ sudo modprobe dummy
$ sudo lsmod | grep dummy
dummy                  12960  0 

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

$ sudo ip link add eth10 type dummy

笔记:在旧版本中,ip您会像这样执行上述操作,似乎一路上已经发生了变化。将其保留在这里仅供参考,但根据评论的反馈,上述内容现在有效。

$ sudo ip link set name eth10 dev dummy0

并确认一下:

$ 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

更改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

创建别名

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

$ sudo ip addr add 192.168.100.199/24 brd + dev eth10 label eth10:0

并像这样确认它们:

$ 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)

或者使用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

删除这一切?

如果您想解除所有这些,您可以运行以下命令来执行此操作:

$ 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

参考

答案2

您可以使用以下命令创建虚拟接口ip路由2工具包。

ip link add veth0 type veth peer name veth1

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

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

sysctl -w net.ipv4.conf.veth0.forwarding=1

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

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

您还可以利用此流量执行许多其他操作(伪装、重定向、DNAT 等),但这取决于您想要完成的任务。

拆掉它:

ip link del veth0

答案3

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

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

在 Ubuntu 18.04 和 22.04 上测试。

快速总结

简洁版本:

# create a virtual `eth_dummy` interface
sudo ip link add eth_dummy type dummy
# Add some required IPs and netmasks to it
sudo ip address add 10.0.0.1/24 dev eth_dummy
sudo ip address add 192.168.2.1/24 dev eth_dummy
sudo ip address add 200.201.202.203/24 dev eth_dummy
# view it
ip a  
# delete it when all done using the interface and running your tests
sudo ip link delete eth_dummy

稍微详细一点的版本:

# See all network interface devices and their IPs and netmasks
ip address
ip a  # Or (same thing) short version

# Create a virtual (dummy) interface named `eth_dummy`.
sudo ip link add eth_dummy type dummy
# see that it exists now
ip a

# Give it 3 IP addresses with netmask `/24` (255.255.255.0)
sudo ip address add 10.0.0.1/24 dev eth_dummy
sudo ip address add 192.168.2.1/24 dev eth_dummy
sudo ip address add 200.201.202.203/24 dev eth_dummy
# See that it has these 3 IP addresses with netmask `/24` now
ip a

# Delete `200.201.202.203/24` on the `eth_dummy` virtual (dummy) interface
sudo ip address del 200.201.202.203/24 dev eth_dummy
# See that the above IP is gone now
ip a 

# Delete the whole `eth_dummy` interface
sudo ip link delete eth_dummy
# See that it is gone now
ip a

细节

1. 基础知识

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

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

    就是这样!

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

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

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

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

    sudo ip address add 192.168.2.1/24 dev eth_dummy
    sudo ip address add 10.5.4.1/8 dev eth_dummy
    

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

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

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

    # general form
    sudo ip address del <current_ip_address> dev <interface_device_name>
    sudo ip address add <new_ip_address> dev <interface_device_name>
    
    # Example: change `10.5.4.1/8` above to `32.42.52.62/28`
    sudo ip address del 10.5.4.1/8 dev eth_dummy
    sudo ip address add 32.42.52.62/28 dev eth_dummy
    
    # verify the change
    ip address
    
  4. 删除整个虚拟接口设备:

    # 1. Delete this `eth_dummy` dummy device you created.
    sudo ip link delete eth_dummy
    
    # 2. Ensure 'eth_dummy' is deleted and doesn't show up here now.
    ip address
    

完毕!

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

  1. ip address help, 也:
  2. 这个答案在这里:服务器故障:理解“ip addrchange”和“ipaddrreplace”命令

2、非标准形式

我观察到,正如 @Martin 在 ServerFault 上所做的那样, 那:

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

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

所以,你也可以添加ip address change使用或ip address replace代替 为您的接口添加新的 IP 地址ip address add。但是,不要这样做。这真是令人困惑。该add命令的目的是添加一个新的 IP 地址,该change命令的目的是改变现有 IP 地址中的配置标志。请注意,确实change如此不是更新或更改 IP 地址本身。为此,请先del删除现有 IP 地址,然后add添加新 IP 地址。似乎没有人真正知道它replace的用途或它与change.源代码给出了我想的答案。

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

# add IP address 10.11.12.6/24
sudo ip address add 10.11.12.6/24 dev eth_dummy     # standard way to add this IP (recommended)
sudo ip address change 10.11.12.6/24 dev eth_dummy  # non-standard way to add this IP
sudo ip address replace 10.11.12.6/24 dev eth_dummy # non-standard way to add this IP

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

sudo ip address add 10.11.12.6/24 dev eth_dummy     # standard way to add this IP (recommended)
sudo ip address add dev eth_dummy 10.11.12.6/24     # non-standard way to add this IP

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

sudo ip address add 10.11.12.6/24 dev eth_dummy  # standard form
# "short", non-standard forms:
sudo ip addres add 10.11.12.6/24 dev eth_dummy
sudo ip addre add 10.11.12.6/24 dev eth_dummy
sudo ip addr add 10.11.12.6/24 dev eth_dummy
sudo ip add add 10.11.12.6/24 dev eth_dummy  # yeah that's confusing: `add add...`
sudo ip ad add 10.11.12.6/24 dev eth_dummy
sudo ip a add 10.11.12.6/24 dev eth_dummy

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

# This:
sudo ip address add 10.11.12.6 dev eth_dummy
# Defaults to this, which isn't very useful
sudo ip address add 10.11.12.6/32 dev eth_dummy

# So, remember to specify your own useful netmask, such as 
# `/24` (255.255.255.0), instead, like this:
sudo ip address add 10.11.12.6/24 dev eth_dummy

3. 网络掩码

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

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

全字节网络掩码:

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

所有网络掩码:

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

4.更多细节

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

lsmod

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

$ lsmod | grep dummy
dummy                  16384  0

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

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

ip address

您还可以看看这个:

ifconfig

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


等等,但我的同事跑了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)。那是怎么回事!?

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

ip address
ip addres
ip addre
ip addr
ip add
ip ad
ip a

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

$ ip help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename
where  OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
                   tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
                   netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |
                   vrf | sr }
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
                    -h[uman-readable] | -iec |
                    -f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
                    -4 | -6 | -I | -D | -B | -0 |
                    -l[oops] { maximum-addr-flush-attempts } | -br[ief] |
                    -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
                    -rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}
                    ```

And you can run `ip address help` (or `man ip address`), _to see the existence of the `ip address add` and `ip address change` commands!_:
```bash
$ ip address help
Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]
                                                      [ CONFFLAG-LIST ]
       ip address del IFADDR dev IFNAME [mngtmpaddr]
       ip address {save|flush} [ dev IFNAME ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]
       ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]
                         [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]
                         [ label LABEL ] [up] [ vrf NAME ] ]
       ip address {showdump|restore}
IFADDR := PREFIX | ADDR peer PREFIX
          [ broadcast ADDR ] [ anycast ADDR ]
          [ label IFNAME ] [ scope SCOPE-ID ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG  := [ permanent | dynamic | secondary | primary |
           [-]tentative | [-]deprecated | [-]dadfailed | temporary |
           CONFFLAG-LIST ]
CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG
CONFFLAG  := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]
LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]
LFT := forever | SECONDS
TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
          gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |
          nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |
          hsr | macsec

参考

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

也可以看看

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

相关内容