Bluemix Infrastructure VGAでセキュアなネットワークを作る

# 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をオーダーした直後のイメージです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/d5816636-5e16-1f9b-f73d-45bdcd2b3a07.png)


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](https://ja.wikipedia.org/wiki/IEEE_802.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) 通信断が発生する旨の返信が来るので、承認します。

```text
Please approve the 5 minute downtime per server to add the trunking to this server. 
```

こんな感じで承認コメントを残します。

```text
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をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/57ada25d-a56a-9a8b-07fa-a35d5b9f5462.png)
上図のようにTYPEがPortableで16個のIPアドレスを持ったSubnetがVLAN 1130にアサインされたことがわかります。
BCRにこのPortable Subnetが設定され、ルーティングされる状態になっています。VPNからもアクセスできます。

＊VPNからアクセスできない場合は、他のDCにVPN接続して試してみてください。時々、接続先のDCによってはVPNからのルーティングがうまくいかない場合があります。そのような場合はチケットで修正を依頼してください。



# Tagged VLANをサーバに設定する


前の手順により、スイッチ側がトランクポートに変更され、サーバまでVLANが到達できるようになりました。
続いて、サーバ側でTagged VLANを認識できるよう設定します。

構成図を示します。赤字のIPアドレスは先ほどオーダーしたPortable Subnetです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/e54c9936-0ab5-df23-f682-7375c9bcb0a1.png)


以下はUbuntu LinuxにTagged VLANを設定する方法です。
Redhatの場合は[こちら](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s2-networkscripts-interfaces_802.1q-vlan-tagging.html)をご参照ください。



(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アドレスを定義します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/b6452cbd-e4a9-94bc-088c-47b1af633094.png)

(1) Vyattaの管理コンソールを開きます。
ブラウザからVGAのPrivate IPに接続します。
`https://10.28.205.138`
証明書の警告が出ると思いますが、警告を受け入れて先へ進みます。
Usernameはvyattaです。
Passwordは、カスタマーポータルからDevices → Device listを開き、VGAの左側にある＞をクリックすると確認できます。

(2) 右上のConfigurationをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/ec0d0855-7750-a7eb-30c7-53bc4084ee06.png)

(3) 左側のメニューからInterface → Ethernet → eth0をクリックし、右側のパネルにIPアドレスを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/39b0a724-e8a2-c408-097a-27e57e2d00cc.png)

(4) 画面下のSETをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/e306496e-3c3a-0e30-3beb-1d73591d8f29.png)

(5) 画面上のSaveとCommitをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/4084223f-61fb-b8d2-f8f5-4860b3c97446.png)


(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]
```

以上で、設定と確認は完了です。