さくらのクラウドにVyOSでVPNルーターを構築する


パブリッククラウド上にプライベートなサービスを乗せる際など、拠点間VPNを張りたい場合、VyOSを使えば簡単にVPNルーターを構築できるのでご紹介。今回はさくらのクラウドで構築しました。ネットワークは以下の通り。

nwmap_vyos_20150218

■ ログイン

インスタンスができたばかりの状態はSSH接続ができないので、コンソールからログインします。

ユーザー名: vyos
パスワード: インスタンス作成時に決めたもの

■ NIC追加

10.0.0.0/8側に足が伸びるネットワークはeth1となります。(インスタンスができた後、予めNICを追加しておいてください)。NICを追加した後はIPアドレスが振られていないので、コンソールからログインして、以下のコマンドでeth1のインターフェイスにIPアドレスを追加します。

$ configure
# set interface ethernet eth1 address 10.0.0.10/8
# commit
# save

■ SSH設定

VyOSは初期状態でSSH接続を受け付けないので、以下のコマンドでSSH接続を受け付ける設定をします。

# set service ssh
# commit
# save

■ NAT設定

10.0.0.0/8なアドレスからeth0を経由してインターネットへ出る際にNAT(SNAT)できるようにします。

# set nat source rule 999 outbound-interface eth0
# set nat source rule 999 translation address masquerade
# commit
# save

■ VPN(PPTP)設定

PPTPでVPN接続を受け付ける際に決めるパラメーターは以下の通りです。

VPN接続を待ち受けるIPアドレス: 133.242.xxx.xxx (VyOSのグローバルIPアドレス)
VPNクライアントに付与するIPアドレス: 10.0.0.100〜10.0.0.199
DNSサーバーのIPアドレス: 133.242.0.3 (さくらのクラウド DNSサーバー)
VPNクライアントのユーザー名: nullpopopo
VPNユーザー nullpopopo のパスワード: P@sSW0rD

# set vpn pptp remote-access outside-address 133.242.xxx.xxx
# set vpn pptp remote-access client-ip-pool start 10.0.0.100
# set vpn pptp remote-access client-ip-pool stop 10.0.0.199
# set vpn pptp remote-access dns-servers server-1 133.242.0.3
# set vpn pptp remote-access authentication local-users username nullpopopo
# set vpn pptp remote-access authentication local-users username nullpopopo password P@sSw0rD
# set vpn pptp remote-access authentication mode local
# commit
# save

VyOSの設定は以上です。

■ クライアントからのコマンドラインを用いた接続とルーティング設定

VyOSはeth1のアドレスとは別にゲートウェイとなるアドレスをPPTPクライアントに配るようなので、これを確認してから設定します。以下、クライアント(Fedora20)でのコマンドです。

現在のルーティングを確認する

$ ip r
default via 192.168.0.254 dev p2p1  proto static  metric 1024 
192.168.0.0/24 dev p2p1  proto kernel  scope link  src 192.168.0.134

デフォルトゲートウェイは自宅のブロードバンドルーター (192.168.0.254) に向いています。

対向ルーターの登録を行う

登録名: SAKURA
vyattaサーバーのグローバルIPアドレス: 133.242.xxx.xxx
ユーザー名: nullpopopo
パスワード: P@sSw0rD

$ sudo pptpsetup --create "SAKURA" --server "133.242.xxx.xxx" --username "nullpopopo" --password "P@sSw0rD" --encrypt

対向ルーターに接続する

$ sudo pppd call SAKURA updetach
Using interface ppp0
Connect: ppp0 <--> /dev/pts/1
CHAP authentication succeeded
MPPE 128-bit stateless compression enabled
local  IP address 10.0.0.100
remote IP address 10.255.254.0

このように、pppdコマンドでの接続に成功すると、ppp0というインターフェイスができ、local IPに10.0.0.100が振られ、remote IP (対向ルーターのIPアドレス) は10.255.254.0であると広報されます。もしこれを見逃しても、対向ルーターのIPアドレスはipコマンドで確認することができます。

