OpenVPNでハブ直結
VPNで自宅LANに接続したい
外部からでも、自宅LANにいるようにしたい為VPN環境を作成することにした。
Linuxで構築できるVPNの種類
クライアントがWindows、サーバがLinuxでやるとすると、この3種類がある
- OpenVPN
SSL-VPN。プロトコルはTCP,UDPを使用することができる(デフォルトはUDP:1194)。TCPを使用すればプロキシやNATを超えて接続できる。暗号方式もOpenSSLがサポートするものであれば好きな物を使用できる。クライアントプログラムを導入すればWindowsでも動作する。
- PPTP
Microsoft社が開発したVPN技術。TCP(ポート1723)と専用プロトコル(GRE,プロトコル番号47)を使用する。専用プロトコルを使用する為、対応していないルータなどが通信経路にいたり、NATの裏側にいると接続しにくいかもしれない。Windowsの標準機能を使用する為、クライアントにプログラムの導入する必要は無い。
- l2tp IPsec VPN
l2tpをIPsecで暗号化したVPN方式。VPN自体はl2tpで行えるが丸見えなのでIPsecで暗号化した。IPsecの設定がやや複雑、OpenVPNのように容易にできない。クライアントはWindows標準にある。クライアントがNAT環境はOKだが、サーバがNAT環境だと問題アリ。
今回はNATを越える環境である為、OpenVPNで構築することにした。PPTPもやってみたので参考にしてください。l2tp over IPSECもやってみたので参考にしてください。
仮想デバイス
OpenVPNは仮想デバイス(tap/tun)を使用しSSL-VPNを実現しています。イメージとしては、PCに仮想のNICをさして仮想NIC宛のパケットをカプセル化してVPNを行っています。tapはレイヤ2レベルでカプセル化を行い、tunはレイヤ3レベルでカプセル化を行います。tapは自宅LANのスイッチハブに直差しのようなイメージで、tunはルータをつける感じですかね。
ルートVPNかブリッジVPNか
ルートVPN
クライアント型

ルートVPNはVPNサーバに接続したクライアントを別ネットワークに接続する形となる。ルーティングの設定が必要となるが、クライアント別にネットワークを分けるこたができる為、アクセス制限が容易になる。
ゲートウェイ型

ルートVPNでもゲートウェイ型とういうのがあり、サーバ間でVPNを通す形になる。これは拠点間VPNとかいわれ、本社と支社を繋ぐとかでよく使われる。これはリモートVPN(クライアント対サーバ)ではなくサーバ対サーバになってしまう為、今回は使用しない。
ブリッジVPN

ブリッジVPNはあたかも、同じLANに接続している状態になる。ルーティングの設定など必要ない。まさに、LAN内のスイッチハブに直結している形になる。VPNサーバにブリッジ機能の設定が必要となり、ちょっとめんどう。
VPN構成図

あたかも自宅LANのスイッチハブに直結した形を目指す為、ブリッジVPNを使用する。認証は個人レベルで使用するので、面倒な公開鍵方式はさけ事前共有鍵方式にする。各端末のネットワークはこんな感じ。ちなみに、今回はVPNクライアントを1台と想定しています。
| ホスト名 | IPアドレス | 備考 |
|---|---|---|
| ADSLルータ | 192.168.0.1 | |
| ファイルサーバ | 192.168.0.2 | |
| VPNサーバ | 192.168.0.3 | |
| VPNクライアント | 172.16.0.2 | |
| VPNクライアント(仮想デバイス) | 192.168.0.100 | VPNで繋いだ時のアドレス |
サーバ構築
ようやく、サーバ構築の説明。
ブリッジの設定
まず、ブリッジ。
カーネルの対応
カーネルがブリッジに対応していないとできない。カーネルメニューの"Networking Options"内の"Ethernet Bridge"かな?これが有効になってないとできない。なければ、めんどうだがカーネルの再構築が必要になる。sargeはデフォルトで有効になっていた。
bridge-utilsのインストール
bridge-utilsでブリッジ構成が作れる。いつも通りにインスト。
#apt-get install bridge-utils
手動でブリッジを有効にする
brige-utilsのbrctlを使用してブリッジを有効にする。
#brctl addbr br0 #brctl addif br0 eth0 #brctl addif br0 tap0 #ifconfig br0 192.168.0.3 up #ifconfig eth0 0.0.0.0 up #ifconfig tap0 0.0.0.0 up
簡単に説明するとまずbr0という仮想のインターフェイスを設定し、そこへeth0とtap0(今回使用するVPNの仮想インターフェイス)をブリッジ化する。ちなみに、ifconfig br0 192.168.0.3 upをifconfig br0 upとIPを持たないブリッジサーバになる。まぁ、いわえるスイッチハブを作れる。今回はIPが必要なので振ってやる。ちなみに、これを実行する前にちゃんとnetwork落としとかないとダメです。
自動でブリッジの有効
ブリッジでtapデバイスを使用するので、ネットワークの起動前にtapを有効にしてやらないといけません。もちろん停止の後でtapを無効にしてやります。
今回はdebian特有のネットワーク起動方法を使用します。debianでは/etc/network/配下にinterfacesというインターフェイス設定ファイルとif-pre-up.d/, if-up.d/, if-post-down.d/, if-down.d/という4つのディレクトリがあります。ネットワーク設定にも書いてあることですが、これらには起動順序があります。今回はインターフェイスが上がる前にtapを作成する必要があるので、if-pre-up.d/か、interface内のpre-upコマンドが使える。だが、if-pre-up.d/にはbridgeというファイルができており、ブリッジ作成のスクリプトがある。これより、前にならないといけないので、pre-upコマンド使う必要がる。同様に、post-downコマンドも使う。
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
address 192.168.0.3
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
bridge_ports eth0 tap0
pre-up openvpn --mktun --dev tap0
post-down openvpn --rmtun --dev tap0
フォワードしてやろう
IPフォワードしてやらんといけないので、iptablesとか使ってるならそのシェルに追加してやってくれ。例えばこんなので。
echo '1' > /proc/sys/net/ipv4/ip_forward iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT iptables -A OUTPUT -d 192.168.0.0/24 -j ACCEPT iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
インストール
いつものこれだ!
#apt-get install openvpn
インストール中にtun/tapデバイスを作りますか?と聞かれるけど、デバイスファイル(/dev/net/tun)が無いなら作ってもらおう。
事前共有鍵を作る
認証に使う秘密の鍵を作ってやる。
openvpn --genkey --secret static.key
できたら、こいつをOpenVPNの設定ディレクトリ(/etc/openvpn)に置いてやる。
設定ファイル
こんな感じに書いてやろう。
#プロトコル proto udp #ポート port 1194 #デバイス dev tap0 #事前共有鍵 secret static.key #クライアントの死活確認 keepalive 10 120 #データを圧縮 comp-lzo #データサイズ tun-mtu 1500 #再接続の設定 persist-key persist-tun #ログレベル verb 3
起動
ネットワークを再起動してブリッジを有効にしてから、OpenVPNを起動してやろう
#/etc/init.d/networking restart #/etc/init.d/openvpn start
ルータ設定
ADSLルータとか使っていたら、ポート転送の設定をいれてやろう。自分とこはこんなん。
ANY:openvpn → 192.168.0.3:openvpn
クライアントの設定
インストール
ここから最新のインストーラを拾ってきてください。
CUI
http://openvpn.net/download.html
GUI
http://openvpn.se/files/install_packages/
※自分が作ったときはopenvpn-2.0.9-gui-1.0.3-install.exeが最新でした。
事前共有鍵をコピーする。
上でつくった事前共有鍵(static.key)をクライアントに渡します。置く場所はGUIのデフォルトインストならここ。
C:\Program Files\OpenVPN\config
CUIだったら任意の場所でOKです。
※事前共有鍵は秘密に管理しなきゃいけないので、FTPとかメールで送信してはいけません。できればフロッピーやUSBメモリで渡してあげましょう。SSHとかでもOKです。
設定ファイル
設定フォルダに拡張子を.ovpnで適当な名前で作ってやる。設定内容はこんな感じ。
remote nai.homelinux.net 1194 tun-mtu 1500 comp-lzo dev tap0 ping 10 secret static.key
TCP/IPの設定
普通にNICに設定するのと同じ設定をする。「コントロールパネル」→「ネットワーク接続」→「ローカルエリア接続2※」→「プロパティ」→「インターネットプロトコル(TCP/IP)」でIPを設定する。今回だと"192.168.0.100"になる。
※今回作成したTun/Tapデバイス。デバイス名に「TAP-Win32 Adapter V8」と書いてある。
繋げてみる
CUI
設定ファイルを右クリックして"Start OpenVPN on this config"でDOSコマンドプロンプトが出てきます。繋がってる間窓出っ放しなんで気になるならGUIを使ってみてください。終了はF4を押す。
GUI
右下のシステムトレイのアイコンを右クリックして作成した名前の設定ファイルからconnectでOK。
接続確認
内部LANのアドレスに対してpingや、\\192.168.0.2\などのファイル共有が使用できるはずです。今回は設定していませんがwinsやDNSを設定してあげれば、名前解決も可能になります。
参考サイト
- http://openvpn.net/
- http://www.stackasterisk.jp/tech/systemConstruction/openVpn01_01.jsp
- http://www.ku3g.org/negi/diary/?200307c#200307270
変更しなくちゃいけない内容
公開鍵方式
事前共有鍵だとリスタートが掛かってしまう為、公開鍵方式にする。リスタート掛からないや、大丈夫みたい。昔、掛かった気がしたけどなぁ。