📶

賃貸無料ネットを拠点間VPNで攻略!Raspberry Piルーターを作ろう

2023/12/14に公開

この記事は CyberAgent Group SRE Advent Calendar 2023 14日目の記事です。

私事ですが、今年の11月に引っ越しをしまして、入居するまで「無料インターネット付き」がどうにも引っかかっていました。趣味も仕事もインターネットな人間ですので、品質が悪かったらどうしようかとひやひやしたものです。入居後簡単に測定してみると、速度は100MbpsそこそこながらPingは常に5ms程度と安定した回線で胸をなでおろしました。

今回はそんな賃貸無料インターネットの課題点を解決しながら、実家と同じネットワークに接続する考え方をまとめた記事になります。SREアドベントカレンダーとしては少し毛色の異なるものになりますが、楽しんでいただければ幸いです。

ネットワークの観察

まず初めに、賃貸の無料インターネット環境を観察してみます。

壁に埋め込まれたルーター

ネットワークはいわゆるLAN配線方式で、マンション共用部まで光回線が届き、そこから部屋まではLANケーブルで敷設されるネットワークのようです。部屋まできたLANケーブルは壁に埋め込まれているWiFiルーターにつながり、各部屋でネットワークが利用できるようになる、というものです。

IPアドレスはマンション全体で一つのものを利用するので、基本的にはポート開放やグローバルアドレスは利用することができません。この辺りは現在ではトンネリングでうまいことできますので、私は特に不満に感じていません。

IPアドレスを共有するという性質上、そのままでは悪意のある利用者がインターネット上で犯罪行為を行ったときに入居者全員が被疑者になってしまいます。そのため、ネットワークの利用には事前登録とログインが必須となっています。ルーターに接続した際、公衆WiFiにありがちなログイン画面(キャプティブポータル)が表示され、そこにIDとパスワードを記入するまでWAN側との疎通ができないようになっています。

課題感

速度は安定しているものの、利用していくうちにいくつかの課題感を感じるようになってきました。

面倒なログインページ

まず一番最初に不便に感じたのが、新しい機器の接続毎にブラウザで認証が必要な点です。PCやスマホであれば特に問題はないと思いますが、私の場合はRaspberry Piや仮想マシンでブラウザの使えない環境からインターネットに接続したい場合が多々ありました。このような場合、接続したいマシンでプロキシサーバーを一時的に立ち上げ作業用のPCからアクセスして認証を通すか、運営会社にMACアドレスを通知して制限を解除してもらう必要があります。

Raspberry Piの場合はともかく、仮想マシンのMACアドレスは容易に変更されるため、毎回運営会社に問い合わせを行うのは現実的ではありませんでした。

セキュリティ

セキュリティについても気になる点があります。まず、マンションの共用部に存在するであろうONUやスイッチにアクセスできる人間であれば、全入居者の通信を簡単に盗聴することができるという点です。光ファイバーに比べてLANの盗聴は非常に簡単です。

また、WiFiルーターは壁にシールでSSIDとパスワードが記載されており、この部屋に入ったことがある人であればだれでも接続可能になっています。また、各種設定についても運営会社がリモートで変更できるようにするためにWAN側からアクセスできるような仕組みになっているようです。運営会社が信用できないわけではありませんが、少し気になる点ではあります。

VPNとWiFiルーター

入居後、しばらくの間は上記の課題感を解決するためにそれぞれの機器でWireGuardを利用して実家のネットワークに接続していましたが、どちらにしろログインページでの認証は必要なこと、接続機器が増えるたびにWireGuardの認証情報を追加しなければいけないことから、自前でルーターを構築し実家と賃貸の間で常時VPNを張ることによって課題を解決できないか試してみることにしました。

Raspberry PiとLANケーブル

ルーター作り

これ以降ではRaspberry Pi4とUSB LANアダプタを利用した構築を実際に行っていきます。

下準備

下準備として、基本的な設定を完了しておく必要があります。

OSの選定

