【问题标题】:How do I create virtual ethernet devices in linux?如何在 linux 中创建虚拟以太网设备?
【发布时间】:2011-01-06 03:58:10
【问题描述】:

我正在测试使用以太网(不是 IP)在两台计算机之间进行通信的协议的实现。为了实际上不必拥有两台物理计算机,我想创建两个虚拟以太网接口。它们只能相互通信,因此一个端点程序将绑定到一个接口,而另一个端点将绑定到另一个。

这可能吗?我该怎么做?

【问题讨论】:

    标签: linux networking virtualization ethernet


    【解决方案1】:

    您可以使用 VDE2,一个虚拟交换机。

    例如(您将需要一些术语):

    # Install vde2 (assumes Debian/Ubuntu)
    sudo aptitude install vde2
    # Create the switch and two tap interfaces attached to it
    sudo vde_switch -tap tap0 -tap tap1
    # Configure the interfaces
    sudo ip addr add 10.0.31.10 dev tap0
    sudo ip addr add 10.0.31.11 dev tap1
    # Start a server
    socat - TCP-LISTEN:4234,bind=10.0.31.10
    # Alternatively, an echo server:
    #socat PIPE TCP-LISTEN:4234,bind=10.0.31.10
    # Start a client
    socat - TCP:10.0.31.10:4234,bind=10.0.31.11
    

    在一侧输入,它会出现在另一侧。

    【讨论】:

    • 此示例不起作用:所有流量都通过“lo”接口,使用“tcpdump”可以看到。您可能还会注意到两个分接头接口仍处于关闭状态。启动它们后,tcpdump 可以在 tap 接口上运行,但在它们上根本不显示流量。 Linux 内核使用它的本地路由表(参见'ip route show table local')来找出这些IP 是本地的并且只是在本地路由数据包,而不使用'vde_switch'。说了这么多,我还没有找到通过 vde_switch和tap接口建立socat连接的方法。
    【解决方案2】:

    您可以使用“tap”虚拟以太网驱动程序,让用户空间程序伪装成以太网接口。这是一段时间以来的标准内核功能(虽然它可能未在您的内核中启用)。

    【讨论】:

    • 模块名为tun。但是,是的,否则,这个答案很好。只需做一个 insmod tun,否则编译支持它的内核。
    • 这个模块叫做tun,它也提供了“tap”设备。查看内核的 D​​ocumentation/networking/tuntap.txt 以获得完整的用户空间界面;虚拟接口是通过在字符设备 /dev/net/tun 上使用 ioctl 创建的
    • tun0 是虚拟点对点设备,tap0 是虚拟以太网。后者可以与任何协议一起使用,而不仅仅是 IP
    【解决方案3】:

    如果需要,您可以使用 ns3 模拟两个 Tap 设备之间的复杂网络:http://www.nsnam.org/

    我让它在两个 virtualbox 实例之间模拟两个交换机、一个无线客户端和一个 AP。

    【讨论】:

      【解决方案4】:

      如果您想要自己的子网并且不想费心使用 vde。

      看看this。简而言之:

      # tunctl -t eth0
      Set 'eth0' persistent and owned by uid 0
      # ifconfig eth0
      eth0      Link encap:Ethernet  HWaddr a6:9b:fe:d8:d9:5e  
            BROADCAST MULTICAST  MTU:1500  Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:500 
            RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
      

      或者用ip:

      # ip tuntap add dev eth0 mode tap
      # ip link ls dev eth0
        7: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500
        link/ether 0e:55:9b:6f:57:6c brd ff:ff:ff:ff:ff:ff
      

      【讨论】:

        【解决方案5】:

        人机界面 人ifconfig

        只需在 /etc/network/interfaces 中添加一个新节

        我的示例配置:

        iface eth0 inet static
           address 192.168.2.150
           netmask 255.255.255.0
           network 192.168.2.0
           broadcast 192.168.2.255
           gateway 192.168.2.253
           # dns-* options are implemented by the resolvconf package, if installed
           dns-nameservers 8.8.4.4
        
        
        iface eth0:1 inet static
            address 192.168.2.2
            netmask 255.255.255.0
            network 192.168.2.0
            broadcast 192.168.2.255
            gateway 192.168.2.253
            # dns-* options are implemented by the resolvconf package, if installed
            dns-nameservers 8.8.4.4
        

        --

        eth0 的 ip 为 192.168.2.150,而 eth0:1 的 ip 为 192.168.2.2

        【讨论】:

        • 这不会创建一个新的虚拟设备,它只是在物理设备上配置一个额外的IP。
        • @Flow 有什么区别?只是好奇?我的意思是后果,而不是实施。
        • 有很多后果。例如,如果您将第二个 IP 添加到已连接的物理接口,则系统将可以通过该物理接口在该 IP 下从外部访问。
        【解决方案6】:

        您可以使用 vconfig 命令 示例:

        vconfig add eth0 10 #virtual interface eth0.10 will be created
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-27
          • 1970-01-01
          • 1970-01-01
          • 2011-09-24
          • 2011-06-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多