これはなに?
- ZeroTier: Hamachiのようなやつらしい?
- 特定IP範囲を網内ノードを経由してアクセスしたりできる。
- VPNとの違い: 全トラヒックが網内に入らない。重くならない。
- SOCKS5との違い: Proxyではない。Samba接続が効く。
想定シナリオ・確認環境
ZeroTier
version: 1.10.2
PC
- 管理ノード(Ubuntu18.04, VPS)
myvps - 網内ノード(Ubuntu18.04, 物理鯖)
mysrv - 網外ノード(Windows 11, ラップトップ)
mylaptop
構成
- 仮想IP範囲:
192.168.199.0/24- 網内ノード:
192.168.199.10- 経由経路:
172.22.0.0/16(この範囲にSamba鯖とかRDP鯖とかある)
- 経由経路:
- 網外ノード:
192.168.199.20
- 網内ノード:
実施方法
Moon(管理ノード) の作成
手順
インストール
- スクリプト:
curl -s https://install.zerotier.com | sudo bash - git:
git clone https://github.com/zerotier/ZeroTierOne && cd ZeroTierOne && make && sudo make install- need to
cargo/rustc
- need to
起動・起動テスト
- ベタ:
sudo /var/lib/zerotier-one/zerotier-one -dorsudo zerotier-one -d(/usr/sbinにリンク済みっぽい) - リッチ:
sudo systemctl start zerotier-one- gitから入れたが、
serviceファイルを作らなくても行けた
- gitから入れたが、
チェック: sudo zerotier-one info
ネットワークの作成
あとでWebGUIでも作成可能?
今回はAPIで作ってみる
- インストール場所にある
authtoken.secretをチェック:TOKEN=$(sudo cat /var/lib/zerotier-one/authtoken.secret) -
infoサブコマンドで現在のノードIDをチェック:NODEID=$(sudo zerotier-cli info | cut -d " " -f 3) - 作成する
curl -X POST "http://localhost:9993/controller/network/${NODEID}______" -H "X-ZT1-AUTH: ${TOKEN}" -d {} - 作成したネットワークを確認:
curl "http://localhost:9993/controller/network/" -H "X-ZT1-AUTH: ${TOKEN}" - NetworkIDを控えておく
NETWORK_ID="$(curl -sS "http://localhost:9993/controller/network/" -H "X-ZT1-AUTH: ${TOKEN}" | cut -d\" -f2)"
Moonの作成
- 作業ディレクトリ作成、移動:
mkdir -p /tmp/ZeroTier/ && cd /tmp/ZeroTier - インストール場所にある
identity.publicの確認:ls /var/lib/zero-tier-one/identity.public - 設定ファイルの作成:
sudo zerotier-idtool initmoon /var/lib/zero-tier-one/identity.public | tee ./moon.json -
moon.jsonの"stableEndpoints"キーのリストにサーバーのIPアドレスとポートを追記する。 追記例:[ "192.0.2.1/9993","2001:db8::1/9993"] - Moonノードの作成:
sudo zerotier-idtool genmoon ./moon.json - 直下に作られた構成ファイルを確認:
ls ./*.moon - 構成ファイルをインストール場所に移動する:
sudo mkdir -p /var/lib/zero-tier-one/moon.d && cp ./*.moon /var/lib/zero-tier-one/moon.d - 再起動:
sudo systemctl restart zero-tier-one - World IDを控えておく。
WORLD_ID="$(grep -F '"id":' ./moon.json | cut -d\" -f4)"
Web管理UI: ztncuiの導入
詳細: https://key-networks.com/ztncui/
- ダウンロード:
wget -P /tmp/ https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.6_amd64.deb - インストール:
sudo apt install /tmp/ztncui*amd64.deb - デーモン確認:
sudo systemctl status ztncui - ポートの確認:
sudo lsof -i:3000
Web管理画面へのログイン
- ユーザーのPC(OpenSSH Client on Powershell or linux shell)から管理サーバーへポート転送する:
ssh -L 3000:localhost:3000 myvps - ブラウザからアクセス:
http://localhost:3000/ - デフォルトユーザー
adminデフォルトパスワードpasswordでログインする - のちほど細やかな設定を行う
参考
網内ノードの設定
手順
インストール
- スクリプト:
curl -s https://install.zerotier.com | sudo bash - git:
git clone https://github.com/zerotier/ZeroTierOne && cd ZeroTierOne && make && sudo make install- need to
cargo/rustc
- need to
起動・起動テスト
- ベタ:
sudo /var/lib/zerotier-one/zerotier-one -dorsudo zerotier-one -d(/usr/sbinにリンク済みっぽい) - リッチ:
sudo systemctl start zerotier-one- gitから入れたが、
serviceファイルを作らなくても行けた
- gitから入れたが、
チェック: sudo zerotier-one info
Moonへの参加・チェック
-
orbitサブコマンドを使う:sudo zerotier-cli orbit "$WORLD_ID" "$WORLD_ID"- TODO:
orbit <world_id> <seed>の<seed>がなにか?
- TODO:
- 確認:
sudo zerotier-cli listpeers
Networkへの参加
-
joinサブコマンドを使う:sudo zerotier-cli join "$NETWORK_ID" - 確認:
sudo zerotier-cli listnetworks
ブリッジのための設定(網内ネットワークへ入るため)
- IPv4転送を許可する:
sudo sysctl -w net.ipv4.p_forward=1 - 転送先の物理インターフェースを定義:
PHY_IFACE=eno1 - 転送元の仮想インターフェースを定義:
ZT_IFACE=zt7nnig26 - iptables: 物理インターフェースにNATマスカレード機能をつける?
sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
- iptables: 網内からのIncomingに対して許可する(TODO:
ESTABLISHED?)sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables: 網内へのOutgoingの転送を行う
sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT
- 保存のための手続き
- iptablesを保存するパッケージをインストール
sudo apt install iptables-persistent
- 保存
sudo bash -c iptables-save > /etc/iptables/rules.v4
- iptablesを保存するパッケージをインストール
参考
網外ノードの設定
- ここからダウンロード: https://www.zerotier.com/download/
- msiでインストールする
- ZeroTierを起動する。システムトレイにアイコンが表示される。
-
Join New Network...で$NETWORK_IDを入れる
管理ノードの設定
Web管理画面へのログイン
- ユーザーのPC(OpenSSH Client on Powershell or linux shell)から管理サーバーへポート転送する:
ssh -L 3000:localhost:3000 myvps - ブラウザからアクセス:
http://localhost:3000/ - デフォルトユーザー
adminデフォルトパスワードpasswordでログインする(もしくは再設定済みパスワード) - Networksタブからネットワークを表示
- Assignment Pools でIP範囲を設定
192.168.199.0/24 - Membersに表示されている網内と網外ノードの IP Assignmentでそれぞれ充てる
- 網外ノード:
192.168.199.10 - 網内ノード:
192.168.199.20
- 網外ノード:
- Memberに表示されている網内と網外ノードの Authorized にチェックを入れる
- Memberに表示されてい網外ノードの Active bridge にチェックを入れる
- Routesにアクセスし、Target:
172.22.0.0/16は Gateway192.168.199.20を経由するようルートを追加 - あとは網外ノードがどのIP範囲であっても(
192.168.0.210/24であっても)、網内ノードのIP(192.168.0.210/24)も直アクセスしたいので192.168.0.210/32` で特定IPだけはルートを作っておく
テスト
-
172.22.*.*に網外のラップトップからできるか -
192.168.0.210は網内の鯖になるか
謝辞
- ZeroTierを教えてくれた後輩に感謝。
- 先人のブログなどに感謝
- オープンチャットでHamachiとにてるんじゃね?とか情報いただいたユーザにも感謝: