Raspberry Pi(Debian)にOPENVPN導入(sslh制御付)

本記事を読む,実行すると得られるもの

・学校/会社のWi-Fiでシャドウバースのランクやバンドリの協力ができるようになる。(これだけならsoftetherでもできる。別の記事に一応まとめる予定)
・一つのサーバーで443通信を使ったVPNサーバー構築/既に構築したブログの公開が同時にできるようになる。
(WordPress導入記事は今後執筆予定。それと合わせるといいかもね)

はじめに

暫く着手していて漸くまとめられそうなので記事にする。
そもそもただVPNをするだけならWindowsにsoftetherを導入して最初から最後までGUIで解決すればいいんだけど,僕がRaspberry PiにWordPressを導入しているのと,移動元ネットワークのポート制限(恐らくTCP80/443しかと通さない奴)の都合で

「TCP443ポートをVPN通信ポートとして使用かつ,443ポートフォワーディング的にRaspberryPiにVPNさせないといけない(ブログ運営を止めないため)」
状況になったわけですね。

じゃあまあRaspberryPiにVPN/ブログ運営させればええんやなということにはなるんですがそこでも問題は発生して,443ポートを二つの通信が通信の際の道として同時に使用するので競合しちゃうんですね。今まで説明したものを画像にするとこんな感じですね。

WordPressブログは443通信でないとダメなので,VPNを443通信以外でしたいものの,VPNも制限付きネットワークの都合で443通信しないとダメです。困った・・・

そこでTeratailに頭悪そうな質問をしてきました。
Apacheと443ポート使用前提のVPNサーバーの両立がしたい
めちゃくちゃ他力本願な感じでこいつ・・・って感じの質問であるのは重々承知して書いたんですが普通に回答が来て優しい世界って感じだ・・・

回答の中にsslhというプロトコル・デマルチプレクサっていう何それ・・・?って感じのソフトを紹介されたのですが,調べるとどうやら
適当な一つのポートに来た通信を別のポートに橋渡しする
という事ができるらしい。次の画像のような構想を立ててこれならいけるんじゃね?と思ったので着手してみました。

簡単に言うならサービス毎にRaspberryPiの中でポートフォワーディングをもう一回しようという仕組みである(厳密には違うけど) この仕組みを利用することでRaspberryPi内部ではVPNの通信ポートを1194にして外部から見ると443通信,内部から見ると1194通信をしているようにできるわけである。
早速構築手順を紹介しようと思う。
尚本記事では「pivpn(OPENVPN)とsslhの導入,設定」まで紹介する。

※ちなみに,sslhは特定のプロトコルしか対応していないため,他のVPNソフト(softetherとか)は未対応。よってOPENVPNを使用している

pivpn(OPENVPN)導入

pivpnというのはRaspberryPi向けに対話形式で設定するだけでOPENVPNを導入できる僕みたいな面倒くさがり向けのパッケージです。
このコマンド打つだけであとは対話形式で導入がどんどん進んでいきます。

curl -L https://install.pivpn.io | bash
・基本的にyesかnoで聞かれるもの・・・yesでいいです。
・TCP/UDP・・・TCPを選択してください
・Static IP address・・・RaspberryPiの固定IPアドレスを打ち込みましょう。
・IPv4 gateway (router)・・・ルーターのIPアドレスを打ち込みましょう。
・Default OpenVPN port ・・・任意です。特になければ1194でいいと思います。
・Encryption Strength ・・・数字が大きいほうがセキュリティ上良いが時間はかかる。2048がおすすめ
・Public Ip or DNS ・・・グローバルIPが固定できている人は上,できていない人はDNSでドメインを入力しましょう。
・Select the DNS Provider for your VPN ・・・特になければGoogleで。

この後再起動しましょう。

sudo apt-get upgrade

一応ソフトウェアアップデート

pivpn add

これでクライアント別に設定ファイルをつけて,パスワードを入力する。
この記事通りに設定したならこうなってるはず。

