OpenStack為neutron router設定多個閘道器

OpenStack為neutron router設定多個閘道器

讓特定虛擬機器流量的外網出口不走 neutron vrouter 預設的 external gateway 而是用另一個地址作為出口閘道器。例如,屬於同一個 neutron 子網的虛擬機器,需要指定不同的路由訪問公網。這可能是因為這些虛擬機器按照用途進行了區分,例如辦公用機需要使用者進行認證之後才可以上網,而開發節點為了方便可以直接訪問公網。

對系統改動最少的解決辦法是在 neutron vrouter 所在的 network namespace 新建一個路由表,配置相應的路由規則,例如設定新的預設閘道器。然後利用 iproute2 的 ip rule 為特定虛擬機器指定路由表。

  • 虛擬機器IP 192.168.10.135
  • 外部網路地址 10.20.128.0/18
  • 欲設定該虛擬機器的出口閘道器為 10.20.128.254
  • 但不改變其他虛擬機器的路由規則,原預設閘道器為 10.20.191.254
    網路連線

192.168.10.1 是 nova 虛擬機器 192.168.10.135 的預設閘道器。這個地址在 neutron vrouter 上。vrouter 將 192.168.10.135 為源地址的包,經 NAT 之後,按照路由錶轉發規則發往下一跳地址 10.20.128.254 ,這時已經離開了 OpenStack 平臺。

在虛擬機器裡檢視。預設閘道器 192.168.10.1。

[[email protected] ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.169.254 192.168.10.1    255.255.255.255 UGH   0      0        0 eth0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

在網路節點執行。

# ip netns

找到 qrouter。設定環境變數

# qrouter="qrouter-b051f50b-5148-4081-ba13-4ce8aac703fd"

檢視路由

# ip netns exec ${qrouter} ip route
default via 10.20.191.254 dev qg-b73193e9-40 
10.20.128.0/18 dev qg-b73193e9-40  proto kernel  scope link  src 10.20.162.55 
192.168.10.0/24 dev qr-f1fd249b-4a  proto kernel  scope link  src 192.168.10.1

顯示預設閘道器為 10.20.191.254。外部網路介面是 qg-b73193e9-40。

# ip netns exec ${qrouter} ip route list table 3

顯示為空

設定預設閘道器

# ip netns exec ${qrouter} ip route add default via 10.20.128.254 table 3

新增外部網路路由

# ip netns exec ${qrouter} ip route add 10.20.128.0/18 dev qg-b73193e9-40 table 3

設定從特定虛擬機器來的流量查詢 table 3

# ip netns exec ${qrouter} ip rule add from 192.168.10.135/32 table 3

重新整理路由快取

# ip netns exec ${qrouter} ip route flush cache

檢視新的路由表

# ip netns exec ${qrouter} ip route list table 3
default via 10.20.128.254 dev qg-b73193e9-40 
10.20.128.0/18 dev qg-b73193e9-40  scope link 

main 表沒有變化

# ip netns exec ${qrouter} ip route list table main
default via 10.20.191.254 dev qg-b73193e9-40 
10.20.128.0/18 dev qg-b73193e9-40  proto kernel  scope link  src 10.20.162.55 
192.168.10.0/24 dev qr-f1fd249b-4a  proto kernel  scope link  src 192.168.10.1

檢視 rule

# ip netns exec ${qrouter} ip rule show
0:  from all lookup local 
32765:  from 192.168.10.135 lookup 3 
32766:  from all lookup main 
32767:  from all lookup default 

在虛擬機器裡操作。

[[email protected] ~]# ping baidu.com
PING baidu.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144: icmp_seq=1 ttl=45 time=4.91 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=45 time=4.61 ms
[[email protected] ~]# traceroute -d 123.125.114.144
traceroute to 123.125.114.144 (123.125.114.144), 30 hops max, 60 byte packets
1  gateway (192.168.10.1)  0.824 ms  0.791 ms  0.799 ms
2  10.20.128.254 (10.20.128.254)  2.525 ms  2.516 ms  3.005 ms
......

在網路節點抓包。虛擬機器沒有 floating ip 的情況。看到 vrouter 網路介面地址。

# ip netns exec ${qrouter} tcpdump -nni qg-b73193e9-40 host 123.125.114.144
IP 10.20.162.55 > 123.125.114.144: ICMP echo request,id 5986, seq 53,length 64
IP 123.125.114.144 > 10.20.162.55: ICMP echo reply,id 5986,seq 53,length 64

在網路節點抓包。虛擬機器繫結了 floating ip 的情況。看到虛擬機器 floating ip 地址。

# ip netns exec ${qrouter} tcpdump -nni qg-b73193e9-40 host 123.125.114.144
IP 10.20.162.49 > 123.125.114.144: ICMP echo request,id 6009,seq 5,length 64
IP 123.125.114.144 > 10.20.162.49: ICMP echo reply,id 6009,seq 5,length 64