DD-WRTで遊んでみる その2 -省電力OpenVPNサーバに仕立てる-
引き続きDD-WRTで遊んでみます。
今回は「DD-WRT with OpenVPNをNATの中で利用する(=OpenVPNサーバをNATの中で利用する)」です。
前回、DD-WRTにOpenVPNサーバを設定することによってVPNによるセキュアなリモートアクセスルータのような利用方法ができるようになりました。これで外部から自宅にアクセスできる環境が出来上がりました。
が・・・、うちではちょっと悩ましいです。というのは、今回改造したルータの無線機能は802.11g対応で54M(理論値)しか出ません。現役で動いているBuffaloのルータは802.11nに対応しており300M(理論値)まで対応しています。なので、単純にリプレースすると速度が低下する・・・。
じゃあ、現役ルータはDD-WRT化すればいいじゃん!と思ったら対応していない。むぅ・・・
安い中古買うか?とも真剣に悩んだが、802.11acのドラフト対応製品も市場に出てきてるタイミングにどうなの・・?
というわけで、DD-WRTをリモートアクセスルータとするのではなく単純な省電力OpenVPNサーバにしてみます。
そして、これをBaffaloのルータのLANを側に配置します。
つまりこういう構成ですね。

DD-WRT(+OpenVPN)でリモートサーバとする場合、クライアントの通信はグローバル側にVPNを貼り、その通信をLAN側のプライベートインタフェースに転送するような前回の構成がノーマル?(笑)な使い方だと思います。
今回は、LAN側に設置するのでブロードバンドルータで言うと、WAN側I/Fに自宅のプライベートIPが割当たる構成になります。通常構成だとこの下に更に別のプライベートアドレスを作る構成になると思いますが、細かい説明は省きますが、複雑、既存への影響、無線PCとの通信などでのデメリットもあると思い今回はボツ。

またOpenVPNにはL2VPNのようなブリッジングモードも構成可能らしいのですが、ブロードキャスト等もすべて通過してしまうので今回はやめました。この場合は、リモート端末が自宅LANと同じスイッチにつながるイメージになります。
今回のポイントとしては
・OpenVPNサーバをNAT(マスカレード)配下に配置
・外部からOpenVPNサーバにアクセスした後に、自宅LANに接続
つまりルータの入ったI/Fから暗号化解除されて再び出てくる感じ
という形になると思います。通信を図にするとこんな感じ。

さて、前置きが長くなりましたが概念がわかれば、やることは簡単です。
■■ 環境 ■■
・OpenVPNサーバ機器:Buffalo WHR-HP-G54
・OpenVPNソフトウェア:DD-WRT(v2-sp vpn) with OpenVPN
・OpenVPNクライアント:Ubuntu12.04
■■ 前提 ■■
・前回の作業までが完了しており、DD-WRTへOpenVPNで接続できる環境ができていること。
できてない場合は前回も参考にしてください。
※ルータの設定は、LAN側にPCを接続し行なっています。
1.DD-WRTの設定1
・Webブラウザで、ルータの管理画面にアクセスします。
・[基本]タブを開きます。
・インターネット接続のIPアドレスを自宅のプライベートIPを割り当てます。
今回は前回LAN側に利用していたセグメントをWAN側インタフェースに設定します。
LAN側に前回のままだと192.168.1.1が設定されていると思うので、念のため違うアドレスにします。
下の例では、WAN側を192.168.1.253、LAN側を192.168.100.1にしました。

2.DD-WRTの設定2
・Webブラウザで、ルータの管理画面にアクセスします。
・[ネットワーク > PPTPサーバ/クライアント]の順にメニューをたどる。
・OpenVPNデーモンの中の、「OpenVPN Config」の設定を変更します。
前回の設定が終わって入れば
push "route 192.168.1.0 255.255.255.0"
push "dhcp-option DNS 192.168.66.1"
server 192.168.66.0 255.255.255.0
(略)
となっているはずです。
この内一番最初の行が
となっている事を確認してください。
この行の意味は、OpneVPNクライアントが接続してきた際に、ルータが転送できるネットワークの情報をクライアントに教える内容になります。今回は、これがいわゆるWANインタフェースのプライベートIPセグメントの情報を渡してあげれば良いのです。
もしWAN側(自宅LAN)が192.168.100.0/24なら)この行を
push "route 192.168.100.0 255.255.255.0"
としてあげます。
3.NATルータの設定
このプライベート側に設置したOpenVPNサーバに直接インターネットからアクセスすることは当然できません。
これを解決してあげるためには、NATルータでポートフォワードをしてあげる必要があります。
各自NATルータの設定を行なってください。
やることは、NATルータのWAN側(グローバルIP:10.10.10.1)の特定のポートアドレスUDP:1194を、OpenVPNサーバ(プライベートIP:192.168.1.253)に転送してあげる設定になります。
※ポートフォワーディング機能はメーカによって記載が異なります。それぞれ調べて設定して下さい。
例)Buffalo:「ポート変換」または「アドレス変換」
Corega:バーチャル・サーバ(ポート開放)
NEC:ポートマッピング機能
4.OpenVPNクライアントの設定
OpenVPNクライアント側の"client.conf"を設定してあげます。
私は、~.openvpn配下に配置しているので、これを編集します。編集箇所は、
の箇所です。既存設定をコメントアウトしました。
設定するアドレスは、NATルータのWAN側にプロバイダから割り当てられているグローバルIPアドレスになります。
POINT
通常のご家庭では、プロバイダからDHCPでアドレスを取得しているケースが多いと思います。このケースだと、グローバルIPアドレスが変わる可能性がありますので、ダイナミックDNS(DDNS)などを活用するべきだと思います。
残念ながら、私のNATルータはDDNSに未対応だったためやむなくIPで設定しました。
5.接続確認
OpneVPNクライアントから、接続を試みます。
と表示されれば、接続成功です。
クライアントにて確認を行ってみます。
まずは経路情報の確認。
下記赤字の経路があればOKです。
特に、自宅内LAN(192.168.1.0)向けのルーティングがtun0に向いているのが重要です。
自宅PCにTracerouteで経路を確認してみます。
ちゃんと、VPNトンネルを経由して、自宅PCに到達していることがわかります。
これで完了です。
実際の環境で試してみてください。
※アドレス等実際テストした環境と少し変えているので、記載ミスがあるかもしれません。その場合ご指摘ください。
※テスト構成で行なっていますので、実際のグローバルIPアドレスであるべき箇所もプライベート(10.x.x.x)を使っています。
今回は「DD-WRT with OpenVPNをNATの中で利用する(=OpenVPNサーバをNATの中で利用する)」です。
前回、DD-WRTにOpenVPNサーバを設定することによってVPNによるセキュアなリモートアクセスルータのような利用方法ができるようになりました。これで外部から自宅にアクセスできる環境が出来上がりました。
が・・・、うちではちょっと悩ましいです。というのは、今回改造したルータの無線機能は802.11g対応で54M(理論値)しか出ません。現役で動いているBuffaloのルータは802.11nに対応しており300M(理論値)まで対応しています。なので、単純にリプレースすると速度が低下する・・・。
じゃあ、現役ルータはDD-WRT化すればいいじゃん!と思ったら対応していない。むぅ・・・
安い中古買うか?とも真剣に悩んだが、802.11acのドラフト対応製品も市場に出てきてるタイミングにどうなの・・?
というわけで、DD-WRTをリモートアクセスルータとするのではなく単純な省電力OpenVPNサーバにしてみます。
そして、これをBaffaloのルータのLANを側に配置します。
つまりこういう構成ですね。

DD-WRT(+OpenVPN)でリモートサーバとする場合、クライアントの通信はグローバル側にVPNを貼り、その通信をLAN側のプライベートインタフェースに転送するような前回の構成がノーマル?(笑)な使い方だと思います。
今回は、LAN側に設置するのでブロードバンドルータで言うと、WAN側I/Fに自宅のプライベートIPが割当たる構成になります。通常構成だとこの下に更に別のプライベートアドレスを作る構成になると思いますが、細かい説明は省きますが、複雑、既存への影響、無線PCとの通信などでのデメリットもあると思い今回はボツ。

またOpenVPNにはL2VPNのようなブリッジングモードも構成可能らしいのですが、ブロードキャスト等もすべて通過してしまうので今回はやめました。この場合は、リモート端末が自宅LANと同じスイッチにつながるイメージになります。
今回のポイントとしては
・OpenVPNサーバをNAT(マスカレード)配下に配置
・外部からOpenVPNサーバにアクセスした後に、自宅LANに接続
つまりルータの入ったI/Fから暗号化解除されて再び出てくる感じ
という形になると思います。通信を図にするとこんな感じ。

さて、前置きが長くなりましたが概念がわかれば、やることは簡単です。
■■ 環境 ■■
・OpenVPNサーバ機器:Buffalo WHR-HP-G54
・OpenVPNソフトウェア:DD-WRT(v2-sp vpn) with OpenVPN
・OpenVPNクライアント:Ubuntu12.04
■■ 前提 ■■
・前回の作業までが完了しており、DD-WRTへOpenVPNで接続できる環境ができていること。
できてない場合は前回も参考にしてください。
※ルータの設定は、LAN側にPCを接続し行なっています。
1.DD-WRTの設定1
・Webブラウザで、ルータの管理画面にアクセスします。
・[基本]タブを開きます。
・インターネット接続のIPアドレスを自宅のプライベートIPを割り当てます。
今回は前回LAN側に利用していたセグメントをWAN側インタフェースに設定します。
LAN側に前回のままだと192.168.1.1が設定されていると思うので、念のため違うアドレスにします。
下の例では、WAN側を192.168.1.253、LAN側を192.168.100.1にしました。

2.DD-WRTの設定2
・Webブラウザで、ルータの管理画面にアクセスします。
・[ネットワーク > PPTPサーバ/クライアント]の順にメニューをたどる。
・OpenVPNデーモンの中の、「OpenVPN Config」の設定を変更します。
前回の設定が終わって入れば
push "route 192.168.1.0 255.255.255.0"
push "dhcp-option DNS 192.168.66.1"
server 192.168.66.0 255.255.255.0
(略)
となっているはずです。
この内一番最初の行が
push "route 192.168.1.0 255.255.255.0"
となっている事を確認してください。
この行の意味は、OpneVPNクライアントが接続してきた際に、ルータが転送できるネットワークの情報をクライアントに教える内容になります。今回は、これがいわゆるWANインタフェースのプライベートIPセグメントの情報を渡してあげれば良いのです。
もしWAN側(自宅LAN)が192.168.100.0/24なら)この行を
push "route 192.168.100.0 255.255.255.0"
としてあげます。
3.NATルータの設定
このプライベート側に設置したOpenVPNサーバに直接インターネットからアクセスすることは当然できません。
これを解決してあげるためには、NATルータでポートフォワードをしてあげる必要があります。
各自NATルータの設定を行なってください。
やることは、NATルータのWAN側(グローバルIP:10.10.10.1)の特定のポートアドレスUDP:1194を、OpenVPNサーバ(プライベートIP:192.168.1.253)に転送してあげる設定になります。
※ポートフォワーディング機能はメーカによって記載が異なります。それぞれ調べて設定して下さい。
例)Buffalo:「ポート変換」または「アドレス変換」
Corega:バーチャル・サーバ(ポート開放)
NEC:ポートマッピング機能
4.OpenVPNクライアントの設定
OpenVPNクライアント側の"client.conf"を設定してあげます。
私は、~.openvpn配下に配置しているので、これを編集します。編集箇所は、
;remote 192.168.100.253 1194
remote 10.10.10.100 1194
の箇所です。既存設定をコメントアウトしました。
設定するアドレスは、NATルータのWAN側にプロバイダから割り当てられているグローバルIPアドレスになります。
POINT
通常のご家庭では、プロバイダからDHCPでアドレスを取得しているケースが多いと思います。このケースだと、グローバルIPアドレスが変わる可能性がありますので、ダイナミックDNS(DDNS)などを活用するべきだと思います。
残念ながら、私のNATルータはDDNSに未対応だったためやむなくIPで設定しました。
5.接続確認
OpneVPNクライアントから、接続を試みます。
$ sudo openvpn ./client.conf
(略)
Thu May 16 11:31:10 2013 TUN/TAP device tun0 opened
Thu May 16 11:31:10 2013 TUN/TAP TX queue length set to 100
Thu May 16 11:31:10 2013 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Thu May 16 11:31:10 2013 /sbin/ifconfig tun0 192.168.66.6 pointopoint 192.168.66.5 mtu 1500
Thu May 16 11:31:10 2013 /sbin/route add -net 192.168.123.0 netmask 255.255.255.0 gw 192.168.66.5
Thu May 16 11:31:10 2013 /sbin/route add -net 192.168.66.1 netmask 255.255.255.255 gw 192.168.66.5
Thu May 16 11:31:10 2013 Initialization Sequence Completed
と表示されれば、接続成功です。
クライアントにて確認を行ってみます。
まずは経路情報の確認。
下記赤字の経路があればOKです。
特に、自宅内LAN(192.168.1.0)向けのルーティングがtun0に向いているのが重要です。
$ netstat -rn
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 10.10.10.254 0.0.0.0 UG 0 0 0 wlan1
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan1
192.168.66.1 192.168.66.5 255.255.255.255 UGH 0 0 0 tun0
192.168.66.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
192.168.1.0 192.168.66.5 255.255.255.0 UG 0 0 0 tun0
自宅PCにTracerouteで経路を確認してみます。
ちゃんと、VPNトンネルを経由して、自宅PCに到達していることがわかります。
$ traceroute 192.168.123.202
traceroute to 192.168.123.202 (192.168.123.202), 30 hops max, 60 byte packets
1 192.168.66.1 (192.168.66.1) 29.329 ms 78.011 ms 79.079 ms
2 192.168.1.202 (192.168.123.202) 79.087 ms 80.042 ms 80.053 ms
これで完了です。
実際の環境で試してみてください。
※アドレス等実際テストした環境と少し変えているので、記載ミスがあるかもしれません。その場合ご指摘ください。
※テスト構成で行なっていますので、実際のグローバルIPアドレスであるべき箇所もプライベート(10.x.x.x)を使っています。




