はじめに
先日サーバーを移設し、キャンパスネットワーク環境から出たが、研究室のGPUサーバーはまだキャンパスネットワーク環境内にあり、直接接続できず、大学のVPNを使わないとアクセスできない。 しかし、周知の通り、大学の公式VPNは使い勝手が非常に悪いため、オープンソースツールを使ってグループ内専用のソリューションを自作することを考えた。
そこで、zerotierを使って仮想LANを構築することを思いついた(具体的な原理はここでは省略するが、仮想LANに参加した後、デバイス間が同じLANになくても、仮想LAN IPを通じてP2P接続ができ、非常に良い体験ができることだけ知っておけばよい)。 しかし、研究室のサーバーは一般的にインターネットに接続されていないため、サーバーを直接zerotierに接続することはできず、他の方法を探るしかなかった。
以下は私の完全なソリューションである。
自前でzerotier planetを構築する
この部分は以下のGithubリポジトリを完全に参考にしたので、ここでは詳しく説明しない。
そのREADMEに従ってplanetサーバーを構築した後、ネットワークに参加したすべてのマシン間で相互にアクセスできるようになるが、前述の通り、研究室のサーバーは直接接続できないため、別のマシンを使って転送する必要がある。
zerotierの転送
ちょうど学内に自分用のサーバー(以下、転送サーバーと呼ぶ)があり、私のホームページなどのサービスはすべてその上で動いている。これを仮想LANに参加させ、サーバーとの接続トラフィックを転送させればよい。
転送サーバーが学内IP 172.26.1.2 と仮想LAN IP 10.11.1.2 を持ち、研究室サーバーはすべて学内IP 114.212.1.101 から 114.212.1.105 であると仮定する。
まず、上記で設定したzerotier planetの管理画面に入り、転送サーバーのActive bridgeにチェックを入れると、トラフィックの転送が許可される。
転送サーバーの設定
まず転送機能を有効にする必要がある。/etc/sysctl.conf ファイルを開き、net.ipv4.ip_forward を1に変更する。ない場合は1行追加し、その後以下のコマンドを実行する
sudo sysctl -p # 転送設定を即時有効化
# 転送を設定
PHY_IFACE=enp5s0 # ネットワークカードに応じて自分で変更
ZT_IFACE=ztlowm7c2d # ネットワークカードに応じて自分で変更
iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT
上記のiptablesは再起動後に無効になるため、永続的な設定方法は自分で検索してほしい。
クライアント設定
zerotier planetの管理画面でroutesを設定し、Target=114.212.0.0/16, Gateway=10.11.1.2を入力して、クライアントが自動的に関連するルーティングテーブルをダウンロードし、研究室サーバーへのトラフィックを転送サーバーに送信させることはできる。
しかし、114.212.0.0/16はパブリックIPの範囲であるため、zerotierはこのルートを配布しない。(他のプライベートIPセグメント、例えば172.26.0.0/16は可能である)。
ユーザーがクライアントで以下のコードを実行するだけでよい。リモート設定のパブリックルートを許可する:
zerotier-cli set {ネットワークID} allowGlobal=1