Vyatta Gateway Appliance (VGA) でセキュアな多層セグメントを作成する
Bluemix Infrastructure(旧称SoftLayer)はPublicとPrivateの2種類のLANセグメントしかありませんが、DMZなどの多層化されたネットワークを構築したい場合どうしたらよいでしょうか?
答えの一つはVyatta Gateway Appliance(通称VGA)を使用することです。
他にもVMware NSXやOpenStackのNeutronを導入してマルチレイヤのネットワークを構築することも可能ですが、本記事ではVGAを使ったマルチレイヤネットワークを構築してみましょう。
VGAのネットワーク構造
VGAをオーダーすると、VGAが接続するPublicとPrivateのVLANが一緒に作成されます。この2つのVLANは、ベアメタルサーバや仮想サーバ作成時に作成されるVLANとは別のものですが、相互にルーティングされています。
下図はベアメタルサーバをオーダーした後に、VGAをオーダーした直後のイメージです。
VGAから出たVLANともともとあったVLANは、fcr02およびbcr02というルーターで接続されています。fcrはFrontend Customer Router(FCR)の意味で、インターネットに接続しているパブリック接続用ルーターです。bcrはBackend Customer Router(BCR)の意味で、インターネットに接続していない、プライベート側ネットワーク接続用ルーターです。
こうして論理的な絵を見ると、複数の物理的なLANが作成されているように見えますが、実はこれらのLANはすべてTagged VLAN(IEEE802.1Q)で論理分割されたVLANなのです。上図の上の方に「VLAN 954」とか「VLAN 1187」と書いてあるのは、IEEE802.1QのVLAN IDに相当する番号だったのです。
IEEE802.1q
Bluemix Infrastructureのネットワークは、従来からあるVLAN技術の上に構築された、割と単純なネットワークだったんですね。
VLANに詳しい方ならすぐにピンとくるかもしれませんが、VLAN IDの数量には限りがあります。最大4096個(実際はルーターのメーカーによって異なります)までしかVLAN IDは割り当てられません。つまり、Bluemix Infrastructureの構造上、あまり多くのVLANをユーザーには払い出してはもらえません。VLANの注文がポータルのメニューからは行えず、申請書を添付してTicketで依頼しなければならないのもこのような構造の制約によるものです。
VLANをたくさん使ったアーキテクチャはBluemix Infrastructureにはあまりよろしくない、ということがご理解いただけたでしょうか。
VLANを節約するための対策として、Bluemix InfrastructureではPortable SubnetというIPアドレスブロック(IPアドレスの塊)をVLANに割り当てる、という機能を提供しています。つまり、一つのVLANになるべく多くのIPアドレスを詰め込んで、たくさんのサーバーを接続することができるようになっています。
ただし、Subnetによって複数のIPセグメントを同じVLANに入れても、各Subnetの間のセキュリティ分離はできません。なぜなら、サーバー側で勝手に好きなSubnetのIPアドレスをアサインすれば、そのIPアドレスが使用できてしまうからです。
つまり、Portable Subnetは、限られたVLANになるべく多くのサーバーを接続することができるようにするための、代替策と考えることができます。(本来の用途とはちょっと違うのかもしれませんが)
Tagged VLANをサーバに割り当てるよう依頼する
Portable VLANをベアメタルサーバや仮想サーバから利用するには、VLAN IDがNICに到達するように、Bluemix Infrastructureのスイッチポートをトランクに変更する必要があります。この操作はカスタマーポータルからチケットで依頼してBluemix Infrastructureのオペレーターに実施してもらいます。
(1) カスタマーポータルのメニューからSupport → Add Ticketを選択します。
Subject欄からPrivate Network Question
を選択します。
Title欄はPlease trunk VLAN on NIC
のように記載します。
Associate devicesでは設定してほしいサーバを必要なだけ選択します。
各サーバのUse password on file
にチェックを付けます。
Detail欄に依頼内容を記載します。
Please trunk VLAN 1130 on eth0 for the host.
Add Ticketボタンを押すと起票が完了します。
(2) 通信断が発生する旨の返信が来るので、承認します。
Please approve the 5 minute downtime per server to add the trunking to this server.
こんな感じで承認コメントを残します。
I approve the 5 minute downtime per server to add the trunking to the servers.
(3) トランク設定が完了する旨のメッセージを受領できれば完了です。
I have trunked the VLAN's to your specification.
Please let us know if there is anything else we can do for you. All tickets are set to automatically close in 7 days if no reply is received or the ticket is complete.
依頼してから実施するまで、およそ1時間くらいでした。
Portable Subnetをオーダーする
VGAをオーダーした際に作成されるVLANに設定されているIPアドレスはPrimary Subnetと呼ばれ、Bluemix Infrastructureが使用します。空いているアドレスを勝手に使用してしまうと、後で追加オーダーした際などにIPアドレスが競合してしまう恐れがありますので、そのままでは使用しません。
そこで、Portable VLANをオーダーして、このVLANにアサインしてもらいます。
Portable VLANはカスタマーポータルのメニューから行えます。
(1) メニューからNetwork → IP Management → Subnetsを選択し、Order IP Addressesをクリックします。
(2) Subnetオーダー画面では次のような値を選択します。
Select the type of subnet to add to this accountでは次の値を選択します。
Portable Private
Select Optionでは必要なIPアドレスの数量を選択します。4/8/16/32/64から選択できます。
Continueボタンをクリックします。
(3) アサインするVLANを選択し、Continueボタンをクリックします。
ここではVGA注文時に作成されたVLAN 1130にアサインしたいので1130を選択します。
(4) 次のような値を選択、入力します。
*30日以内に使用するIPの数量
*12か月以内に使用するIPの数量
*なぜ必要かという理由
*連絡先の名前、職位、メールアドレス、電話番号
IPの数量が(2)で選択した数量より極端に少ないとエラーになります。
入力が完了したらPlace Orderボタンをクリックします。
Private Portable Subnetは無料ですが、Publicは有料です。
(5) VLAN 1130にアサインされたかどうか確認します。
Network → IP Management → VLANsを選択します。
VLAN 1130をクリックします。
上図のようにTYPEがPortableで16個のIPアドレスを持ったSubnetがVLAN 1130にアサインされたことがわかります。
BCRにこのPortable Subnetが設定され、ルーティングされる状態になっています。VPNからもアクセスできます。
*VPNからアクセスできない場合は、他のDCにVPN接続して試してみてください。時々、接続先のDCによってはVPNからのルーティングがうまくいかない場合があります。そのような場合はチケットで修正を依頼してください。
Tagged VLANをサーバに設定する
前の手順により、スイッチ側がトランクポートに変更され、サーバまでVLANが到達できるようになりました。
続いて、サーバ側でTagged VLANを認識できるよう設定します。
構成図を示します。赤字のIPアドレスは先ほどオーダーしたPortable Subnetです。
以下はUbuntu LinuxにTagged VLANを設定する方法です。
Redhatの場合はこちらをご参照ください。
(1) Tagged VLANを有効にするパッケージ「vlan」をインストールします。
$ sudo apt-get install vlan
(2) 8021qモジュールをカーネルにロードします。
$ sudo modprobe 8021q
再起動後もロードされるよう次のコマンドを実行します。
$ sudo su -c 'echo "8021q" >> /etc/modules'
(3) VLAN IDをNICに登録します。
$ sudo vconfig add eth0 1130
(4) /etc/network/interfaceにIPアドレスを指定します。
eth0.1130という名前のインタフェースを定義し、IPアドレスとサブネットマスクを設定します。
auto eth0.1130
iface eth0.1130 inet static
address 10.29.10.227
netmask 255.255.255.240
vlan-raw-device eth0
下記のように既存のeth0を定義している下に挿入すると良いでしょう。
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.28.191.97
netmask 255.255.255.192
up route add -net 10.0.0.0/8 gateway 10.28.191.65
down route del -net 10.0.0.0/8
up route add -net 161.26.0.0/16 gateway 10.28.191.65
down route del -net 161.26.0.0/16
gateway 10.28.191.65
auto eth0.1130
iface eth0.1130 inet static
address 10.29.10.227
netmask 255.255.255.240
vlan-raw-device eth0
(5) ネットワークサービスを再起動します。
次のコマンドを実行して、ネットワークを再起動します。
$ sudo service networking restart
次のコマンドでも同じ結果となります。
$ sudo ifup eth0.1130
(6) 設定を確認します。
ifconfigコマンドを実行して、eth0.1130というインターフェースが作成され、正しいIPアドレスやネットマスクが設定されているか確認します。
$ sudo ifconfig
eth0 Link encap:Ethernet HWaddr 0c:c4:7a:8e:1a:68
inet addr:10.28.191.97 Bcast:10.28.191.127 Mask:255.255.255.192
inet6 addr: fe80::ec4:7aff:fe8e:1a68/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:354 errors:0 dropped:0 overruns:0 frame:0
TX packets:386 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:37491 (37.4 KB) TX bytes:43203 (43.2 KB)
eth0.1130 Link encap:Ethernet HWaddr 0c:c4:7a:8e:1a:68
inet addr:10.29.10.227 Bcast:10.29.10.239 Mask:255.255.255.240
inet6 addr: fe80::ec4:7aff:fe8e:1a68/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:474 (474.0 B) TX bytes:1166 (1.1 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ルーティングテーブルを確認します。Destinationが10.29.10.224で、Ifaceがeth0.1130となっている行が追加されていることがわかります。
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.28.191.65 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 10.28.191.65 255.0.0.0 UG 0 0 0 eth0
10.28.191.64 0.0.0.0 255.255.255.192 U 0 0 0 eth0
10.29.10.224 0.0.0.0 255.255.255.240 U 0 0 0 eth0.1130
161.26.0.0 10.28.191.65 255.255.0.0 UG 0 0 0 eth0
Portable Subnetのデフォルトゲートウェイ10.29.10.225にpingを打ってみます。
$ ping 10.29.10.225
PING 10.29.10.225 (10.29.10.225) 56(84) bytes of data.
64 bytes from 10.29.10.225: icmp_seq=1 ttl=255 time=10.8 ms
64 bytes from 10.29.10.225: icmp_seq=2 ttl=255 time=0.511 ms
/proc/net/vlanの下にファイルが作成されていることを確認します。
root@teacher02:/proc/net/vlan# ls -l
total 0
-rw------- 1 root root 0 Mar 23 19:36 config
-rw------- 1 root root 0 Mar 23 19:36 eth0.1130
configファイルは次のようになっています。
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
eth0.1130 | 1130 | eth0
eth0.1130ファイルは次のようになっています。
eth0.1130 VID: 1130 REORDER_HDR: 1 dev->priv_flags: 1001
total frames received 4
total bytes received 260
Broadcast/Multicast Rcvd 0
total frames transmitted 12
total bytes transmitted 928
Device: eth0
INGRESS priority mappings: 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0
EGRESS priority mappings:
送受信パケットがゼロになっている場合は何か問題があります。設定を見直してください。それでも治らない場合は、トランク設定依頼が正しく行われたかどうか、チケットで問い合わせてみてください。
VGAにPortable SubnetのIPアドレスを定義する
VGAにもPortable SubnetのIPアドレスを設定します。
下図のように10.29.10.226というPortable SubnetのIPアドレスを定義します。
(1) Vyattaの管理コンソールを開きます。
ブラウザからVGAのPrivate IPに接続します。
https://10.28.205.138
証明書の警告が出ると思いますが、警告を受け入れて先へ進みます。
Usernameはvyattaです。
Passwordは、カスタマーポータルからDevices → Device listを開き、VGAの左側にある>をクリックすると確認できます。
(3) 左側のメニューからInterface → Ethernet → eth0をクリックし、右側のパネルにIPアドレスを入力します。
(6) サーバからPingを打ってみましょう。
10.29.10.227(10.28.191.97)にログインしてVGAに設定したアドレスにPingを打ちます。
$ ping 10.29.10.226
PING 10.29.10.226 (10.29.10.226) 56(84) bytes of data.
64 bytes from 10.29.10.226: icmp_seq=1 ttl=64 time=0.227 ms
64 bytes from 10.29.10.226: icmp_seq=2 ttl=64 time=0.215 ms
以上でVGAへのPortable SubnetのIPアドレス登録は完了です。
VGAにIPマスカレード(NAT)を設定する
Portable SubnetからInternetへすべてのプロトコルを通すようにIPマスカレードNATを設定します。
(1) VGAのCLIにアクセスする
sshクライアントを使って、VGAのPrivate IPに接続します。
ssh 10.28.205.138
ユーザーIDは先ほどのGUIと同じく、vyattaです。パスワードもポータルから確認したものを使います。
(2) 設定します。
configureコマンドを実行して構成変更モードにします。
configure
NATのルールを入力します。
set nat source rule 10 outbound-interface eth1
set nat source rule 10 source address 10.29.10.224/28
set nat source rule 10 translation address masquerade
設定を保存します。
save
設定を反映します。
commit
一連の画面ログです。
vyatta@vga01:~$ configure
[edit]
vyatta@vga01# set nat source rule 10 outbound-interface eth1
[edit]
vyatta@vga01# set nat source rule 10 source address 10.29.10.224/28
[edit]
vyatta@vga01# set nat source rule 10 translation address masquerade
[edit]
vyatta@vga01# save
Warning: you have uncommitted changes that will not be saved.
Saving configuration to '/config/config.boot'...
Done
[edit]
vyatta@vga01# commit
[edit]
デフォルトゲートウェイをVGAに向ける
サーバのデフォルトゲートウェイはPrimary SubnetのBCRに向いています。このままではInternetに出られないので、デフォルトゲートウェイをVGAに向けます。
/etc/network/interfaceを下記のように編集します。
eth0にあったgatewayの設定をコメントアウトして、eth0.1130のgatewayにVGAのPortable SubnetのIPアドレスを設定します。
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
#pre-up /sbin/ethtool -s eth0 speed 1000 duplex full autoneg on
address 10.28.191.97
netmask 255.255.255.192
up route add -net 10.0.0.0/8 gateway 10.28.191.65
down route del -net 10.0.0.0/8
up route add -net 161.26.0.0/16 gateway 10.28.191.65
down route del -net 161.26.0.0/16
# gateway 10.28.191.65
auto eth0.1130
iface eth0.1130 inet static
address 10.29.10.227
netmask 255.255.255.240
vlan-raw-device eth0
gateway 10.29.10.226
ネットワークを再起動します。
$ sudo service networking restart
ルーティングテーブルを確認します。デフォルトゲートウェイ0.0.0.0が10.29.10.226、eth0.1130に変わっています。
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.29.10.226 0.0.0.0 UG 0 0 0 eth0.1130
10.0.0.0 10.28.191.65 255.0.0.0 UG 0 0 0 eth0
10.28.191.64 0.0.0.0 255.255.255.192 U 0 0 0 eth0
10.29.10.224 0.0.0.0 255.255.255.240 U 0 0 0 eth0.1130
161.26.0.0 10.28.191.65 255.255.0.0 UG 0 0 0 eth0
Pingを打ってみましょう。
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.732 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.729 ms
DNSのリゾルバはBluemix InfrastructureのDNSに向いたままなので、念のため名前解決もできるか確認します。
$ nslookup www.ibm.com
Server: 10.0.80.11
Address: 10.0.80.11#53
Non-authoritative answer:
www.ibm.com canonical name = www.ibm.com.cs186.net.
www.ibm.com.cs186.net canonical name = www2.ibm.com.edgekey.net.
www2.ibm.com.edgekey.net canonical name = www2.ibm.com.edgekey.net.globalredir.akadns.net.
www2.ibm.com.edgekey.net.globalredir.akadns.net canonical name = e2874.dscx.akamaiedge.net.
Name: e2874.dscx.akamaiedge.net
Address: 23.200.219.145
HTTPが通るかどうか確認します。
$ wget www.ibm.com
--2017-03-23 23:27:22-- http://www.ibm.com/
Resolving www.ibm.com (www.ibm.com)... 23.200.219.145, 2600:1409:a:1a3::b3a, 2600:1409:a:188::b3a
Connecting to www.ibm.com (www.ibm.com)|23.200.219.145|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: http://www.ibm.com/cn-zh/ [following]
--2017-03-23 23:27:22-- http://www.ibm.com/cn-zh/
Reusing existing connection to www.ibm.com:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 'index.html.1'
index.html.1 [ <=> ] 32.68K --.-KB/s in 0.001s
2017-03-23 23:27:22 (26.2 MB/s) - 'index.html.1' saved [33462]
以上で、設定と確認は完了です。