client
dev tun
proto tcp #ここがtcpか確認 
remote あなたが設定したドメイン 1194 #この1194を443にする
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
tls-version-min 1.2
verify-x509-name server_nw2iAzkmSYh3Kpow name
cipher AES-256-CBC
auth SHA256
compress lz4
verb 3

1194を443にするのがミソです。OPENVPN自体は1194でポートを待ち受けるように設定したので,OVPNファイルに1194と既述されていますが,OPENVPNのプロトコルで最初に通信しなくてはならないのは443(後でsslhが443を1194に橋渡しするので)なのでこの個所を443にしなければいけません。

書き直した設定ファイルをクライアントに渡してOPENVPNアプリ/ソフトに読みこませればいい。
しかし,当然まだこの状態では443を1194に橋渡しはできないので通信できないことを確認してください。

sslhの導入

この導入を遂行して完成となります。

sudo apt-get install sslh

sslhの設定をこのように記述しなおす

sudo nano /etc/default/sslh
RUN=yes
DAEMON=/usr/sbin/sslh
DAEMON_OPTS="--user sslh --listen 192.168.XXX.XX:443 --ssl 127.0.0.1:443 --openvpn 127.0.0.1:1194 --pidfile /var/run/sslh/sslh.pid"

apacheの設定をこのように記述しなおす

sudo nano /etc/apache2/ports.conf
<IfModule ssl_module>
        Listen 127.0.0.1:443
</IfModule>
<IfModule mod_gnutls.c>
        Listen 127.0.0.1:443
</IfModule>

これは127.0.0.1にきた443通信だけを拾ってねという記述に変更しているわけです

次にapacheを再起動,sslhを起動する。

sudo service apache2 restart
sudo service sslh start

あと一応なんだがUFWの設定を見直す。
世に出ているpivpnの記事にはこれが抜けているのが多い。
当然80,443,1194はあいていると思うけどそこじゃなくて別の個所を直す。

sudo nano /etc/default/ufw
DEFAULT_FORWARD_POLICY="XXX"のXXXをACCEPTにする
sudo nano /etc/ufw/sysctl.conf
net.ipv4.ip_forward=1のコメントを外す
sudo nano /etc/ufw/before.rules
*nat
:POSTROUTING ACCEPT [0:0] の次の行に-Fを入れる
sudo ufw reload

これで問題なければOK。この時点でapacheとOPENVPNはちゃんと443で共生できているため,OPENVPNを使ったVPN通信もできるはずです。

18/09/24 追記

sslhの影響で,WP-Cronが正常に動かない説らしい症状が出たので対応策を追記しておきます。

sudo nano /etc/hosts
#最下部に以下を書き加える
127.0.0.1 あなたのdomain

多分WP-Cronの挙動で行うSSL通信が内部-内部の通信になるわけで,hostファイルにローカルIPとドメインを対応させないとダメ問題だと踏んでいます。当方はこれで解決しました。

まあ自宅回線内でブログ書くとき誰しも思うんだけど,hostにこれ書かないと内部でドメインでアクセスできないのは不便だし,とりあえず設定自体は後々も役に立ちそうだし特に意味が無くともしておいてもいいと思う。

参考:WordPress WP-Cron cURL connection refused

18/09/25 追記

443ポートの待ち受け項目にsshも加えてみたんだけど,
teraterm/WinSCPでアクセス出来なかったので設定に変更を加えた。本稿と関係はないんだけどsslhは今後お世話になりそうなので。

sudo nano /etc/ssh/sshd
#ListenAddressをアンコメント,ローカルIPにする
ListenAddress 127.0.0.1

これでListenするのがsslhで設定したとおりになるんだけど,
SSH接続はできたけどSFTPはできなかった。。。

一応当たり前だけどListenするのがローカルIPになるので,
sslhでフォワードされた22指定ポート通信しか受け付けなくなるから,teratermでそのまま22ポートを指定しても通信できないことは確認してほしい。
また,一旦sslhを挟むせいかログインの速度が若干遅くなる。
SFTPができないのは依然謎。勉強します。

Raspberry Pi(Debian)にOPENVPN導入(sslh制御付)” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください