グローバルIPが無くてもポートフォワード出来なくても自宅でサーバを動かしたい

2020年7月23日

まずは家の環境(前提)

  • マンション
  • いわゆるマンション付属の無料インターネッツ環境
  • 壁にEthernetのポートが生えている。(WiFiも飛んでるが有線に比べてとても遅い)
  • 有線は結構早い(下り300Mbps前後出る)
  • 壁のポートに刺すとプライベートIPがv4だけ降ってくる(192.169.100.0/24)
  • ブロードバンドルータの設定は触れない。(PPPoEパススルーやポートフォワード…etc)

最終的な方針と構成

  • cloudflareでプロキシして裏は全てv6接続にする
    • v6ならいろんなvmとかにもアドレスを振れそう
  • Ubuntu18.04のVPSをvultrで借りて自分のネットワーク側のプロキシサーバとして動かす
    • ipv4の固定IP1つ,v6アドレス/64貰える
    • gcpやawsではvpsに対してv6降るのは難しい
  • 家のサーバ郡にはzerotierを介してv6アドレスを配る

こんな感じ

構築

まずvultrでVPSを借ります。

このvultrではベアメタルマシンを借りることもできたり、vultrとBGPでピアはったりv6アドレスいっぱい振れたり、v4も複数振れたり何かといろんなことが手軽にできるやつです。

東京リージョンもあるにはありますが、貰えるアドレスのアドレスブロックは海外のものぽいのでそこは注意が必要です。
生活線の出口をここにしてしまうと海外からのアクセス判定されて困ります(dアニメが見れなかった….)

今回はubuntu18.04をJapanリージョンで借ります。
この時オプションにあるEnable ipv6にチェックをいれる。(入れなくても後から付けられる)
vpsを借りるとsetting画面からこんな感じでアドレスが見れる。

このアドレスが今回家のVMたちに配るアドレスになります。

確認ができたところでVM側に設定をします。

zerotierのインストール

bash

curl -s https://install.zerotier.com | sudo bash

フォワードの設定

bash

echo “net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf echo “net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf echo “net.ipv6.conf.all.proxy_ndp = 1" >> /etc/sysctl.conf echo “net.ipv6.conf.all.accept_ra = 2" >> /etc/sysctl.conf sysctl -p

ndppdのインストールと設定

bash

sudo apt install ndppd -y

/etc/ndppd.conf

route-ttl 30000

proxy ens3 {
   router yes
   timeout 500
   ttl 30000
   rule 2001:aaaa:bbbb:cccc:ff::/80 {
     static
   }
}

ここの2001:aaaa:bbbb:cccc:ff::/80の部分はvultrからもらったv6アドレスのネットワークアドレスにff足して/80にした物を書いてください。
詳細は後述(体力があれば)
ndppdの再起動

systemctl restart ndppd

zerotierの設定

まず、zerotierとは
https://www.zerotier.com/

オープンソースのVPNソフト
細かい設定とか考えずにとりあえずインストールすればなんか勝手に繋がってくれるめっちゃ便利なやつ
(研究室のお友達に教えてもらってから感動してずっと使ってる)
linuxならコマンド一発で入るし、mac,windows,ios,androidにもインストールできるので強い

zerotierではVPN内のprefixや経路設定も行える。
今回はこの機能を用いて、zerotierでvultrからもらったv6アドレスをそれぞれのホストに割り当て、外へのv6通信をvultrのVPS経由で行う様にする。

基本的には以下のページの通りに行うだけなのでざっくりとだけ説明する。
https://lala.im/5015.html
画像も自分で用意してもほぼ同じ画像になるのでこのページの物をお借りしています。

アカウント登録&ネットワーク作成

zerotierのネットワークに参加

bash

zerotier-cli join NetworkID // zerotierの管理画面から確認できるやつ
zerotier-cli set NetworkID allowDefault=1
zerotier-cli set NetworkID allowGlobal=1

経路の設定


vultrからもらったアドレスの一部(/80)を経路に登録
vultrからは/64で配られるので、/80にするためにもらったプレフィックスの最後にffをつけて/80のアドレスにしてください。
2001:19f0:6401:847::/64をもらったとすれば、
以下画像の様に2001:19f0:6401:847:ff::/80を経路に登録してください

その後、zerotierの割り当てルールを変更します

ここで新しく割り当てたいアドレスをAuto-Assignの欄に画像のように入力します。

ここまでやるとvultrで割り当てられているv6アドレスの一部がzerotierで管理してるホストのインターフェイスに割り当てられることになります。

これ以降はv6アドレスが欲しいホストでzerotierに参加するだけです。
zerotierから降ってくる2001::とかのグローバルIPにcloudflare等でドメイン割り当てをしてcloudflareのプロキシをオンにしておくと、
v4からのアクセスもv6からのアクセスもcloudflareが一旦受け止めてv6で自分のホストに流してくれるので通常通りwebサイトをホスティングできます。

これで一通り設定は以上になります。

ただ、欠点ももちろんあって何度もプロキシする影響で多少遅くなったり、偶に外からの疎通が途切れたりします(多分ndppdのttlの問題)

技術

Posted by neko