ねぇねぇ、さっき作ったNetwork Namespaceって外にもつながる?
外って?
qvm1とqrouter1はサーバーの中だけのプライベートネットワークでつながっているわけでしょう? この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
ふむふむ。ますます記事で見たネットワークにそっくりになってきたね
形としては同じだよね。あとは、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につながっているサーバーのeth0をbr-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.