外部からインターネットを経由して自宅サーバにアクセスしたいと思ったことはないですか?
例えば、職場や出張、外出時に
自宅サーバからスマホにファイル転送したい
とか
SSHでログインしてサーバを操作したい
あるいは、
スマホで自宅サーバに録画予約を入れたい
などと思ったことは、この記事を読んでいるあなたなら一度や二度あるはずです。
そんな時、ルータのファイヤウォール(FW)に20番ポートと21番ポートと22番ポート、ついでに8888番ポートに対してインターネットからのアクセスを許可する設定をしておけばOKだと思っていませんか?
そんなことは絶対やってはダメです。そんな危険なことをしてしまうと、あなたのサーバは一晩で悪い人にハッキングされてしまうことでしょう。はい、今すぐポートを閉じましょう。
ではこんなときどうするか?VPN(Virtual Private Network)を使うのです。
本記事では、インターネットを経由して自宅サーバに安全にアクセスするために、Dockerを使ってVPNをインストール方法を紹介します。
「Dockerを使って」というところがこの記事のミソなので、サーバ環境を汚さずに構築したい場合にぜひ参考にしてください。
★443/TCPにこだわらずこれからVPNを構築する場合は、高速&堅牢なWireGuardがおすすめです。
Contents
VPNとは?
VPN(Virtual Private Network)とは、直訳すると「仮想専用網」です。簡単に言うと、疑似的な自分専用の通信経路を確保し安全な通信を可能にします。例えば、駅やカフェにある公衆無線LAN(フリーWi-Fi)では、インターネットに接続するまでの経路で悪意のある第三者が介在し、個人情報の盗聴や通信を改ざんされるリスクがあります。仮に、信頼のおけるネットワークを使ったとしても、サーバ側で外部(インターネット)に向けてポートを解放している場合、そこからセキュリティ攻撃を受けるリスクがあります。
VPNは端末とサーバの間で 通信を暗号化することにより疑似的に自分専用の通信経路を構築し、第三者の盗聴や改ざんを防ぐことができます。これにより、サーバ側で直接的にサービスにアクセスするためのポートを解放せずとも安全に通信を実現することができます。
VPNの種類
一言でVPNと言っても、いくつかの種類があります。ここでは、詳細な説明を割愛しますが、通信レイヤ(L2、L3、L4等)や通信方式(トラスポート、トンネル)、暗号化方式(L2TP、PPTP、IPsec、OpenVPN等 )による違いがあります。
実現方式についても、ハードウェアで実現できるものもあれば、ソフトウェアで実現する場合もあります(最近はVPN機能が付いたルータも売られています)。私がこれまで使ってきたVPNソフトウェアは
- SoftEtherVPN
- OpenVPN
です。
どちらも導入にあたっての難しさは無いですが、SoftEtherVPNはやや設定が複雑(管理マネージャを使って設定要)だったので馴染めませんでした。設定といっても基本的には最初の1回設定すればあまり弄ることはないので、それほど気にすることはありません。
一方、OpenVPNはCLIで証明書を作成する通常のパッケージと、プラウザの管理画面で証明書の発行できるOpenVPN access server(OpenVPN-AS)というパッケージがあります。 OpenVPN-ASは同時接続数に制限があります(上限2)が、有料ライセンスを購入すれば上限を増やせます。私の使い方だと、2台以上の端末から同時にVPNセッションを張ることはないので無料のままで十分でした。これまで、OpenVPNとOpenVPN-AS両方を使ってみたことがありますが、導入と証明書の作成が圧倒的に楽なOpenVPN-ASを使っています。
加えて、OpenVPNは暗号強度が比較的高い(≒安全性が高い)と言われているので、これから導入するならOpenVPNがオススメです。
ということで、本記事ではLinuxサーバにDockerでOpenVPNをインストールする手順を解説します。ちなみに、私のサーバの環境はubuntu 18.04 LTSとなっていますが、Dockerとdocker-composeがインストールされた環境であれば、CentosでもRaspbian(Raspberry pi)でも手順は同じです。
では、さっそくやってみましょう。
インストール手順
前提
git、dockerおよびdocker-composeがインストールされていることが前提です。
もし、まだインストールしていない場合はこちらを参照してインストールしましょう。
私と同じ環境で構築される場合、構築で躓いた際にサポートできると思います。メモリ8GB以上を選択すればエンコード等しても性能的に問題はないと思います。Windows10マシンですが、私はUbuntuを上書きインストールして自宅サーバを構築しています。
GitHubリポジトリからファイルのクローンを作成
GitHubリポジトリから以下のコマンドでOpenVPN-AS関連の資材をダウンロードします。
1 |
git clone https://github.com/linuxserver/docker-openvpn-as |
その後、 docker-openvpn-asというディレクトリができますので、その中に
- docker-compose.yml
- data/
を作成します。
data/は空ディレクトリなのでmkdirで作成しておきます。
1 2 |
cd docker-openvpn-as mkdir data |
docker-compose.yml
docker-compose.ymlを作成します。
1 |
emacs docker-compose.yml |
以下の内容をdocker-compose.ymlファイルにコピー&ペーストします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
version: "2" services: openvpn-as: image: linuxserver/openvpn-as container_name: openvpn-as cap_add: - NET_ADMIN privileged: true environment: - PUID=1001 - PGID=115 - TZ=Asia/Tokyo - INTERFACE=enp1s0 #optional volumes: - ./data:/config ports: - 943:943 - 1194:1194/udp - 443:9443 restart: always |
environment
10行目と11行目の環境変数は、コンテナ内での実行ユーザIDとグループIDを指定します。これを設定しないとコンテナ内のrootユーザでのファイルが出来上がるので、ファイルを消す際にてこずります。Dockerを操作するユーザIDとグループIDを確認して指定しておきます。
1 2 3 4 5 |
# PUID確認 id -u # PGID確認 id -g |
13行目のINTERFACEは、ifconfig等で確認して、インターネット接続時に使用するホスト側のNICを指定します。
1 |
ifconfig |
ports
17~19行目はホストとコンテナのポートの紐づけです。
17行目の943番ポートは、ブラウザの管理画面接続用のポートです。必要に応じて修正してください。
18行目の1194番ポートは、 デフォルトのOpenVPN通信ポート番号です。ルータ側でインターネット側から1194番ポートの通信を許可しておく必要があります。
19行目は、ホストの443番ポートとコンテナ内の9443番ポートを紐づけています。 何故かというと、443番ポートは公衆LAN等で規制される可能性が低いポート番号だからです。 駅やカフェ、もしかしたら職場で無線LAN(wifi)が 利用できる場合、セキュリティを高める目的で特定のポート番号以外の通信を規制している場合があります。
しかし、通常、HTTPS(TLS/SSL)は 443番ポートを用いるので、googleやYahoo!等で検索してWebページを見る際はデフォルトで443番ポートが使われます。つまり、インターネットサービスが提供されていれば 1194番ポートが規制されていても443番ポートの通信が規制される可能性は低く、逆に443番ポートを規制している場合はインターネット接続自体を規制していることが考えられます。 そのため、443番ポートは万能なポート番号といえます。
他に443番ポートを使って提供するサービスが無ければ、このようにサブで443番ポートをOpenVPNに割り当てることをオススメします。
コンテナ起動
以下のコマンドでコンテナを起動します。
1 2 3 |
docker-compose pull docker-compose build --no-cache docker-compose up -d |
2~3分待てばOpenVPNコンテナの出来上がりです。
https://<IPaddress>:943/admin/にブラウザでアクセスし、下記の画面がでれば成功です。
初回は下記のような画面が出てくるかもしれませんが、冷静に対処します。
OpenVPN Access Serverの設定
https://<IPaddress>:943/admin/にブラウザでアクセスし、下記のID/PWでログインします。
- (Username)admin
- (Password)password
初回のみ下記の画面になりますが 、 冷静に対処します。
以下の画面に到達できれば成功です!!
ユーザ設定
ログインができたら、ユーザ作成とパーミッションの設定をします。
左側のメニューで、USER MANAGEMENT > User Permissionsを選択し、Usernameを追加します。
右にある、More Settingsのアイコンを選択し、追加したユーザのパスワードを設定します。
パスワードを設定したら、画面一番下のSave Settingsを押します。そして以下の画面になればOKです。Update Running Serverはまだ押さなくて良いです(押しても良い)。
これで、新しいユーザが追加できました。
ネットワーク設定
左側のメニューで、CONFIGRATION > Network Settingsを選択し、VPN ServerのHostname or IP Address:にサーバのグローバルIPアドレスもしくはドメイン名を入力します。
入力したら、画面一番下のSave Settingsを押します。そして以下の画面になればOKです。Update Running Serverはまだ押さなくて良いです(押しても良い)。
これで、ネットワーク設定ができました。
VPN設定
左側のメニューで、CONFIGRATION > VPN Settingsを選択し、Routingにローカルネットワークアドレスを追加します。 私の場合は10.29.3.0/24ですが、192.168.0.0/24等の場合もありますので、環境に合わせて入力してください。ここを忘れると、VPNで接続しても自宅環境にアクセスできません。
追加したら、画面一番下のSave Settingsを押します。そして以下の画面になればOKです。
これで、VPN設定ができました。最後にUpdate Running Serverを押して完了です。
プロファイルのダウンロード
https://<IPaddress>:943/?src=connectにブラウザでアクセスし、先ほど追加したユーザのID/PWでログインします。
画面下部のリンク“Yourself (user-locked profile)”を押して、プロファイル (client.ovpn) をダウンロードします。
ダウンロードしたプロファイル(client.ovpn)は、メール等でスマホに転送する必要があります。
あらかじめスマホ側でOpenVPNアプリ(android/iphone)をダウンロードして、起動しておきます。
あとは、プロファイルを使選択して、ユーザのID/PWを入力したらVPNで自宅サーバに接続できるようになります。
これで自宅サーバのサービスが利用できるようになりました!
まとめ
外部から自宅サーバにアクセスする場合はVPNを使います。
443番ポートを用いることで便利かつ安全に自宅サーバにアクセスることができます。
今回は、DockerコンテナでOpenVPNを導入する手順を紹介しました。この方法なら、途中で失敗しても簡単にやり直しすることができますし、再現性が高いのでサーバ環境が変わっても簡単に導入することができます。
これでまた便利になりましたね!
★443/TCPにこだわらずこれからVPNを構築する場合は、高速&堅牢なWireGuardがおすすめです。
他にもいろいろなサービス導入方法をご紹介しています。よかったら参考にしてください。
コメント
はじめまして 「LinuxにDockerでOpenVPNを簡単にインストールする方法」に惹かれ
当方も試したのですが 未熟な為 うまくできません。
よければ 助言していただきたいのですが よろしいでしょうか?
>守口の暮らしさん
コメントありがとうございます。
私で良ければ、どうぞ~
返信 ありがとうございます。
>コンテナ起動 https://:943/admin/に
>ブラウザでアクセスし、下記の画面がでれば成功です。
ここまではうまく稼働しました。
>ネットワーク設定を選択し、VPN ServerのHostname or IP Address:に
サーバの 「グローバルIPアドレス」?? もしくは ドメイン名を入力します。
https://www.cman.jp/network/support/go_access.cgi
https://ifconfig.io/
現在 利用しているプロバイダーのIPアドレスで良いのでしょうか?
それとも 個人的に取得したグローバルIPアドレスですか?
その2つIPアドレスの違いが詳しく分からないですが、vpn接続したいサーバのグローバルIPアドレスを入れてください。
自宅のLAN内にサーバを置いているなら、自宅からインターネットを利用する際に使うIPアドレスになります。
自宅LAN内の端末でhttps://www.cman.jp/network/support/go_access.cgiを見ると表示されますよ。
(固定回線の場合でも、グローバルIPアドレスは固定とは限らないためプロバイダのオプションとして提供される場合があります。)
ありがとうございます。
(A)ローカルネットワークアドレスを追加って??
userman@debian11:~/docker-openvpn-as$ sudo ifconfig
br-5ba3817eaaf2: flags=4163 mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
docker0: flags=4099 mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
enp1s5: flags=4163 mtu 1500
inet 192.168.11.23 netmask 255.255.255.0 broadcast 192.168.11.255
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
veth404d575: flags=-28605 mtu 1500
inet 169.254.18.154 netmask 255.255.0.0 broadcast 169.254.255.255
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
userman@debian11:~/docker-openvpn-as$
理解できるのはループバックとenp1s5だけ あとは何故出てきたのか よくわからない?
上記 (A)変更しているうちに
>コンテナ起動 https://:943/admin/が表示しなくなってしまいました?
わからないので
$sudo apt -y remove docker.io &&sudo apt autoremove &&sudo apt -y remove docker-compose docker-openvpn-asというディレクトリも削除して
再インストールしたのですが まだなにかゴミが残っているようです?
(B) まだ どこを削除すればよいのでしょうか?
綺麗に削除してから 再開したいと思います。
よろしくおねがいします。
ローカルネットワークアドレスを設定すところは、守口の暮らしさんの場合だと192.168.11.0/24ですかね?
Dockerプロジェクトを削除する場合はdockerをアンインストールするのではなく、
docker system prune –volumes
等で消すようにしてください:)
$sudo docker ps -a に表示しているということは動作している と判断していいのかな。
profile-xxxx.ovpn をdownloadしてAndroid アプリで 何度も試したが繋がらない。
やはり 何か 間違っているのかな〜。無念 Android側なのか サーバー側なのかもわからない。実力不足。
スマホで接続する場合は、LAN内じゃなく4G/5Gで接続していますでしょうか?
また、自宅のルーターのポ-ト番号は解放されていますでしょうか?
などなど、気になることはありますがうまく行かないという事はどこかが間違っているのではないかと思われます。
>LAN内じゃなく4G/5Gで接続していますでしょうか?
はい ドコモ4G回線で
>自宅のルーターのポ-ト番号は解放されていますでしょうか?
https://pcdocks.net/%E7%97%87%E4%BE%8B%E9%9B%86/%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E9%96%8B%E6%94%BE%E3%81%97%E3%81%9F%E3%81%84/
を参照して http://www.cman.jp/network/ で確認したのですが 解放されていないようです。
https://komone-life.com/2020/03/20/how-to-install-openvpn/#ports
と同じように 1194 にしているが、、、、これだけでも解決したい。
解決できない自分自身が悔しい。
>自宅のルーターのポ-ト番号は解放
やっと ポ-ト番号 1194 できた。しかし まだ問題あり。
1194でアクセスされたパケットをサーバに転送(ポートフォワーディング)していますでしょうか?
有難うございます。サーバに転送とは これでしょうか?
https://www.buffalo.jp/support/faq/detail/15794.html
ポート変換登録状況
グループ Group01
internet側IPアドレス ==> エアーステーションのinternet側IPアドレス
プロコトル ==> TCPポート:1194
LAN側IPアドレス ==> 192.169.11.23
LAN側ポート ==> HTTPS(TCPポート:443)
この設定が間違っているのでしょうか?
1194はudpですかね。
あと1194を443にフォワードする必要はないかと。
記事の通りの手順通りにやっているなら、そこを修正したら動くはず。
訂正 192.169.11.23
訂正前192.169.11.23
訂正後192.168.11.23