2014年10月20日月曜日

OpenContrailのSNAT

NeutronではInternalネットワークからExternalネットワークに通信する場合、Neutron RouterがSNATして通信する。

例えば Internalネットワークが10.0.0.0/24でNeutron RouterのExternalネットワークのIPアドレスが203.0.113.1の場合、10.0.0.0/24のアドレスは203.0.113.1にNAT変換される。
ContrailではSNATをサポートしているが、ContrailではSNATを行う場合、Compute nodeにSNAT用のNetwork Namespaceを作成する。
このとき、Internal側のダミーIPネットワークを設定する。Neutron routerにゲートウェイを設定すると、自動的に100.64.0.0/29のネットワークが作成される。
このネットワークはNetwork NamespaceのInternal側に属するネットワークとして利用している。
なお、100.64.0.0/10はCGNAT(LSNAT)用で予約されている。RFC6598 http://tools.ietf.org/html/rfc6598

例えば、以下のようにネットワークを設定する。
VN1(10.0.1.0/24)--- Router1 ---pubric(172.16.0.0/24)
neutron net-create VN1
neutron subnet-create VN1 10.0.1.0/24
net-create public
subnet-create public 203.0.113.0/29
net-update public --router:external=true
router-gateway-set RT1 public
その後、neutron net-listでネットワークを確認すると、snat-si-left_si_"Neutorn routerのUUID"というネットワークが自動作成され、100.64.0.0/24のネットワークが自動生成される。
neutron router-list
+--------------------------------------+---------+--------------------------------------------------------+
| id                                   | name    | external_gateway_info                                  |
+--------------------------------------+---------+--------------------------------------------------------+
| 1e74907d-63e5-4bc6-a9a9-f0f221183f06 | Router1 | {"network_id": "8cd3510b-7b78-49f3-b5b9-2b94f5305a19"} |
+--------------------------------------+---------+--------------------------------------------------------+

neutron subnet-list
+--------------------------------------+------+---------------+------------------------------------------------+
| id                                   | name | cidr          | allocation_pools                               |
+--------------------------------------+------+---------------+------------------------------------------------+
| b354592d-3f85-45fa-b997-7853d10a5b93 |      | 10.0.1.0/24   | {"start": "10.0.1.2", "end": "10.0.1.254"}     |
| a8065593-158b-4057-af1b-d52faaeba18c |      | 172.16.0.0/24 | {"start": "172.16.0.2", "end": "172.16.0.254"} |
| f0510443-e4fb-43f7-b905-a766c49cef35 |      | 100.64.0.0/29 | {"start": "100.64.0.1", "end": "100.64.0.6"}   |
+--------------------------------------+------+---------------+------------------------------------------------+
コンピュートノードでip netns listを打つと、"vrouter-"で始まるnamespaceが作成されている
ip netns list
vrouter-2bd3ddf4-f7e5-4ba8-bdc6-95a810c06cb3
ip addrでインターフェイスを確認すると、namespaceのインターフェイスが確認できる
ip netns exec vrouter-2bd3ddf4-f7e5-4ba8-bdc6-95a810c06cb3 ip addr
1: 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
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: int-479555b2-9:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 02:47:95:55:b2:92 brd ff:ff:ff:ff:ff:ff
    inet 100.64.0.5/29 brd 100.64.0.7 scope global int-479555b2-9
       valid_lft forever preferred_lft forever
3: gw-ef308f80-9d:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 02:ef:30:8f:80:9d brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.2/24 brd 172.16.0.255 scope global gw-ef308f80-9d
       valid_lft forever preferred_lft forever
2014/10/23追記
ip netns exec vrouter-2bd3ddf4-f7e5-4ba8-bdc6-95a810c06cb3 iptables -t nat -L をみると
ip netns exec vrouter-2bd3ddf4-f7e5-4ba8-bdc6-95a810c06cb3 iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  all  --  anywhere             anywhere  
というMasquaradeするテーブルが作成されている。

つまりContrailは実際には以下のように動作している
VN1(10.0.1.0/24) --- NAT-inside(100.64.0.0/29) --- pubric(172.16.0.0/24)
   (vRouter)                 (Network namespace)           (vRouter) 

0 件のコメント:

コメントを投稿