今回はRaspberry Pi 4を利用するので、OSはUbuntuを選択しました。ルーター専用のOSとしてOpenWRTなどのプロジェクトもあります。今回の記事はUbuntu向けでOpenWRTについては触れませんが、市販のルーターライクにWebUIで設定を行いたい方はOpenWRTの方がおすすめです。

ネットワークの割り当てとインターフェースの設定

ルーターはネットワークの境界として動作するため、WAN側とLAN側の少なくとも2つのポートが必要です。Raspberry PiのようにLAN端子が1つしかない場合、USB-LANアダプタを利用する必要があります。

また、LAN側のネットワークの設計をこの時点で行っておくのもよいでしょう。といっても、WAN側と被らないように適当な範囲のIPアドレスを設定すればOKです。

私の場合は 192.168.185.0/24 とし、ルーターのアドレスを 192.168.185.1 としました。LAN側のインターフェースにこれを設定します。 netplan の場合は下記のようになるはずです。

enx7403bd7f2042: # USB-LANアダプタ
    dhcp4: no
    addresses:
        - 192.168.185.1/24
    nameservers:
        addresses: [1.1.1.1]

この状態で適当なコンピューターとつなぎ静的IPアドレスの設定をして疎通確認をしておくとこの後がスムーズです。 :thumbsup:

インターネットへの接続

当たり前ですが、ルーターとして動作するPCはインターネット(WAN)への疎通ができていないといけません。環境によってはここが一番工夫して設定しなければいけない点でもあります。

特にIPv4 over IPv6な環境(いわゆるv6プラス等)ではアドレス帯の計算が必要だったりするので、ちょっとルーターで遊んでみたい、難しい設定はいったん避けたい人は二重ルーターで始めた方がよいかもしれません。

賃貸の環境はDHCPでIPアドレスが降ってくる環境だったのでそれに合わせた設定を書いて完了です。OSによって設定は異なりますが netplansystemd-networkd 等が利用できるはずです。

一点だけ、前述のログインをする作業が必要だったため、IPアドレスが割り当てられたことを確認後、作業用PCからSOCKSv5でRaspberry Piに接続、ブラウザを用いて認証を通します。

# ルーターで設定
$ sudo nano /etc/sshd/sshd_config
> AllowTcpForwarding を yes に変更

# 操作したいPCで実行
ssh -D 1070 kznrluk@192.168.185.1

上記コマンドを実行後、各ブラウザのインターネット接続設定でSOCKS v5を利用し、localhost:1070に接続するように設定すると、通信がルーター経由で行われますのでログイン画面が表示されるはずです。

image.png

VPNへの接続

今回はLANからのトラフィックはすべてVPNに転送したかったため、VPNへの接続も行っておきます。各環境で大きく設定が異なる点ですので説明は割愛します。私の環境ではWireGuardを利用していますので、インターフェース wg0 で疎通が取れるようにしておきました。

ネットワークアドレス変換

ネットワークアドレス変換(NAT)はiptablesコマンドで実現できます。基本的にはIP MASQUERADEとフォワーディングを有効化するコマンドだけで動作するはずです。

$ ip ad
# 各インターフェースの情報を確認する。今回は下の二つを利用。
# LAN側IF: enx7403bd7f2042
# WAN側IF: wg0

$ sudo iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
$ sudo iptables -A FORWARD -i enx7403bd7f2042 -o wg0 -j ACCEPT

また、これらのiptablesの設定は再起動時にデフォルトに戻ってしまうものになります。これを永続化するために、 iptables-persistent を利用しました。

sudo apt-get install iptables-persistent

iptables-persistent をインストールすると、その時点で設定されているiptablesの内容を再起動時に自動で適応してくれるようになります。

追記: iptables-persistent を利用するのではなく、 wg-quick でWireGuardが接続するときに書き換える方法に変更しました。これによって、WireGuardが接続されていないときは賃貸のインターネットを利用し、接続されているときはWireGuardを利用する、といった使い分けが容易になります。

