千家信息网

如何使用network namespace创建一个router

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家介绍如何使用network namespace创建一个router,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我们会通过一个稍微复杂(其实仍然相当基本)的use
千家信息网最后更新 2026年11月02日如何使用network namespace创建一个router

这篇文章给大家介绍如何使用network namespace创建一个router,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

我们会通过一个稍微复杂(其实仍然相当基本)的use case(两个网络间路由)探索网络的设置。 路由使用的组件与连通内部网络相同,使用namespace创建一个隔离的container,允许subnet间的网络包中转。

记住我们在第一篇文章中所说的,这只是使用OVS插件的例子。openstack还有很多插件使用不同的方式,我们提到的只是其中一种。

Use case #4: Routing traffic between two isolated networks

现实中,我们会创建不同的网络用于不同的目的。我们也会需要把这些网络连接起来。因为两个网络在不同的IP段,我们需要router将他们连接起来。为了分析这种设置,我们创建另一个network(net2)并配置一个20.20.20.0/24的subnet。在创建这个network后,我们启动一个Oracle Linux的虚拟机,并连接到net2。下图是从OpenstackGUI上看到的网络拓扑图:



进一步探索,我们会在openstack网络节点上看到另一个namespace,这个namespace用于为新创建的网络提供服务。现在我们有两个namespace,每个network一个。

# ip netns listqdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42ddqdhcp-5f833617-6179-4797-b7c0-7d420d84040c


可以通过nova net-list查看network的ID信息,或者使用UI查看网络信息。

# nova net-list+--------------------------------------+-------+------+| ID                                   | Label | CIDR |+--------------------------------------+-------+------+| 5f833617-6179-4797-b7c0-7d420d84040c | net1  | None || 63b7fcf2-e921-4011-8da9-5fc2444b42dd | net2  | None |+--------------------------------------+-------+------+

我们新创建的network,net2有自己的namespace,这个namespace与net1是分离的。在namespace中,我们可以看到两个网络接口,一个local,一个是用于DHCP服务。

# ip netns exec qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd ip addr1: lo:  mtu 65536 qdisc noqueue state UNKNOWN    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever19: tap16630347-45:  mtu 1500 qdisc noqueue state UNKNOWN    link/ether fa:16:3e:bd:94:42 brd ff:ff:ff:ff:ff:ff    inet 20.20.20.3/24 brd 20.20.20.255 scope global tap16630347-45    inet6 fe80::f816:3eff:febd:9442/64 scope link       valid_lft forever preferred_lft forever


net1和net2两个network没有被联通,我们需要创建一个router,通过router将两个network联通。Openstack Neutron向用户提供了创建router并将两个或多个network连接的能力。router其实只是一个额外的namespace。使用Neutron创建router可以通过GUI或者命令行操作:

# neutron router-create my-routerCreated a new router:+-----------------------+--------------------------------------+| Field                 | Value                                |+-----------------------+--------------------------------------+| admin_state_up        | True                                 || external_gateway_info |                                      || id                    | fce64ebe-47f0-4846-b3af-9cf764f1ff11 || name                  | my-router                            || status                | ACTIVE                               || tenant_id             | 9796e5145ee546508939cd49ad59d51f     |+-----------------------+--------------------------------------+


现在我们将两个netwrok通过router连接:

查看subnet的ID:

# neutron subnet-list+--------------------------------------+------+---------------+------------------------------------------------+| id                                   | name | cidr          | allocation_pools                               |+--------------------------------------+------+---------------+------------------------------------------------+| 2d7a0a58-0674-439a-ad23-d6471aaae9bc |      | 10.10.10.0/24 | {"start": "10.10.10.2", "end": "10.10.10.254"} || 4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890 |      | 20.20.20.0/24 | {"start": "20.20.20.2", "end": "20.20.20.254"} |+--------------------------------------+------+---------------+------------------------------------------------+


将subnet 10.10.10.0/24添加到router:

# neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=2d7a0a58-0674-439a-ad23-d6471aaae9bcAdded interface 0b7b0b40-f952-41dd-ad74-2c15a063243a to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.

将subnet 20.20.20.0/24添加到router:

# neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890Added interface dc290da0-0aa4-4d96-9085-1f894cf5b160 to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.

此时,我们在查看网络拓扑会发现两个网络被router打通:



我们还可以发现两个网络接口连接到router,作为各自subnet的gateway。

我们可以看到为router创建的namespace。

# ip netns listqrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42ddqdhcp-5f833617-6179-4797-b7c0-7d420d84040c


我们进入namespace内部可以看到:

# ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 ip addr1: lo:  mtu 65536 qdisc noqueue state UNKNOWN    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever20: qr-0b7b0b40-f9:  mtu 1500 qdisc noqueue state UNKNOWN    link/ether fa:16:3e:82:47:a6 brd ff:ff:ff:ff:ff:ff    inet 10.10.10.1/24 brd 10.10.10.255 scope global qr-0b7b0b40-f9    inet6 fe80::f816:3eff:fe82:47a6/64 scope link       valid_lft forever preferred_lft forever21: qr-dc290da0-0a:  mtu 1500 qdisc noqueue state UNKNOWN    link/ether fa:16:3e:c7:7c:9c brd ff:ff:ff:ff:ff:ff    inet 20.20.20.1/24 brd 20.20.20.255 scope global qr-dc290da0-0a    inet6 fe80::f816:3eff:fec7:7c9c/64 scope link       valid_lft forever preferred_lft forever

我们看到两个网络接口,"qr-dc290da0-0a" 和 "qr-0b7b0b40-f9。这两个网络接口连接到OVS上,使用两个network/subnet的gateway IP。

# ovs-vsctl show8a069c7c-ea05-4375-93e2-b9fc9e4b3ca1    Bridge "br-eth3"        Port "br-eth3"            Interface "br-eth3"                type: internal        Port "eth3"            Interface "eth3"        Port "phy-br-eth3"            Interface "phy-br-eth3"    Bridge br-ex        Port br-ex            Interface br-ex                type: internal    Bridge br-int        Port "int-br-eth3"            Interface "int-br-eth3"        Port "qr-dc290da0-0a"            tag: 2            Interface "qr-dc290da0-0a"                type: internal        Port "tap26c9b807-7c"            tag: 1            Interface "tap26c9b807-7c"                type: internal        Port br-int            Interface br-int                type: internal        Port "tap16630347-45"            tag: 2            Interface "tap16630347-45"                type: internal        Port "qr-0b7b0b40-f9"            tag: 1            Interface "qr-0b7b0b40-f9"                type: internal    ovs_version: "1.11.0"

我们可以看到,这些接口连接到"br-int",并打上了所在network对应的VLAN标签。这里我们可以通过gateway地址(20.20.20.1)成功的ping通router namespace:

我们还可以看到IP地址为20.20.20.2可以ping通IP地址为10.10.10.2的虚拟机:

两个subnet通过namespace中的网络接口互相连通。在namespace中,Neutron将系统参数net.ipv4.ip_forward设置为1。命令查看如下:

# ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1

我们可以看到namespace中的系统参数net.ipv4.ip_forward被设置,这种设置不会对namespace外产生影响。

创建router时,Neutron会创建一个叫qrouter-的namespace。subnets通过OVS的br-int网桥上的网络接口接入router。网络接口被设置了正确的VLAN,从而可以连入它们对应的network。例子中,网络接口qr-0b7b0b40-f9的IP被设置为10.10.10.1,VLAN标签为1,它可以连接到"net1"。通过在namespace中设置系统参数net.ipv4.ip_forward为1,从而允许路由生效。

关于如何使用network namespace创建一个router就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

网络 两个 接口 不同 参数 只是 可以通过 地址 系统 路由 会创 例子 信息 内容 命令 拓扑 插件 更多 标签 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 互联网科技活动banner 互联网科技财经 互联网与科技发展 科技信息互联网 中资互联网科技 福州新华互联网科技学校 知乎 央行互联网金融科技公司 茂名市互联网科技产业园 武汉健翔互联网络科技有限公司 速维有品互联网信息科技(苏州)有限公司 电子科技大学互联网创业大赛 广州新华互联网科技学校电竞方面 保险科技服务互联网营销体系 互联网科技融合创新 中国互联网公司的科技投入 美国五大互联网科技公司市值多少 广州三三互联网科技有限公司 互联网科技对化妆品行业 互联网科技大会大佬 互联网科技深圳 北京互联网科技有限公司 广州宏创互联网科技 汇久创客互联网科技 郑州华宇互联网科技 科技大学互联网专业好不好 互联网科技公司有风险吗 互联网科技商业 互联网科技大奖都有哪些公司 互联网在线教育科技创业
0