VyOSでプライベートIPの自宅ネットワークにリモートアクセスしたい!(OpenVPN編)


(2017/8/18)最後の(おまけ2)OpenVPN上でOSPFの経路交換を動作させるは動作が安定しなかったので、Staticによる経路交換を行うようにしてください

我が家はマンション専用プロバイダと契約していることもあり、DHCPでプライベートIPアドレス(10.XXX.YYY.ZZZ/22)がマンション側で管理している機器から振ってくる。そのため、外部から自宅にリモートアクセスするには別のグローバルIPがもらえるプロバイダとの契約しかないと思っていた。
しかし、その打開策を考えたので今回はそのネットワーク環境を構築していく。

ネットワーク図


簡単な説明としては、さくらクラウドにVyOS(グローバルIP付き)を一台立てて、それと自宅のVyOSをVPN(OpenVPN)で接続する。また、外部から接続する場合は、さくらクラウドのVyOSにVPN(L2TP over IPsec)で接続する。これによって、リモートでのSSHアクセス等が可能になる。
その構築を「環境構築編」,「OpenVPN編」,「L2TP over IPsec編」と3つの記事で説明する。

OpenVPN編

今回は、前回の環境構築編に続き、自宅VyOSとさくらクラウドVyOS間をOpenVPNで繋ぐ方法を書いていきます。
https://wiki.vyos.net/wiki/OpenVPNを参考にしていて、本記事はこれを見れば必要ないというくらいです。汗

ちなみにVPNにOpenVPNを選定した理由としては、L2TP over IPsecより高速であること(噂)、VyOSのConfig的にOpenVPN上でOSPFを簡単に張ったりできそうだったためである。

VyOSの各VPN(L2TP over IPsec,OpenVPN,PPTP?)には、site to siteという拠点間接続用のConfigができるが、今回は自宅VyOSがプライベートIPしかないというデス環境なので、これは行わない。

認証局,鍵,DHパラメータの作成等

さくらクラウドのVyOS(Server側)

さくらクラウドのVyOSはOpenVPNのserverとして動作させる。

vyosにログイン後、sudo環境での作業を楽にするためにrootアカウントの有効化をします。

# 設定モードに入る
configure

# rootパスワード設定
set system login user root authentication plaintext-password rootのパスワード 

# 変更のコミットおよび設定保存
commit 
save 

rootユーザでログインする

$ su -
[設定したrootパスワードの入力]
  • OpenVPN環境変数の設定
$ cp -rv /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /config/easy-rsa2-my
$ cd /config/easy-rsa2-my
$ vi vars
(以下の部分を各自の環境に編集)
export KEY_COUNTRY="US" ←サーバーの所在国を指定(日本なら"JP")
export KEY_PROVINCE="CA" ←サーバーの所在地(都道府県)を設定(東京なら"Tokyo")
export KEY_CITY="SanFrancisco" ←サーバーの所在地(市区町村)を設定(秋葉原なら"Akihabara")
export KEY_ORG="Fort-Funston" ←サーバーの所有団体の設定(例.hogehoge.com)
export KEY_EMAIL="[email protected]" ←サーバーの所有者のE-mailアドレス(例[email protected])
~

編集後、OpenVPN環境変数の設定ファイルの反映を行う。

$ source vars
  • 認証局,鍵,DHパラメータファイルの初期化(初回のみ)
$ ./clean-all

~以降のShellはEnterゲーです~
shell実行後は、入力を求められたらEnterです。
[y/n]を求められたらyです。
openvpn.jpのHow toを読むと設定の詳細が理解できるかと思います。

  • 認証局の証明書・鍵作成
$ ./build-ca
  • サーバー側の証明書・鍵作成
$ ./build-key-server server
  • クライアント側の証明書・鍵作成
$ ./build-key client
  • DHパラメータの作成
$ ./build-dh
  • 作成されたサーバー関係のファイル(ca.crt,dh1024.pem,server.key,server.crt)をさくらクラウドのVyOSのディレクトリにコピーする
$ mkdir /config/auth/ovpn
$ cp keys/ca.crt /config/auth/ovpn/
$ cp keys/dh1024.pem /config/auth/ovpn/
$ cp keys/server.key /config/auth/ovpn/
$ cp keys/server.crt /config/auth/ovpn/

自宅のVyOS(Client側)

自宅のVyOSはOpenVPNのclientとして動作させる。

  • さくらクラウドのVyOSで作成されたクライアント関係のファイル(ca.crt, client.key and client.crt)を自宅のVyOSのディレクトリにコピーする(Cyberduck等を利用してSFTPでコピーするのが早い)
$ mkdir /config/auth/ovpn

[SFTP等でさくらクラウドのVyOSのca.crt, client.key and client.crtを自宅VyOSの`/config/auth/ovpn/`にコピーする]

interface openvpnの設定

ここまでで設定した、認証局,鍵,DHパラメータファイルを参照して、interface openvpnを作成していく。

さくらクラウドのVyOS(Server側)

# 設定モードに入る
configure

# serverモードでvtun0を作成
set interfaces openvpn vtun0 mode server

# openvpnセッションのsubnetを設定(任意)
# serverが192.168.20.1/24となる
# clientには接続順で192.168.20.2 ~ 192.168.20.254で振られる
set interfaces openvpn vtun0 server subnet 192.168.20.0/24

# OpenVPN(Server)に必要な各ファイルを参照させる
set interfaces openvpn vtun0 tls ca-cert-file '/config/auth/ovpn/ca.crt'
set interfaces openvpn vtun0 tls cert-file '/config/auth/ovpn/server.crt'
set interfaces openvpn vtun0 tls dh-file '/config/auth/ovpn/dh1024.pem'
set interfaces openvpn vtun0 tls key-file '/config/auth/ovpn/server.key'

