前回の証明書による内部ネットワークOpenVPN接続は完了しましたので、次に実用的な外部ネットワークでのOpenVPN接続を試して行きます。
作業の流れ
- OpenVPNサーバのファイアウォール設定
- ルーター設定でOpenVPNポートを開放
- OpenVPNサーバを起動
- OpenVPNクライアントの設定
- OpenVPNクライアントを外部ネットワークから起動
- 接続確認
OpenVPNサーバのファイアウォール設定
まずはufw が現在有効になっているかを確認します。
~$ sudo ufw status
ufw はデフォルトで無効(disable)なので、有効(enable)にします。
~$ sudo ufw status (状況確認)
~$ sudo ufw enable (有効化、無効化は disable)
~$ sudo ufw status verbose (有効化後の初期状態を確認)
初期状態で全部を遮断(deny)なので、開放するポート(allow)を設定します。
OpenVPNのポートと、その他の必要なポートを開放します。
~$ sudo ufw allow openvpn (allow 1194/udp でも可)
~$ sudo ufw allow ssh (ssh は初期設定が port 22 なので allow 22 でも可)
~$ sudo ufw allow samba (samba は初期設定が port 445/tcp なので allow 445/tcp でも可)
~$ sudo ufw status numbered (番号つき状況確認)
ufwに関しては、”すべてのトラフィックをVPN経由にする”のところで設定(/etc/default/ufw)を編集する必要があります。
ルーター設定でOpenVPNポート(1194)を開放
自宅のインターネット環境によりますが、ルーターはデフォルトで外部からのアクセスを遮断するため、接続するポートを開放する必要があります。
まずはルーターの設定画面へ移動するため、ブラウザのアドレス入力欄にルーターのアドレスを入力します。
多くのルーター機器では大抵の場合、ユーザー名とパスワードを入力してログインしますと、次のような設定画面になります。
ほとんどのルーターで設定方法は同じだと思いますが、入力する項目は次のようになります。
このルーターでは「ポートマッピング設定」となっています。
- 公開する端末のIPアドレス
- LAN側のポート番号
- インターネット側のポート番号
- プロトコル(TCP/UDP)
今回の設定は、次のようになります。
OpenVPNサーバ IPアドレス | プロトコル | LAN側ポート番号 | インターネット側ポート番号 |
192.168.10.118 | UDP | 1194 | 1194 |
ついでに、ルーターの詳細情報よりグローバルIPアドレスも確認しておきます。
WAN側IPアドレス |
設定が完了してログアウトしますと、しばらくして設定内容が更新されていると思います。
OpenVPNサーバを起動
OpenVPNサーバの設定に変更はありません。
~/vpn_server$ sudo openvpn my_server.conf
起動後はクライアントからの接続を待機します。
OpenVPNクライアントの設定
外部ネットワークからのアクセスですので、client.conf 設定ファイルの remote で始まる接続先IPアドレスを変更しました。
~/vpn_client$ vim my_client.conf
44行目 remote 192.168.10.118 1194
↓
44行目 remote 133.123.456.789 1194 (グローバルIPアドレスへ変更)
OpenVPNクライアントを起動
外部ネットワークからのアクセスはスマホの「デザリング機能」を利用しました。
インターネットへの接続を確認後にOpenVPNクライアントを起動しました。
~/vpn_client$ sudo openvpn my_client.conf
「Initialization Sequence Completed」の表示が出れば接続中のようです。
接続確認
クライアントからは別のターミナルでping10.8.0.1 へ送信しました。
~$ ping 10.8.0.1
次にSambaが使えるかを確認しました。
その他にもOpenVPNでは、次のように設定をすることで、クライアントのすべてのトラフィック(Webトラフィックを含む)をVPN経由にルーティングすることもできるようです。
~/vpn_server$ vim my_server.conf
(変更)
192 ;push "redirect-gateway def1 bypass-dhcp"
↓
192 push "redirect-gateway def1 bypass-dhcp"
(追加)
202 push "dhcp-option DNS 10.8.0.1"
Linuxでは、次のコマンドでVPNクライアントをインターネットにNATで接続させることができるそうです。
~$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
次にパケットを転送するため「/etc/sysctl.conf」の「net.ipv4.ip_forward」をONにする必要があります。
~$ sudo vi /etc/sysctl.conf
# net.ipv4.ip_forward=1
↓
net.ipv4.ip_forward=1
詳細については OpenVPN.JP How To をご確認下さい。
(追加)ファイヤーウォール(ufw)の設定を変更する
ufwはデフォルトで転送パケットが許可されていない(“DROP”)ようなので、許可(“ACCEPT”)します。
~$ sudo vi /etc/default/ufw
次のように変更します。
DEFAULT_FORWARD_POLICY="ACCEPT"
詳しくはこちらを参考にして下さい
OpenVPNサーバの自動起動(systemd)
これまではOpenVPNの起動をターミナルからのコマンド入力で行ってきましたが、自動起動できるようにして、常時接続可能な状態にしました。
まず、これまでのディレクトリ(~/vpn_server)の中身を systemd の読込先 /etc/openvpn/server/ へ移動します。
~$ sudo cp ~/vpn_server/* /etc/openvpn/server/
OpenVPNサービスを起動するコマンド(systemctl)はこちらを参考にしました。
@マークの後の serverは server.conf ファイルのことです。
~$ sudo systemctl start openvpn-server@server.service (開始)
~$ sudo systemctl status openvpn-server@server.service (確認)
自動起動の有効 は enable となります。
~$ sudo systemctl stop openvpn-server@server.service (停止)
~$ sudo systemctl enable openvpn-server@server.service (自動起動有効)
システムユニットファイルの再起動(リロード)を行います。
~$ sudo systemctl reload openvpn-server@server.service (リロード)
自動起動を無効にする場合は disable となります。
~$ sudo systemctl disable openvpn-server@server.service (自動起動無効)
サービス一覧を確認してみました。
~$ sudo systemctl list-unit-files --type=service | grep openvpn
OpenVPNクライアントの自動起動(systemd)
内容はサーバとほとんど同じです。
OpenVPNクライアントをシステム起動ディレクトリへ移動します。
~$ sudo cp ~/vpn_client/* /etc/openvpn/client/
OpenVPNクライアントの起動・接続
~$ sudo systemctl start openvpn-client@client.service (開始)
~$ sudo systemctl status openvpn-client@client.service (確認)
自動起動を有効にすれば、PC起動時にOpenVPNサーバへ接続されます。
~$ sudo systemctl stop openvpn-client@client.service (停止)
~$ sudo systemctl enable openvpn-client@client.service (自動起動有効)
~$ sudo systemctl reload openvpn-client@client.service (再起動 リロード)
~$ sudo systemctl is-enabled openvpn-client@client.service (状況確認)
enabled
サーバーへping送信して、接続を確認します。
上手くつながらないときは、インターネットが接続されているか確認してから設定(server.conf , clent.conf)を見直す必要があります。
まとめ
今回は、OpenVPNによる外部ネットワークからVPN接続をするために、様々なことをやってきましたが、VPN関係については、これが最終的な目的だったので、これで一旦終了となります。
これまでこういった証明書やVPNのことはあまりやってこなかったこともあり、ゼロ知識からのスタートでしたが、今では少し理解できるようになった気がします。
特にネットワークの分野は自分でやってみないとわからないので、OpneVPNを使えるようにすることはとても勉強になると思います。
今後は自宅ライブカメラの映像を外部インターネットから安全に確認できるようにしていくことをやっていきます。
(追記)クライアントからすべてのトラフィックをVPN接続にする方法について、ファイヤーウォール(ufw)追加の設定が必須です。
サーバーからクライアントへの戻りパッケットがないのでずっと悩んでいましたが、こちらのサイトでやっと解決できました。