1. はじめに
Bluemix提供の「VPNサービス」を使って、BlumixコンテナのWebサーバーへSoftlayerの仮想インスタンスからアクセスする環境を構築しました。
今回は、BluemixとSoftlayerをVPN接続し、基本的な仕組みを理解するのが目的です。
IBMコンテナ(Docker)やVPNサービス、VyOS等の知識が必要な箇所がありますが、ともかく動かして全体イメージをつかめるように順を追って説明します。
2. 「IBM VPN サービス」について
Bluemix クラウド環境内で IBM コンテナー (Docker コンテナー) にセキュアにアクセスする際に使用します。
IBM コンテナーが前提で、これを使えばクラウドとオンプレミスのハイブリッドシステムが構築できます。
尚、「VPNサービス」は設定画面やコマンド、APIを使って設定できますが、今回は設定画面を使って設定しました。
下記サイトが参考になります。
VPNサービスについて
https://console.ng.bluemix.net/docs/services/vpn/vpn_overview.html#vpn_overview
コマンドライン、APIについて
https://console.ng.bluemix.net/docs/cli/plugins/vpn/index.html
https://new-console.ng.bluemix.net/apidocs/101
3. 構成について
SoftLayer東京DCのDebian8からcurlで、Blumix上のWebコンテナへVPN経由のプライベートアドレスでアクセスします。
Debian8はWebコンテナ作成用の操作PCとしても使用しています。
Bluemixでの使用地域は「米国南部」
・SoftLayer側アドレス関連情報は、インスタンスデプロイ時にアサインされる。
・Bluemix側VPNサービスパブリックIPは、サービス開始時にアサインされる。
・Bluemix側アドレス関連情報はコンテナイメージ起動時にアサインされる。
4. 構築順序
① 仮想インスタンスの作成
<SoftLayerポータルでの操作>
▼ VyOS用(vyos)とコンテナ構築環境用兼Web接続確認クライアント用(Debian8)の2台のインスタンスをオーダー。
※Debian8のパブリックIPとサブネットワーク値は「④VPNサービスの設定」で使用する。
② コンテナ環境の準備・作成
<SoftLayer作成のインスタンスでの操作>
▼ Debian8へDockerをインストール。
▼ Debian8へCloudFoundry CLIをインストール。
▼ Debian8へIBM Containers CF CLI プラグインをインストール。
▼ Debian8へDocker Hubより、ApachイメージをPULL。
▼ Debian8でコンテナイメージを作成。
▼ Debian8からIBMコンテナ・レポジトリーへ作成イメージをPUSHし、カタログに登録。
③ Webコンテナ実行
<Bluemixダッシュボードでの操作>
▼ Bluemixカタログより、作成したコンテナイメージを実行。
※稼働コンテナのサブネットワーク値は「④VPNサービスの設定」で使用する。
④ VPNサービスの設定
<Bluemiダッシボードでの操作>
▼「Gateway Appliance」でGatwway名登録。
▼ 「IKE & IPSec Policies」デフォルト値使用のため、入力変更なし。
▼ 「Site Connections」設定
⑤VyOSのVPN設定
<Debian8での操作>
▼ ここでは、「④VPNサービスの設定」で設定した値に合わせて、VyOSの設定を行います。
5. 構築
5-1. ① 仮想インスタンスの作成
・VyOS用(vyos)
・コンテナ構築環境用兼Web接続確認クライアント用(Debian8:Debian GNU/Linux 8.x jessie/Stable - Minimal Install (64 bit))
2つのインスタンスをオーダー。
VyOSのネットワーク情報は、
・パブリックIP「161.202.154.118」
・プライベートネットワーク「10.132.52.192/16」。
この値は「IBM VPNサービス設定」で使用します。
5-2. ② コンテナ環境の準備・作成
Debian8にコンテナ環境の準備作成を行います。
5-2-1. Dockerのインストール
▼ リポジトリー修正にvimをインストール
# apt-get install –y vim
▼ /etc/apt/sources.listにjessie-backportsの設定を追加
Debian8のDockerパッケージは”jessie-backports”リポジトリにあるので、リポジトリの有効化を行う。
# vi /etc/apt/sources.list
deb http://http.debian.net/debian jessie-backports main
▼ カーネルやパッケージ類をアップデート
# apt-get install –y update
▼ Dockerのインストール
# apt-get install –y docker.io
インストールしたDockerのバージョン確認
# docker version
Version 1.6.2が導入されました。
念のため、Dockerがインストールされたか確認します。
# docker run ubuntu:latest /bin/echo 'Hello docker'
ubuntuイメージがローカルにないので、Dockerリポジトリからubuntuイメージをダウンロードしています。
‘Hello Docker’が表示されましたので、正常にコンテナが起動しています。
▼ Dockerの起動
# /etc/init.d/docker start
▼ Docker自動起動の設定
自動起動設定のsysv-rc-confをインストール。
# apt-get install –y sysv-rc-conf
Dockerを自動起動に設定。
# sysv-rc-conf docker on
5-2-2. Debian8へCloudFoundry CLIをインストール
GitHubリポジトリhttps://github.com/cloudfoundry/cli/releases
よりダウンロードします。ここではダウンロードにLynxを使いました。
▼ Lynxのインストール
# apt-get install –y lynx
▼ Cloud Foundry CLIのダウンロード
# lynx https://github.com/cloudfoundry/cli/releases/tag/v6.21.1
ファイル名「cf-cli-installer_6.21.1_x86-64.deb」でディスクに保存
ダウンロードしたファイルをインストール
# dpkg –i cf-cli-installer_6.21.1_x86-64.deb
インストールしたCloud Foundry CLIのバージョン確認
# cf –v
5-2-3. Debian8へIBM Containers CF CLI プラグインをインストール
ここでは、“Linux 64 bit環境”のプラグインをインストールし、ログイン確認を行います。
▼ プラグインインストール
# cf install-plugin https://static-ice.ng.bluemix.net/ibm-containers-linux_x64
▼ プラグイン確認
# cf plugins
▼ ログイン確認
※あらかじめBluemix環境が使えるように準備しておいてください。
ログインには、メールID、パスワード、スペースが必要です!
30日フリートライアルは下記URLより
https://developer.ibm.com/sso/bmregistration?lang=ja_JP&ca=dwjapan-_-bluemix-_-bluemix-registration-_-landing&S_TACT=JP3GW27W&S_CMP=jp3gw
ここではBluemixの地域を、米国南部(cf login -a api.ng.bluemix.net)にしました。
<Cloud Foundry CLI へのログイン確認>
# cf login
①Apiのエンドポイント:米国南部は“api.ng.bluemix.net”です。2回目以降のログインでは、この項目の入力要求ありません。
②Bluemixログインの際のID
③Bluemixログインの際のパスワード
④Bluemixで登録した”スペース名”
ここでは、スペースを2つ作成していたため、スペース選択が表示されています。
< IBM Containers サービスへのログイン確認>
# cf ic login
ログインが確認できましたので、ログアウトします。
# cf logout
5-2-4. Debian8へDocker Hubより、ApachイメージをPULLしてプライベート Bluemixリポジトリーにビルド。
CloudFoundryCLIとIBMContainersサービス へのログイン。
Debian8のルート直下に/muraディレクトリーを作成し、その中にDockerfileを作成します。
# mkdir /mura
# cd /mura
# vim ./Dockerfile
FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/
EXPOSE 80
VOLUME ["/url/local/apache2/htdocs"]
Docker Hub より、httpd(Apache2)をPULLしています。
https://hub.docker.com/explore/
Docker イメージを、プライベート Bluemixリポジトリーにビルドします。
ここでは、米国南部(registry.ng.bluemix.net)を使いました。
# cf ic build -t registry.ng.bluemix.net/muranamespace/apache:v1 .
namespaceがわからない場合は、下記コマンドで確認してください。
# cf ic namespace get
「cf ic」コマンドまたはBluemix カタログで、作成したコンテナイメージを確認します。
<cf ic コマンドで確認>
# cf ic images
5-3. ③ Webコンテナ実行
▼ コマンドで実行する方法とBluemixカタログから実行する方法がありますが、ここではカタログから実行します。
「作成」をクリック。
しならくすると、「コンテナ名:murac」が実行されます。
▼ コンテナ実行確認
コマンドまたはBluemixダッシュボードで確認できます。
<cf ic コマンドで確認>
# cf ic ps
「コンテナID:b95b454b-158」で稼働しています。
▼ コンテナのネットワーク確認
# cf ic inspect コンテナID
# cf ic inspect b95b454b-158
[{
"BluemixApp": null,
"BluemixServices": null,
"Config": {
"AttachStderr": false,
"AttachStdin": false,
"AttachStdout": false,
"Cmd": [],
"Dns": "",
"Env": [
"logging_password=",
"space_id=d5f00494-eba9-4c8b-8c4d-8776619d518b",
"logstash_target=logmet.opvis.bluemix.net:9091",
"metrics_target=logmet.opvis.bluemix.net:9095"
],
"Hostname": "instance-00138e9d",
"Image": "registry.ng.bluemix.net/muranamespace/apache:v1",
"ImageArchitecture": "amd64",
"Labels": {},
"Memory": 256,
"MemorySwap": "",
"OpenStdin": true,
"PortSpecs": "",
"StdinOnce": false,
"Tty": true,
"User": "",
"VCPU": 4,
"VolumesFrom": "",
"WorkingDir": ""
},
"ContainerState": "Running",
"Created": "2016-08-24T01:09:13.000000000Z",
"Group": {},
"HostConfig": {
"Binds": [],
"CapAdd": [],
"CapDrop": [],
"ContainerIDFile": "",
"Links": [],
"LogConfig": {
"Config": {},
"Type": "json-file"
},
"LxcConf": [],
"PortBindings": {
"80/tcp": [
{
"HostPort": "80"
}
]
},
"Privileged": false,
"PublishAllPorts": false
},
"HostId": "6e8cf8ca072d1e14cb4b9b570da9fde3d2303d49c2281d8e5ebef119",
"Human_id": "murac",
"Id": "b95b454b-158a-4a16-8d20-94ef8ce897f6",
"Image": "e61e9170b00b2b32655db4661135a7cc3f9649a767fff13cb96482070ac4e4be",
"Mounts": [],
"Name": "murac",
"NetworkSettings": {
"Bridge": "",
"Gateway": "",
"IPAddress": "172.31.0.2",
"IPPrefixLen": 0,
"MacAddress": "fa:16:3e:cf:73:8f",
"Networks": {
"default": {
"Aliases": null,
"EndpointID": "b95b454b-158a-4a16-8d20-94ef8ce897f6",
"Gateway": "172.31.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAMConfig": null,
"IPAddress": "172.31.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"Links": null,
"MacAddress": "fa:16:3e:cf:73:8f",
"NetworkID": "a1983a32-958f-40db-a9b3-002d608ec848"
}
},
"PortMapping": null,
"Ports": {
"80/tcp": [
{
"HostIp": "172.31.0.2",
"HostPort": "80"
}
]
},
"PublicIpAddress": ""
},
"Path": "date",
"ResolvConfPath": "/etc/resolv.conf",
"State": {
"Error": "",
"ExitCode": 0,
"FinishedAt": "0001-01-01T00:00:00Z",
"Ghost": "",
"Pid": 1,
"Running": true,
"StartedAt": "2016-08-24T01:09:20.000000000Z",
"Status": "Running"
},
"Volumes": {},
"VolumesRW": {}
}]
grepで必要な箇所を抜き出してみます。
# cf ic inspect b95b454b-158 |grep IPAddress
WebコンテナのプライベートIPは、「172.31.0.2」です。
5-4. ④ VPNサービスの設定
Bluemixの「VPNサービス」をオーダーし、設定します。
ここまでの手順で、
「5-1. ① 仮想インスタンスの作成」より
・VyOS側のパブリックIP:「161.202.154.118」
・VyOS側のプライベートネットワーク:「10.132.52.192/16」
「5-3. ③ Webコンテナ実行」より
・WebコンテナのプライベートIP:「172.31.0.2」がわかっています。
事前共有鍵を「shared-key」という名前にしました。
▼ 「IBM VPN サービス」のオーダー
「Virtual Private Network」を選択し、クリック。
「作成」をクリック。
※1つのスペースには「IBM VPNサービス」は1つまでです。
1つの「IBM VPNサービス」は複数の接続先が設定可能。
しばらくすると、Bluemixダッシュボードに「IBM VPNサービス」が表示されます。
クリックして次に進みます。
▼ 「IBM VPN サービス」の設定
「Create Gateway」をクリック。
「Gateway Apliance」タグ選択⇒「Edit」をクリック。
WebコンテナのプライベートIP、プライベートネットワークは自動的に取得されているのが確認できます。
また、VPNサービスのパブリックIPは「169.46.158.54」です。
「Gateway Apliance Name」は「VPNGW01」⇒「Save」をクリック。
ここでは「IKE & IPsec Polices」はデフォルト値を使用しますので、設定しません。
ちなみにデフォルト値は下記の通りです。
「Site Connections」の設定します。
「Site Connections」タブをクリック
① Name: デフォルト値の「Connection1」
②「PreShared Key String」: 「shared-key」
後ほど設定するVyOS-VPN設定の” vpn ipsec site-to-site peer 169.46.158.54 authentication pre-shared-secret shared-key”と合わせる。
③「Customer GatewayIP」: 「161.202.154.118」
VyOSのパブリックIP
④「Customer Subnet」: 「10.132.52.192/16」
VyOSのプライベートネットワーク
⑤「Description」: 必須でないので入力なし
⑥「Admin State」: 「down」
VyOS設定した後に「up」にして接続する。
各パラメータ入力後、「save」をクリック
5-5. ⑤VyOSのVPN設定
SoftLayer側の「vyos」の設定です。
VyOSの導入、基本設定は省略します。
(参考情報)・VyOS導入
「SoftLayer仮想サーバにVyOSをインストールしました」
http://qiita.com/Mitsu-Murakita/items/d793250566a8e9f3562b
「SoftLayerとVyOSでネットワークの基礎を勉強4-(IPsecVPN LAN間接続編)」
http://qiita.com/Mitsu-Murakita/items/9bb09f54494345b51ce8
VyOSの基本設定情報です。これにVPN関連情報を追加していきます。
interfaces {
ethernet eth0 {
address 10.132.52.226/26
duplex auto
hw-id 06:38:a7:d9:ec:e4
smp_affinity auto
speed auto
}
ethernet eth1 {
address 161.202.154.118/29
duplex auto
hw-id 06:dc:71:bf:8e:b3
smp_affinity auto
speed auto
}
loopback lo {
}
}
protocols {
static {
route 10.0.0.0/8 {
next-hop 10.132.52.193 {
}
}
}
}
service {
ssh {
port 22
}
}
system {
config-management {
commit-revisions 20
}
console {
device hvc0 {
speed 9600
}
device ttyS0 {
speed 9600
}
}
domain-name softlayer.com
gateway-address 161.202.154.113
host-name vyos
login {
user vyos {
authentication {
encrypted-password xxxxxxxxxxxxxxxxxxxx
plaintext-password ""
}
level admin
}
}
name-server 10.0.80.11
name-server 10.0.80.12
ntp {
server time.service.networklayer.com {
}
}
package {
auto-sync 1
repository community {
components main
distribution helium
password ""
url http://packages.vyos.net/vyos
username ""
}
}
syslog {
global {
facility all {
level notice
}
facility protocols {
level debug
}
}
}
time-zone Asia/Tokyo
}
下記VPNの設定を追加します。
※説明しやすいように行番号[xx]をつけてます。
[01] # set vpn ipsec esp-group bmixvpn-esp
[02] # set vpn ipsec esp-group bmixvpn-esp compression disable
[03] # set vpn ipsec esp-group bmixvpn-esp lifetime 3600
[04] # set vpn ipsec esp-group bmixvpn-esp mode tuunel
[05] # set vpn ipsec esp-group bmixvpn-esp pfs dh-group2
[06] # set vpn ipsec esp-group bmixvpn-esp proposal 1
[07] # set vpn ipsec esp-group bmixvpn-esp proposal 1 encryption aes128
[08] # set vpn ipsec esp-group bmixvpn-esp proposal 1 hash sha1
[09] # set vpn ipsec ike-group bmixvpn-ike
[10] # set vpn ipsec ike-group bmixvpn-ike lifetime 28800
[11] # set vpn ipsec ike-group bmixvpn-ike proposal 1
[12] # set vpn ipsec ike-group bmixvpn-ike proposal 1 dh-group 2
[13] # set vpn ipsec ike-group bmixvpn-ike proposal 1 encryption aes128
[14] # set vpn ipsec ike-group bmixvpn-ike proposal 1 hash sha1
[15] # set vpn ipsec ipsec-interfaces interface eth0
[16] # set vpn ipsec site-to-site peer 169.46.158.54
[17] # set vpn ipsec site-to-site peer 169.46.158.54 authentication
[18] # set vpn ipsec site-to-site peer 169.46.158.54 authentication id 161.202.154.118
[19] # set vpn ipsec site-to-site peer 169.46.158.54 authentication mode pre-shared-secret
[20] # set vpn ipsec site-to-site peer 169.46.158.54 authentication pre-shared-secret shared-key
[21] # set vpn ipsec site-to-site peer 169.46.158.54 authentication remote-id 169.46.158.54
[22] # set vpn ipsec site-to-site peer 169.46.158.54 connection-type respond
[23] # set vpn ipsec site-to-site peer 169.46.158.54 default-esp-group bmixvpn-esp
[24] # set vpn ipsec site-to-site peer 169.46.158.54 ike-group bmixvpn-ike
[25] # set vpn ipsec site-to-site peer 169.46.158.54 local-address any
[26] # set vpn ipsec site-to-site peer 169.46.158.54 tunnel 1
[27] # set vpn ipsec site-to-site peer 169.46.158.54 tunnel 1 local
[28] # set vpn ipsec site-to-site peer 169.46.158.54 tunnel 1 local prefix 10.132.52.192/26
[29] # set vpn ipsec site-to-site peer 169.46.158.54 tunnel 1 remote prefix 172.31.0.0/16
VyOS側のVPN設定です。
interfaces {
ethernet eth0 {
address 10.132.52.226/26
duplex auto
hw-id 06:38:a7:d9:ec:e4
smp_affinity auto
speed auto
}
ethernet eth1 {
address 161.202.154.118/29
duplex auto
hw-id 06:dc:71:bf:8e:b3
smp_affinity auto
speed auto
}
loopback lo {
}
}
protocols {
static {
route 10.0.0.0/8 {
next-hop 10.132.52.193 {
}
}
}
}
service {
ssh {
port 22
}
}
system {
config-management {
commit-revisions 20
}
console {
device hvc0 {
speed 9600
}
device ttyS0 {
speed 9600
}
}
domain-name softlayer.com
gateway-address 161.202.154.113
host-name vyos
login {
user vyos {
authentication {
encrypted-password xxxxxxxxxxxxxxxxxxx
plaintext-password ""
}
level admin
}
}
name-server 10.0.80.11
name-server 10.0.80.12
ntp {
server time.service.networklayer.com {
}
}
package {
auto-sync 1
repository community {
components main
distribution helium
password ""
url http://packages.vyos.net/vyos
username ""
}
}
syslog {
global {
facility all {
level notice
}
facility protocols {
level debug
}
}
}
time-zone Asia/Tokyo
}
vpn {
ipsec {
esp-group bmixvpn-esp {
compression disable
lifetime 3600
mode tunnel
pfs dh-group2
proposal 1 {
}
}
ike-group bmixvpn-ike {
lifetime 28800
proposal 1 {
dh-group 2
encryption aes128
hash sha1
}
}
ipsec-interfaces {
interface eth0
}
site-to-site {
peer 169.46.158.54 {
authentication {
id 161.202.154.118
mode pre-shared-secret
pre-shared-secret shared-key
remote-id 169.46.158.54
}
connection-type respond
default-esp-group bmixvpn-esp
ike-group bmixvpn-ike
local-address any
tunnel 1 {
local {
prefix 10.132.52.192/26
}
remote {
prefix 172.31.0.0/16
}
}
}
}
}
}
6. 接続確認
「IBM VPNサービス」側の「Admin State」を”DOWN”にしていますので、VyOS側のVPNも"down"の状態です。
# show vpn ipsec sa
「IBM VPNサービス」側の「Admin State」を”UP”にします。
「Site Connections」⇒「Edit」
「Pre Shared Key」がブランクですので、再度入力し("shared-key")、「Admin State」を”UP” ⇒「Save」
VyOS側のIPsec-VPNが"up"になり、VPN通信が接続できました。
・PINGでの接続確認
VyOS側ネットワーク上の「Debian8」からWebコンテナに対してPING確認します。
「Debian8」にスタティックルートの設定を行います。
# route add -net 172.31.0.0 netmask 255.255.0.0 gw 10.132.52.226
・curlでWebコンテナのコンテンツ表示の確認
'It works!'が表示されたので、Webも正常に動作しています。
7. おわりに
Bluemix環境とSoftLayer環境の接続でしたが、SoftLayer環境をオンプレミスに置き換えれば、セキュアなハイブリッド環境も比較的容易に構築できると思います。