[Interface]
PrivateKey = ....
ListenPort = 51820
Address = 10.1.0.5/24
DNS = 1.1.1.1
MTU = 1400
PostUp = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostUp = iptables -D FORWARD -i enx7403bd7f2042 -o eth0 -j ACCEPT
PostUp = iptables -A FORWARD -i enx7403bd7f2042 -o wg0 -j ACCEPT

PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i enx7403bd7f2042 -o wg0 -j ACCEPT
PostDown = iptables -A FORWARD -i enx7403bd7f2042 -o eth0 -j ACCEPT

[Peer]
PublicKey = ....
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = example.com:51820

また、カーネルパラメータでIPフォワーディングを許可しておく必要があります。

$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1

$ sudo sysctl -p

DHCPサーバーの構築

この時点で、LAN側ポートにほかのPCを接続し、適切に静的IPアドレスを設定してあげるとインターネットと疎通することが確認できるはずです。しかし、毎回IPアドレスを人間が割り当てるのは少々面倒くさいかもしれません。そこで、通常のルーターと同じようにDHCPでIPアドレスを割り当てるようにしてみます。

DHCPサーバーは isc-dhcp-server がよく利用されていますが、これは2022年にメンテナンスが終了しているためここでは kea を利用していきます。

# インストール
$ sudo apt-get install kea-dhcp4-server

# 設定 後述します
$ sudo nano /etc/kea/kea-dhcp4.conf

# 再起動して設定を反映
$ sudo systemctl restart isc-kea-dhcp4-server.service

デフォルトの設定ファイルはコメントが多く圧倒されてしまいますが、実際に必要なのはインターフェイスとIPレンジの設定がメインになります。必要なところを変更する形で編集してみてください。

{
    "Dhcp4": {
        "interfaces-config": {
            "interfaces": [ "enx7403bd7f2042" ] # LAN側インターフェイスの設定
        },
        "subnet4": [
            {
                "subnet": "192.168.185.0/24", # ネットワーク範囲の設定
                "pools": [ { "pool": "192.168.185.100 - 192.168.185.200" } ], # 割り当て範囲の設定
                "option-data": [
                    {
                        "name": "domain-name-servers", # DNS
                        "data": "1.1.1.1, 1.0.0.1"
                    },
                    {
                        "name": "routers", # ルーター、デフォルトゲートウェイとなるもの
                        "data": "192.168.185.1"
                    }
                ]
            }
        ]
    }
}

これでネットワークに接続された機器が自動でIPアドレスを取得できるようになりました :tada:

WiFiの設定

Raspberry PiにはWiFiが搭載されていますが、負荷分散の観点から別途WiFiルーターを購入しLANに接続、アクセスポイントモードで動作させています。

速度と負荷の観察

さて、これまでの設定を行うことでWiFiやLANに接続した時点でインターネットが利用でき、そしてIPアドレスはVPN接続先のもの、かつ通信経路が暗号化されているという理想のインターネット環境を手に入れることができました。

ここで気になってくるのが速度についてです。結論から言うと、私の環境では通信速度は大幅に低下してしまいました。ただ、この辺りはチューニングや設定により変化する部分だと思いますので、調整を続けていきたいと思います。

WireGuard OFF

Downlaod 242Mbps Upload 320Mbps Ping 5ms

WireGuard ON

Download 58Mbps Upload 104Mbps Ping 15ms

MTUの調整

また、一部のサイトやサービスでうまく通信ができない事象が発生しました。

  • 極端に遅いNetflix
  • 特定CDNから配布される画像が表示できない
  • IMAPでのメールの受信

どうやらMTUの設定がよくなく受信時にパケロスを起こしているようでした。サーバ側でMTUを1400に落としてみたところ、うまく動作するようになりました。

まとめ

今回の記事はVPN接続するルーターを用いて、快適なネットワーク環境を構築するのを目的に作業を行ってきました。今回は賃貸のインターネットでしたが、構築済みのRaspberry Piを持ち歩けばどこでも実家と同じネットワークを安全に利用することができるので利用の幅も広がるのではないでしょうか。

Discussion