# 変更のコミットおよび設定保存
commit 
save 

自宅のVyOS(Client側)

# 設定モードに入る
configure

# clientモードでvtun0を作成
set interfaces openvpn vtun0 mode client

# OpenVPN Serverの指定
set interfaces openvpn vtun0 remote-host [さくらクラウドのVyOSのグローバルIP]

# OpenVPN(client)に必要な各ファイルを参照させる
set interfaces openvpn vtun0 tls ca-cert-file '/config/auth/ovpn/ca.crt'
 set interfaces openvpn vtun0 tls cert-file '/config/auth/ovpn/client.crt'
 set interfaces openvpn vtun0 tls key-file '/config/auth/ovpn/client.key'

# 変更のコミットおよび設定保存
commit 
save 

OpenVPN確認

正しくOpenVPN接続ができているか確認する。

  • さくらクラウドのVyOSから確認
$ show openvpn server status
  • 自宅のVyOSから確認
$ show openvpn client status
  • pingで確認

さくらクラウドのVyOSから

$ ping 192.168.20.2

自宅VyOSで

$ sudo tcpdump -i vtun0

tcpdumpでicmpパケットが192.168.20.1から届いていることが確認できればOK!!

(おまけ1)OpenVPN上をStaticに経路交換を動作させる

後に、L2TP over IPsecで接続するリモート端末への経路と外部からアクセスしたい自宅サーバへの経路を各VyOSで経路交換する必要があるので、以下のConfigにより経路交換を行う。
Tunnel IPの部分は$ show interfaceを行うと確認できます。

さくらクラウドのVyOS

# 設定モードに入る
configure

# ポイントツーポイント(2つのルータで構成されるネットワーク)を指定
set interfaces openvpn vtun0 server topology point-to-point

# server側とclient側を対応付ける
set interfaces openvpn vtun0 server client (client名) ip 192.168.20.2(clientに割り振られたTunnel IP)

# client側のローカルネットワークがOpenVPNを経由することを設定
set interfaces openvpn vtun0 server client (client名) subnet 192.168.10.0/24(リモートアクセスしたい自宅のネットワークアドレス)

# 自宅のローカルネットワークにアクセスするための経路を自宅VyOSに広告する
set protocols static route 192.168.10.0/24 next-hop 192.168.20.2

# 変更のコミットおよび設定保存
commit 
save 

自宅のVyOS

# 設定モードに入る
configure

# 自宅のローカルネットワークへのアクセスを広告することを明示的に設定(おそらく必要ない)
set interfaces openvpn vtun0 openvpn-option "--push route 192.168.1.0 255.255.255.0"

# L2TP over IPsec(リモート)から自宅のローカルネットワークへの経路をさくらクラウドのVyOSに広告する
set protocols static route [L2TP over IPsecで外部の端末と接続する際のネットワークアドレス/32] next-hop 192.168.20.1(serverに割り振られたTunnel IP)

# 変更のコミットおよび設定保存
commit 
save 

Static経路確認コマンド

ルーティングテーブルから正しく経路が見れるか確認

$ show ip route

これで、リモート端末への経路と外部からアクセスしたい自宅サーバへの経路が各ルーターから確認できれば完了

(おまけ2)OpenVPN上でOSPFの経路交換を動作させる

(2017/8/17)OSPFの経路交換の不足を更新
(おまけ1)で経路交換を行うようにしてください

後に、L2TP over IPsecで接続するリモート端末への経路と外部からアクセスしたい自宅サーバへの経路を各VyOSで経路交換する必要があるので、以下のConfigによりOSPFを動作させる。

さくらクラウドのVyOS

# 設定モードに入る
configure

# OSPFの各パラメータを設定(defaultと同じ設定だが明示的に設定)
set interfaces openvpn vtun0 ip ospf dead-interval 40
set interfaces openvpn vtun0 ip ospf hello-interval 10
set interfaces openvpn vtun0 ip ospf retransmit-interval 5
set interfaces openvpn vtun0 ip ospf transmit-delay 1

# 経路交換するネットワークを設定
set protocols ospf area 0 network 192.168.20.0/24
set protocols ospf area 0 network 192.168.20.xxx/32(server側に割り当てられたTunnel IP)
set protocols ospf area 0 network [L2TP over IPsecで外部の端末と接続する際のネットワーク]

# vtun0以外にはHelloパケットを流さないよう設定
set protocols ospf passive-interface default
set protocols ospf passive-interface-exclude vtun0

# 変更のコミットおよび設定保存
commit 
save 

自宅のVyOS

# 設定モードに入る
configure

# OSPFの各パラメータを設定(defaultと同じ設定だが明示的に設定)
set interfaces openvpn vtun0 ip ospf dead-interval 40
set interfaces openvpn vtun0 ip ospf hello-interval 10
set interfaces openvpn vtun0 ip ospf retransmit-interval 5
set interfaces openvpn vtun0 ip ospf transmit-delay 1

# 経路交換するネットワークを設定
set protocols ospf area 0 network 192.168.20.0/24
set protocols ospf area 0 network 192.168.20.yyy/32(client側に割り当てられたTunnel IP)
set protocols ospf area 0 network 192.168.10.0/24(外部からアクセスしたい自宅サーバの属するネットワーク)

# vtun0以外にはHelloパケットを流さないよう設定
set protocols ospf passive-interface default
set protocols ospf passive-interface-exclude vtun0

# 変更のコミットおよび設定保存
commit 
save 

OSPF確認コマンド

ルーティングテーブルから正しく経路交換がされているか確認

$ show ip route

これで、リモート端末への経路と外部からアクセスしたい自宅サーバへの経路が各ルーターから確認できれば完了