SSHと踏み台サーバーを用いてサーバーを立てるのが困難な場所にVPNサーバーを立てる


はじめに

一部のマンションではサーバーを立てる事が禁止されていたり、フレッツ光のIPv4 over IPv6オプションが有効になっているとWell-knownなポートを自由に利用する事ができません。
このような場合、SSHのリモートフォワードを利用し、踏み台サーバーから通信を転送してあげる事で自宅サーバーにアクセス出来ます。
私はは443/tcpで建てておいたOpenVPNサーバーでテストしましたが、これはWebサーバー等他のことでも同様に使えます。

VPNサーバーの準備

ポートを443/tcpに変更した上でサーバーを立てます。
こちらについて特に何かすることはないのでここでは割愛します。

概要説明

こんな感じ

踏み台サーバーの準備

踏み台サーバーはAWSやGCPなどのグローバルからアクセス可能で自由に使えるVPSサーバーを想定します。
転送するだけなのでスペックはあまり必要としません。
私はGCPの無料枠を使いました。

サーバーのセットアップは完了していて、鍵認証で普通にSSH接続できる状態であるとします。

設定ファイルの編集

グローバル側から、設定したポートへのアクセスを許可するために、設定ファイルを編集します。

/etc/ssh/sshd_configを開き、GatewayPortsyesに変更。

sudo nano /etc/ssh/sshd_config
  ...

#追記
GatewayPorts yes

sshdを再起動

sudo systemctl restart sshd

クライアント側から接続

ターミナルから以下のようにコマンドを実行します


ssh <ユーザー名>@<踏み台サーバーのアドレス>  -i 鍵ファイル -R \*:8443:localhost:443

前半の部分は普通にSSH接続する時と同じですから、重要なのは-R以下です。
\*:8443:localhost:443は、\*がIPv4とIPv6問わずすべてのアドレスという意味なので、すべての何処かから8443に向けてやってきた通信を転送し、転送先ではlocalhostの443からの通信として扱うというように捉えておけば良いと思います。

しばしば先頭の\*は省略されますが、この場合自動的にこの部分がlocalhostになります。
つまり、8443:localhost:443とした場合はlocalhostから8443に向けての通信のみ転送します。

IPv4の通信のみ転送する場合は\*0.0.0.0に、IPv6の場合も同様に::1に置き換えます。

接続の確認

前述の方法でssh接続が確立された踏み台サーバーの側で

netstat -l | grep 8443

で該当ポートがLISTENになっているか確認しましょう。

VPNの接続

クライアント側のVPNの接続先アドレスを踏み台サーバーのアドレスへ、ポートを8443に変更するだけで接続可能です。
こちらについても何か他にする事はありません。

注意点

踏み台サーバーの場所によってはpingがものすごく悪くなります、速度も期待はできません。
今回は転送待ち受けポートを8443番にしましたが、1024番以下の特権ポートを使いたい場合sshをroot権限で実行するiptablesでルーティングするなどの工夫が必要となります。
また、くれぐれも十分な強度を持った鍵ファイルをご利用ください。

補足等

  • \*\はただのエスケープ文字で実際にはただの*
  • sshする時に-f -Nオプションも同時につければ接続確立後バックに引っ込んでくれます。終了するときはps -xからのkill

おわりに

普段よく使うSSHにこんな機能もあるなんて知りませんでした。
セキュリティ的に問題があればコメント欄にてご指摘ください。
本日は読んでいただきましてありがとうございました。