はじめに
少し前にサーバーを移転し、キャンパスネットワークの環境から外れてしまいましたが、研究室の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に変更します。なければ行を追加し、次のコマンドを実行します。
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 は可能です)。
ユーザーにクライアントで以下のコードを実行してもらうだけで、リモート設定のパブリックルートが許可されます。