Tech Racho エンジニアの「?」を「!」に。
  • インフラ

グローバル IP がたくさんある環境への VPN 構築 (UT-VPN)

世の中はGW(ゴールデンウィーク)で充実してるみたいですが、暇です。
ということで、趣味の中から一つ出してみます。


 グローバル IP だけで構成されたネットワークに VPN して samba 接続したい

一応僕は、会社の外とかで活動することが多いので、VPN が大好きです。特に、L2VPN が大好きです。samba でファイル共有できますからね。

良くみかける解説記事なんかだと、次のようなネットワーク構成が紹介されたりしています。

キャプチャ

良く見かけるネットワーク構成図

良く見かけるネットワーク構成図

この場合、NIC2 にはグローバルIPが振られていて、NIC1 は NAT で構成されたローカル IP が振られているかと思います。こういう構成は、規模の小さな会社や自宅にちょっとしたサーバマシンを設置している場合によく発生するケースなので、紹介記事も多いです。

ただ、僕が今回接続したいのは、こんな感じです。

今回の対象ネットワーク構成

今回の対象ネットワーク構成

マシンの置いてあるネットワークが、いまどき珍しくグローバル IP を全てのホストに振ってくれます。DNS も完備です。今回は、このネットワークに設置されているホストに「samba」で接続したいのです。


 VPN 実装の選択

ちょっと話がそれて、VPN の選択ですが、僕は UT-VPN (今は、softether に変わってるかもです。)が好きです。ぱっと使えるものとしては、

  • PPTP/L2TP 実装
  • OpenVPN
  • UT-VPN (Softether/Packetix)

などが挙げられます。昔は、PPTP を使っていました。FreeBSD だと mpd という実装がありました。PPTP は iPhone とかでも搭載されているくらいメジャーだし、簡易なプロトコルだったので VPN を張ったとしても結構高速な通信が可能でした。ただし、PPTP はセキュリティ問題が発生したはずなので、もう使いたくありません。

OpenVPN はオープンソースな VPN 実装で、色々な暗号化も使えたり高機能です。一時期これを利用しようとしたのですが、速度が出ません。真面目に実装されすぎているくせに多機能すぎて遅いのですよね。

UT-VPN/Softether は、筑波大学出身の登大遊さんが作成された VPN ソフトウェアです。専用クライアントが必要という部分が多少不便ですが、通信は高速です。肝は、TCP の fairness なんか無視した複数のセッションの利用です。ネットワーク関係の学会では多少叩かれたこともあるそうですが、利用者からしたら関係ないですよね☆

ということで、僕は UT-VPN/Softether を利用したいと思います。


samba 接続時の問題点

UT-VPN 固有ではないと思うのですが、上記構成の場合、VPN サーバと samba サーバが同居していると、アクセスできなかったりします。VPN サーバに対してはアクセスできないのですよね。詳しくは以下を参照してください。(ローカルブリッジ接続機能

Linux オペレーティングシステム内部での制限事項により、VPN 側 (仮想 HUB 側) からローカルブリッジしている LAN カードに割り当てられる IP アドレスに対して通信を行うことはできません。この制限は PacketiX VPN が原因ではなく、Linux の内部構造に原因があります。

これでは使えないっす!VPNサーバ上では余計な他のサービスを動かすな、ってことなんすね!でも僕はグローバルネットワーク内のホストに samba で接続したいんです。とはいえ、物理マシンを大量に設置するのも面倒です。

ということで、しゃーないので流行の仮想化をして、VPN 専用仮想マシンを作成することにします。


 ネットワーク構成

苦肉の策ですが、以下の図のような構成にしてやろうと思います。

最終的なネットワーク構成

最終的なネットワーク構成

こうしておくと、仮想ホストを専用 VPN サーバにできるので、物理ホスト上で動作する samba にもアクセスできるはずです。

物理サーバのホストは、FreeBSD です。FreeBSD で現状安定して稼働しそうな仮想マシンは、VirtualBox な気がしています。噂では KVM もかなーーーり安定しているらしいのですが、もし他の方で安定して動作しているようなら教えてください。

VirtualBox 上にも FreeBSD を入れます。一点気を付けなければならないのは、VirtualBox で作成する VM の仮想 NIC は promiscuous mode で作成しなければならないところです。VirtualBox は XML で VM のマシン構成を記述するのですが、XML ではこんな感じで書かれているべきです。

<Adapter slot="0" enabled="true" MACAddress="XXXXXXXXX" \
cable="true" speed="0" promiscuousModePolicy="AllowAll" \
type="82540EM">

すでに VM が存在している場合は、以下のコマンドで変更できます。

% VBoxManage modifyvm <uuid|name> --nicpromisc<1-N> allow-all

後は、仮想マシン上に bridge として UT-VPN サーバを構築していけばOKです。

FreeBSD で UT-VPN をコンパイルする際は、Makefile の書き換えが必要だったりしますが、それは別のサイトを調べてみてください。(どうせ少し古いソフトウェアなので、新しく書く必要はないですよね)

それと、多分他のサイトにも書いてあると思いますが、ip forward が行われるように mib 情報の書き換えも忘れがちなので変更しておいた方が良いです。

# sysctl -w net.inet.ip.forwarding=1

 

最後の方で、多少説明をはしょっているのですが、もし知りたいものがある人がいれば、コメントなどいただければ追記いたします。

 


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。