自宅サーバーを建てよう

知り合いから1000円で売ってもらったCeleron積んでる謎のファンレスPCがあるので、いい加減活用したい。

外からアクセスできて、大公開するポートは1つにしたいね → VPN+etc…

とりあえずwireguardsambaを入れて、wireguardを介したアクセス以外で見えないようにする。

wireguardを入れる前に

サーバーを建てるということは、当然外部からの疎通を考えないといけない。

しかしながら家の環境はmap-e方式の接続であり、いつものように開けゴマとルーターに設定を書くだけではポートが開いてくれない。ついでに言えばwireguardはUDPを使用するため疎通確認がだるい。

map-e最高だ!

謎のサイトをつかってmap-eで家に割り当てられているポート番号を調べる。

そして、NTTのモデム設定画面(192.168.11.1)から静的NAT設定を開いて公開対象のポートを開けゴマしたいがそもそも設定欄がない。

なさげ

biglobeのIPv6オプションを使うと裏設定画面の方に移動するらしい

192.168.11.1:8888/t/ に裏設定画面があるのでこっちで設定する。

あるやん

疎通チェック

TCPであればwebサーバーを適当にlistenさせればいいわけなのだが、wireguardはUDPを使うらしいので疎通チェックが面倒な感じ。

と思っていたらncコマンドを使うことで簡単に疎通チェックできるらしい

サーバー側でnc -lu 50000のように入力することで簡易的なサーバーを建てる事ができる。

(-lでListen -uでUDPポートの指定)

適当に別IPのクライアントを用意してnc -u <target addr> <target port>のように入力すると対象に文字列を送信できる。(なんも出てこないけどInteractiveなので適当に文字打ってEnter)

鯖側

いい感じにポートが開いてる事がわかるのでwireguardを建てる。

wireguard導入

Dockerに載せる

とりあえずdockerに乗っけておく。(環境が壊れづらいってのもある)

適当な場所にDocker周りをまとめる

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
---
version: "2.1"
services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - SERVERURL=wireguard.domain.com #optional
      - SERVERPORT=51820 #optional
      - PEERS=1 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
      - LOG_CONFS=true #optional
    volumes:
      - /path/to/appdata/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

デフォルトではこのようになっているので、環境に合わせて適応変更する。

筆者の環境ではTZ(タイムゾーン), SERVERURL, PEERS, volumesのconfig部分, portsの部分を変更した。

タイムゾーンは当然日本なのでTZ=Asia/Tokyoのように変更する。

SERVERURLはドメインを指定しなければ生IPで接続用のQRコードが生成されるようなので空に。

PEERSは数値を入力すると接続用のキーペアが数値分だけ生成され、これを端末ごとに使用する。数値ではなく、PEERに名前を付ける事もできる。その場合、PEERS=peer1, peer2, peer3のようにカンマで区切って名前を指定することで、名前別にpeer情報が生成されるため管理が容易になる利点がある。

volumesには2行あり、設定情報をLocalに保存するために必要なconfigフォルダの配置のみ書き換える。 /path/to/appdata/config:/config/home/user/wireguard/config:/configのように変更した。

portsは51820を開放できる環境であれば問題ないが、筆者の環境では別のポートを使用しているためここも変更する。 dockerではWAN側ポート:コンテナ側ポート/TCPorUDPのように指定する。クライアント側に見えるポートはWAN側のポートなのでここだけ変更すれば良い。

誰か教えて

Pixel4aからはきちんと接続できて自宅ネットワークが見えるのだが、Macbookの方はなぜか繋がったり繋がらなかったりする。なんで? おそらく自宅のルーターがヘアピンNATに対応していないことが原因。研究室から接続試行したら繋がりました。