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

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

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.100VPNで繋いだ時のアドレス

サーバ構築

ようやく、サーバ構築の説明。

ブリッジの設定

まず、ブリッジ。

カーネルの対応

カーネルがブリッジに対応していないとできない。カーネルメニューの"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

変更しなくちゃいけない内容

公開鍵方式

事前共有鍵だとリスタートが掛かってしまう為、公開鍵方式にする。リスタート掛からないや、大丈夫みたい。昔、掛かった気がしたけどなぁ。


debian Valid HTML 4.01 Strict [VALID RSS!]