背景
自宅デスクトップにVPNでつなげられるようにして、外でノートPCでドヤリングしてる時も、デスクトップのそこそこよい環境で開発したいな、と思ったのです。
最終的にはうまく動くようになったのですが、かなり手こずったので、同じような境遇の人がいればその一助となることを願いメモを残します。
あ、私はインフラよく分からないマンですので、「そんなとこで?」という躓きポイントもあると思われますが、ご容赦を。
環境
OS: Ubuntu 18.04 LTS
VPN: SoftEther VPN Server (Ver 4.29, Build 9680, rtm)
自宅のONU兼ルータにはVPNの機能がないので、Ubuntuが入っているデスクトップPCにVPNサーバを入れて、ルータからはポートマッピングで必要なポートをUbuntuに飛ばしてます。
困ったところ
VPNサーバを入れたマシン自体と通信できない
VPNサーバをデスクトップにインストールしました。本当はVPNサーバと使いたいマシン(この場合デスクトップ)を分けられるといいのでしょうが、VPNサーバ専用のマシンは用意できなかったので。
ノートからVPNで接続できるようになったのですが、デスクトップにリモートデスクトップ(xrdp)で繋がらない!
あれ?自宅LANからはつながるのよ?と思っていましたら、これは公式サイトに答えがありました。
3.6 ローカルブリッジ - SoftEther VPN プロジェクト
Linux オペレーティングシステム内部での制限事項により、VPN 側 (仮想 HUB 側) からローカルブリッジしている LAN カードに割り当てられる IP アドレスに対して通信を行うことはできません。この制限は SoftEther VPN が原因ではなく、Linux の内部構造に原因があります。
はい。デスクトップが唯一持っているNIC("enp3s0"っていう名前だった)に対してローカルブリッジを作成していたのですが、そうすると、そのNICが持っているIPに対して通信できなくなってしまうのですね。
というわけで、公式サイトに書いてあるように、NICをもう一つ買って差して、LAN通信用とローカルブリッジ用に分けたのでした。
が、この解決に至るまでにまだ躓きポイントがあったのです。
tapにローカルブリッジするとDHCPでIPアドレスを取得できない
さっき「NICをもう一つ買って」と書きましたが、最初はお金をケチりたくて、NIC1枚でも通信できる方法を探していました。
すると、「ローカルブリッジ先をtapにして、tapとNICをブリッジでつなぐとうまくいくよ」という情報をゲット!(どこで入手した情報かは忘れた)
早速やってみました。
- ローカルブリッジ先をTAPにする。
VPN サーバー管理マネージャの「ローカルブリッジ設定」から、「新しいtapデバイスとのブリッジ接続」を指定して適当なtapデバイス名を指定してやるだけです。
tapデバイス名を"vpn"にした場合、Ubuntuで"ip a"してやると、"tap_vpn"という名前で見えるはずです。
- Ubuntuの方でブリッジを作成してやる。
UbuntuでIPアドレスとかの設定するのは netplan だよってことで、
/etc/netplan/50-cloud-init.yaml というファイルがあったのでこれを編集しました。
network:
ethernets:
enp3s0:
(省略)
bridges:
br0:
dhcp4: true
interfaces:
- enp3s0
version: 2
追加したのは"bridges:"の項目です。ブリッジにはDHCPでアドレスを割り当てましたが、固定でも同じことかと思います。
この状態で sudo netplan apply で設定を適用してやると、ブリッジ br0 が作成されており、"brctl show"でブリッジの状態を確認してやると、 br0 に enp3s0 が含まれているのが確認できます。
- ブリッジにtanデバイスを追加する。
sudo brctl addif br0 tap_vpn
で完了です。こうすると br0 に、enp3s0 と tap_vpn の2つが含まれることになります。
これでVPN接続がうまくいけば、VPNサーバのスクリプトにこのコマンドを追加してやればいいなぁ…そんなふうに考えていた時期が俺にもありました。
…が、VPN接続は成功するものの、DHCPサーバからIPアドレスを取得できない!
ちなみに、SoftEtherの「仮想 NAT および仮想 DHCP サーバー機能」という機能で、自宅LANとは異なるセグメントのIPアドレスを付与してみたりもしましたが、VPNにつないだノートがデスクトップと通信できることはついぞありませんでした。
これについては原因はわかっていません。VPNサーバがルータのNATの向こう側だということが関係しているのかな?
ローカルブリッジ専用NICには、0.0.0.0を割り当てないとダメ
OK, わかったよハニー。NICがもう1枚いるんだろ?買うさ。
というわけで、NICをもう1枚買ってデスクトップに差しました。
公式サイトにはこうあります。
ローカルブリッジ用の LAN カードを用意して接続し、その LAN カードと既存の LAN カードの両方を物理的に同じセグメントに接続してください
3.6 ローカルブリッジ - SoftEther VPN プロジェクト
私はネットワーク疎いのでよく分からなかったのですが、「物理的に同じセグメントに接続」=「ローカルブリッジ用のNICにLANケーブル差して、自宅LANのHUBだかルータだかのポートにぶっ差してね」です。
最初、NICだけ差してケーブルを繋がず、「あれれーVPN繋がらないぞー?」と言っていたのはナイショです。
そして、「ローカルブリッジ用のNICにはIPアドレスを設定しないようにしなよ」(意訳)とも書かれていました。
Linux や Solaris の場合は、ローカルブリッジ用 LAN カードに対して「ifconfig」コマンドなどで、IP アドレス「0.0.0.0」を割り当てるなど
ハッハー、ifconfigだって?時代はnetplanなんだろ?IPアドレスを設定しなきゃいいんだろ?こうだ。
network:
ethernets:
enp2s0:
dhcp4: false
enp4s0:
dhcp4: false
addresses: [192.168.1.11/24]
gateway4: 192.168.1.1
nameservers:
addresses: [192.168.1.1, 8.8.8.8, 8.8.4.4]
version: 2
(最初NICが1枚しかなかった時は"enp3s0"という名前でしたが、2枚にしたら"enp2s0"と"enp4s0"になりました。前者をローカルブリッジ専用、後者をLAN通信用にしてます。ルータからのポートマッピングを利用しているので、後者は固定アドレスにしてます。)
DHCPをOFFにして固定アドレスを設定しなければノープロブレムじゃないか!OKOK, これで完璧さ!
と思ってデスクトップPCを再起動したならば、VPN接続はできるのに、やっぱりDHCPでIP取得できない…
おーいハニー、どうして君はそんなに俺におあずけくらわすのが好きなんだい?
まったく、君のご機嫌取りは、ちょっとだけだから楽しいんだぜ、と思いながら"ip a"したならば、
…enp2s0がDOWNしてる…
あれか、ただDHCPをOFFにするだけじゃ、「あ、じゃあこのNICいらないんすねwww DOWNさせとくっすwww」ってなるわけか。
というわけで、どうやらローカルブリッジ用NICには明示的に"0.0.0.0"を割り当てる必要があるようです。
最終系はこうなりまして、これで一件落着。
/etc/netplan/50-cloud-init.yaml
network:
ethernets:
enp2s0:
dhcp4: false
addresses: [0.0.0.0/32]
enp4s0:
dhcp4: false
addresses: [192.168.1.11/24]
gateway4: 192.168.1.1
nameservers:
addresses: [192.168.1.1, 8.8.8.8, 8.8.4.4]
version: 2
疲れた!