OpenStack Neutronの「中」の動きを追いかけよういま覚えておくべきOpenStack Neutronの基本(2)(5/8 ページ)

» 2015年02月04日 19時00分 公開
[SDNエバンジェリスト吉本昌平ユニアデックス株式会社]

作成したネットワークを外部ネットワークに接続するには?

ねぇねぇ、さっき作ったNetwork Namespaceって外にもつながる?


外って?


qvm1qrouter1はサーバーの中だけのプライベートネットワークでつながっているわけでしょう? このqvm1から、例えばあたしのPCにつなぐことはできる?


そこまでは僕もやったことがないけれど、qrouter1にもう一つインターフェースを作って、外部とつないであげればいけるはずだね。こんな感じかな?


root@ub2:~$ ip link add qg-veth1 type veth peer name qg-peer1
root@ub2:~$ ip link set qg-veth1 netns qrouter1
root@ub2:~$ ovs-vsctl add-br br-ex
root@ub2:~$ ovs-vsctl add-port br-ex qg-peer1

qrouter1はルーターになってもらうから、ip_forwardを有効にしておこう


root@ub2:~# ip netns exec qrouter1 sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

ふむふむ。ますます記事で見たネットワークにそっくりになってきたね


連載第1回で紹介した構成

形としては同じだよね。あとは、IPアドレスを付けてNATをかけてあげれば……


root@ub2:~# ip netns exec qrouter1 ifconfig qg-veth1 10.16.161.54/21
root@ub2:~# ip netns exec qrouter1 ip addr add 10.16.161.51/21 dev qg-veth1
root@ub2:~# ip link set qg-peer1 up
root@ub2:~# ip netns exec qrouter1 iptables -t nat -A POSTROUTING -s 10.0.0.3 -j SNAT --to 10.16.161.51
root@ub2:~# ip netns exec qrouter1 iptables -t nat -A PREROUTING -d 10.16.161.51 -j DNAT --to 10.0.0.3

おぉ!? 何か難しくなってきたね。ここでqg-veth1にIPアドレスが二つ付いてるのはどうして?


最初のIPアドレスはこのインターフェース自身のもので、二つ目はIP aliasだね。qvm1にアクセスするためのフローティングIPとして使うんだ。インスタンスがもう一つあったら、フローティングIPももう一つ必要かもしれないからね


なるほど。NATはどうなっているかというと……?


まずはSNATを見てみよう。qvm1から外へ出て行く時は送信元が10.0.0.3になっているから、これを10.16.161.51から送信したように見せるんだ


逆に、外からqvm1へのアクセスは10.16.161.51に来るので、その宛先が10.0.0.3になるようにDNATしているね


接続を確認してみよう

そうだね。実際に確認してみよう


root@ub2:~# ip netns exec qrouter1 iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  0.0.0.0/0            10.16.161.51         to:10.0.0.3
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
SNAT       all  --  10.0.0.3             0.0.0.0/0            to:10.16.161.51

これで良さそうだね


qvm1は、ルーターの向こう側にある外部のネットワークと通信するから、デフォルトゲートウェイをルーターに設定しておこう


root@ub2:~# ip netns exec qvm1 route add default gw 10.0.0.1

そして、外のLANにつながっているサーバーのeth0br-exに接続する*2


root@ub2:~# ovs-vsctl add-port br-ex eth0

*2 eth0をbr-exに接続 今、Atlasくんたちは、サーバーのコンソールで操作しています。sshなどでeth0を経由してサーバーにアクセスしている場合は、この操作を行った時点で操作不能になる可能性がありますので注意してください。



これでいけるんじゃないかな?


では、pingを打ってみるね


root@ub2:~$ ip netns exec qvm1 bash
(qvm1)root@ub2:~$ ping 10.16.161.67
PING 10.16.161.67 (10.16.161.67) 56(84) bytes of data.
64 bytes from 10.16.161.67: icmp_seq=1 ttl=64 time=0.629 ms
64 bytes from 10.16.161.67: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 10.16.161.67: icmp_seq=3 ttl=64 time=0.081 ms
--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.079/0.263/0.628/0.175 ms

できた!!


お! 一発で通ったね!


ところで、ここまでの操作をNeutronは新しいVMを作るたびに実行しているの?


そうだね。個々までの操作のうち、後半のNATを設定する部分はフローティングIPを割り当てたときのみ、ということになると思うけれど。これらの操作をNeutronでは自動でやってくれているんだ


へぇ、すごい。Neutronくんってば働き者だね


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。