対向ルーターのIPアドレスを取得する

ipコマンドを使ってppp0インターフェイスを確認します。

$ ip a show dev ppp0

対向ルーターのIPアドレスを取得する(IPアドレスのみ表示させるシェル芸)

$ ip a show dev ppp0 | grep inet | awk '{print $4}' | sed -e 's/\/[0-9]*//g'

ルーティング設定

デフォルトゲートウェイを対向ルーターのIPアドレスに設定する

$ sudo ip route add default via $(ip a show dev ppp0 | grep inet | awk '{print $4}' | sed -e 's/\/[0-9]*//g')

インターネットへのルーティングをppp0に設定する

$ sudo ip route add 0.0.0.0 dev ppp0

既存のデフォルトゲートウェイを削除する

$ sudo ip route del default via 192.168.0.254

ルーティングの設定は上記の順番で行ってください。そして、以下のようなルーティングテーブルが表示されていることを確認します。

$ ip r
0.0.0.0 dev ppp0  scope link
default via 10.255.254.0 dev ppp0
10.255.254.0 dev ppp0  proto kernel  scope link  src 10.0.0.100
133.242.xxx.xxx via 192.168.0.254 dev p2p1  src 192.168.0.134
192.168.0.0/24 dev p2p1  proto kernel  scope link  src 192.168.0.134

Google Public DNSというIaaS(ICMP as a Service)への経路をtracerouteコマンドで表示して、1hop目が対向ルーターのIPアドレスになっていることを確認します。

$ traceroute -n 8.8.4.4
traceroute to 8.8.4.4 (8.8.4.4), 30 hops max, 60 byte packets
 1  10.255.254.0  20.942 ms  20.930 ms  20.932 ms
 2  153.120.25.2  20.933 ms  27.525 ms  27.809 ms
 3  103.10.113.25  27.427 ms  27.443 ms  27.345 ms
 4  103.10.113.93  27.854 ms 103.10.113.17  27.806 ms  27.760 ms
 5  103.10.113.117  33.341 ms 103.10.113.69  27.819 ms 103.10.113.61  36.780 ms
 6  157.17.131.241  39.973 ms 157.17.131.1  36.379 ms 157.17.131.5  36.312 ms
 7  157.17.130.45  38.299 ms 59.106.247.117  36.460 ms 210.171.224.96  37.313 ms
 8  210.171.224.96  36.956 ms 216.239.47.91  37.364 ms 210.171.224.96  36.683 ms
 9  72.14.239.165  37.352 ms 216.239.47.91  40.165 ms 216.239.47.89  39.530 ms
10  72.14.239.165  36.579 ms 209.85.254.205  39.522 ms 209.85.143.31  36.891 ms
11  8.8.4.4  39.827 ms  38.828 ms  36.679 ms

VPN切断

ここまで確認できたところで、VPN接続を切断します。

$ sudo pkill -f "pppd call SAKURA updetach"

さらに、ルーティングが元に戻っていることを確認します(対向ルーターのアドレスが残っているぶんには構いません)。

$ ip r
default via 192.168.0.254 dev p2p1  proto static  metric 1024
133.242.xxx.xxx via 192.168.0.254 dev p2p1  src 192.168.0.134
192.168.0.0/24 dev p2p1  proto kernel  scope link  src 192.168.0.134

tracerouteでインターネットへの接続を確認します。1hop目がブロードバンドルーターのアドレスになっていればOKです。

$ traceroute -n 8.8.4.4
traceroute to 8.8.4.4 (8.8.4.4), 30 hops max, 60 byte packets
 1  192.168.0.254  16.888 ms  16.685 ms  29.777 ms
 2  * * *
(略)

いかがでしたでしょうか?VyOSを使うと簡単にVPNを構築することができます。iPhoneやアンドロイドからも繋がることを確認してみると面白いでしょう。