如何在 Linux 机器上的 OVS 端口和物理接口之间路由流量?

网络工程 专用网
2021-07-14 05:03:20

我使用 OpenVSwitch 作为 KVM 虚拟机的网络层。我有一个主桥,每个虚拟机在桥上都有一个水龙头。我在主机上也有一个内部分路器,它与 VM 分路器位于同一 VLAN 上。我可以在主机和 VM 之间正常通信,但是我很难弄清楚如何使用主机通过物理接口将 VM 流量路由到 Internet。

这是我的 OVS 配置...

foo@bar# ovs-vsctl show
b9d8798d-5a95-4d96-8df4-690ae9c8bae5
    Bridge br0   
        Port br0  
            Interface br0
                type: internal
        Port "br0_tap0"
            tag: 100     
            Interface "br0_tap0"
                type: internal
        Port "br0_tap1"
            tag: 100     
            Interface "br0_tap1"
        Port "br0_tap2"
            tag: 100     
            Interface "br0_tap2"
    ovs_version: "2.3.1"

这是我的界面配置...

foo@bar# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 3c:07:54:0e:9c:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2601:140:8000:508b:3e07:54ff:fe0e:9c16/64 scope global mngtmpaddr dynamic
       valid_lft 345514sec preferred_lft 345514sec
    inet6 fe80::3e07:54ff:fe0e:9c16/64 scope link
       valid_lft forever preferred_lft forever
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
    link/ether 36:3f:76:54:8c:1a brd ff:ff:ff:ff:ff:ff
135: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default    
    link/ether 8a:c6:9d:08:23:4d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::88c6:9dff:fe08:234d/64 scope link
       valid_lft forever preferred_lft forever
136: br0_tap0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
    link/ether 82:86:88:2c:6a:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 scope global mega_tap0
       valid_lft forever preferred_lft forever
    inet6 fe80::8086:88ff:fe2c:6a56/64 scope link
       valid_lft forever preferred_lft forever
137: br0_tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP group default qlen 500
    link/ether 8e:50:e5:4f:1d:60 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8c50:e5ff:fe4f:1d60/64 scope link
       valid_lft forever preferred_lft forever
138: br0_tap2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP group default qlen 500
    link/ether d2:a7:4e:68:51:4c brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d0a7:4eff:fe68:514c/64 scope link
       valid_lft forever preferred_lft forever

tap0是为主机提供 IP 地址的内部分接头,VLAN 100以便我可以与连接到tap1的虚拟机进行通信tap2我使用sysctl -w net.ipv4.ip_forward=1.

VM 上tap1的 IP 地址为192.168.0.10/24从那个虚拟机,我可以 ping 另一个虚拟机tap2,主机的tap0接口和主机eth0接口的 IP 地址。但是,我无法 ping 主机之外的任何内容。我的 VM 有一个主机tap0IP 地址的默认网关

有任何想法吗?

3个回答

我今天早上还通过iptablesbr0_tap0接口和物理eth0接口之间的 NAT 流量添加一些规则来使事情正常进行

如果有人有其他不涉及 IP 转发或 iptables 的方法,我很乐意看到它!

您可以将流量路由或桥接到物理接口。

要桥接,只需将物理接口添加到桥接器。

# brctrl addif br0 eth0
or 
# ovs-vsctl add-port br0 eth0

将 eth0 ip 移动到 br0 端口

# ifconfig eth0 0.0.0.0
# ifconfig br0 192.168.1.10/24

要进行路由,您将为 VM 和物理接口使用不同的子网。您还需要外部网络上的路由,将内部子网的流量路由到外部 IP,可能添加到路由器上。

就像 Pieter 所说的那样,将 eth0 添加到网桥,然后将标记为“内部”的接口返回给操作系统:

# ovs-vsctl add-port br0 eth0
# ifconfig eth0 0.0.0.0
# ovs-vsctl add-port br0 vlan100 tag=100 vlan_mode=access -- set interface vlan100 type=internal
# ifconfig vlan100 192.168.1.10/24