OpenVPNが繋がらない!

前回前々回でリモートから自宅に接続するためのVPN環境に挑戦してきました。

参考にしている人がいるかは不明ですが、マネしたけどうまくいかないという方、OpenVPNでリモートクライアントからVPN接続できないという方。
もしかしたら参考になるかもしれません。


DD-WRTで設定したOpenVPNはUDPの1194番を利用してVPNセッションの接続を試みます。
「クライアントが、パケットフィルタを実施しているNATルータの配下にいる環境」の場合、ルータで外部→内部向けのUDP/1194を通過するようにフィルタが設定されていないとVPNのセッションを確立できません。これは、大雑把にいうとUDPはセッション確立という概念がないため、パケットフィルタ機能だけでの制御は結構困難なためです。(頑張ればできます)

そこで、セッション確立という概念があるTCPを利用することでこれを回避できるケースがあります。
一般的に、ユーザがインターネットに使うネットワーク環境では内部から外部向けのTCPセッションの戻りは許可する設定になっていることが多いです。これをうまく使います。
※インターネットでWebが見られる環境なら、ほぼ大丈夫なはず。(管理者の設定にもよるため確実とは言えませんが)
逆にWebすらも制限されているようなネットワークでは結構絶望的な気がします(笑)
・外部から内部向けでTCPのAckフラグが設定されているパケットも拒否するフィルタ
 (いわゆる、内部から外部向けのTCPセッション確立を認めないフィルタ)



--多少細かい説明--
UDPはホスト間(この場合クライアントとOpenVPNサーバ)で事前のセッションの確立を行いません。
一般的なFirewall(家庭用ブロードバンドルータでも対応しているものはある)であれば、ステートフルインスペクション機能によりUDPの戻りもFirewallが動的に許可しますが、対応していないNATルータでパケットフィルタによって制御しているようなネットワーク環境にいる場合は制限が出てきます。
UDPの戻りパケットを明示的に許可してあげないといけないですが、たくさんあるUDPポートを開けてることは少ないので場合によってはネットワーク管理者に依頼して変更してもらう必要があります。



というわけで、OpenVPNサーバとのセッション確立にTCP/1194を利用することにより回避する方法です。


■■ テスト環境 ■■
・OpenVPNサーバ機器:Buffalo WHR-HP-G54 
・OpenVPNソフトウェア:DD-WRT(v2-sp vpn) with OpenVPN
・OpenVPNクライアント:Ubuntu12.04


■■ 前提 ■■
・DD-WRTへOpenVPNで接続できる環境ができていること。
できてない場合はこちらを参考にしてみてください。





1.DD-WRT側のOpenVPNサーバ設定


・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

dev tun0
proto tcp ←udpをtcpに変更する。

keepalive 10 120
dh /tmp/openvpn/dh.pem
ca /tmp/openvpn/ca.crt
cert /tmp/openvpn/cert.pem
key /tmp/openvpn/key.pem

# Only use crl-verify if you are using the revoke list - otherwise leave it commented out
# crl-verify /tmp/openvpn/ca.crl

# management parameter allows DD-WRT's OpenVPN Status web page to access the server's management port
# port must be 5001 for scripts embedded in firmware to work
management localhost 5001




2.DD-WRT側のフィルタ設定


DD-WRTのWeb画面で「管理->コマンド実行」の順にたどり、実行コマンドに以下を張り付け
※ここも自分の環境と合わせてください。


iptables -I INPUT 1 -p tcp --dport 1194 -j ACCEPT
iptables -I FORWARD 1 --source 192.168.66.0/24 -j ACCEPT
# These next two lines may or may not be necessary.
# I (dereks) did not need them, but bmatthewshea did.
# Thus, we include them so that this works for more people:
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT



3.クライアントPC側の設定

OpenVPNクライアント側の"client.conf"を設定してあげます。
私は、"~.openvpn"配下に配置しているので、これを編集します。編集箇所は、

remote 192.168.100.253 1194

client
remote-cert-tls server
dev tun0
proto tcp

resolv-retry infinite
nobind
persist-key
persist-tun
float
;comp-lzo

#If the pushed routes appear not to be added on windows hosts, add the following:
route-delay 30

ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key




4.サーバの確認(DD-WRT(OpenVPN))

サーバでのサービスポートを確認します。
ルータにSSHでログイン等を行なって、以下のコマンドを実行。
Port1194がTCPで待ち受けていることを確認する。

root@DD-WRT:~# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:5001 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
tcp 0 0 192.168.100.1:22 192.168.100.131:53031 ESTABLISHED
tcp 0 0 192.168.123.253:1194 157.82.12.10:7474 ESTABLISHED
udp 0 0 0.0.0.0:53 0.0.0.0:*
udp 0 0 0.0.0.0:67 0.0.0.0:*
raw 0 0 0.0.0.0:255 0.0.0.0:* 255
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 3745920




5.接続確認

クライアントで接続してみます。ターミナルから実行。

$ sudo openvpn client.conf 
Thu May 23 09:54:15 2013 OpenVPN 2.2.1 i486-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Mar 23 2012
Thu May 23 09:54:15 2013 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Thu May 23 09:54:15 2013 Control Channel MTU parms [ L:1543 D:140 EF:40 EB:0 ET:0 EL:0 ]
Thu May 23 09:54:15 2013 Socket Buffers: R=[87380->131072] S=[16384->131072]
Thu May 23 09:54:15 2013 Data Channel MTU parms [ L:1543 D:1450 EF:43 EB:4 ET:0 EL:0 ]
Thu May 23 09:54:15 2013 Local Options hash (VER=V4): 'db02a8f8'
Thu May 23 09:54:15 2013 Expected Remote Options hash (VER=V4): '7e068940'
Thu May 23 09:54:15 2013 Attempting to establish TCP connection with [AF_INET]x.x.x.x:1194 [nonblock]
Thu May 23 09:54:16 2013 TCP connection established with [AF_INET]x.x.x.x:1194
Thu May 23 09:54:16 2013 TCPv4_CLIENT link local: [undef]
(中略)
Thu May 23 09:54:19 2013 Initialization Sequence Completed

TCPでのトンネルが確立しました。


念の為、クライアントでインタフェースを確認。
$ sudo ifconfig
(略)
tun0 Link encap:不明なネット ハードウェアアドレス 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inetアドレス:192.168.66.6 P-t-P:192.168.66.5 マスク:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 メトリック:1
RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:100
RXバイト:0 (0.0 B) TXバイト:0 (0.0 B)

となっており、ちゃんとトンネルI/Fが表示される。
引き続き、クライアントのルーティングの確認を行う。
$ netstat -rn
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 10.82.12.254 0.0.0.0 UG 0 0 0 wlan1
10.82.12.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

接続先のネットワークの転送先がtun0に向いていることを確認する。

以上で完了。



これで、UDPのフィルタが開いていない環境からのOpenVPN接続の確率が可能となります。
うまく行かないかたは、ぜひTCPを試してください。
ちなみに、TCPにすると多少遅くなるとのことなので可能であればDefaultのUDPを推奨します。

※ 実環境でのログから記事のためにちょっとアドレスを変えたりしていますので、細かい間違いは無視してください。必要な箇所は、各項目でTCPに変更する箇所です(赤字)。

Windows7でIPv6のPingでハマったお話

IPv6のPingでハマった。ゾーンIDとは何ぞや?

※2014/7/7 誤記訂正

IPv6リンクローカル環境で単純なPing疎通確認を行おうとしてハマったのでメモしておく。

先に結論だけ言うと
Pingコマンドで指定するゾーンIDは相手のゾーンIDじゃないよ!



●テスト環境
 使用環境 : Windows7、IPv6
 実施コマンド : リンクローカルアドレスを利用したPing(icmp)

●前提のお話
 WindowsでIPv6のアドレスを調べるためには、コマンドプロンプトで"ipconfig"コマンドを実施する。
 IPv6がEnableになっていれば、例えば

  「 リンクローカル IPv6 アドレス. . . . : fe80::4c79:a7b6:c81:aaaa%10 」(適当なアドレスです)

 のようなIPv6のアドレスが表示される。
 ちなみにリンクローカルアドレスが何ぞやに関しては調べて。
 簡単に言うとIPv4プライベートIPみたいなもので、これだけではセグメントは越えられない。


 Windows7では、IPv4,IPv6いずれのicmpも今まで通りの"ping"コマンドで可能。


で、このPingでハマった・・・。



●テスト
 PC1(Ping送信元)、PC2(Ping送信先)という2台で通信を試みた。

 構成概要↓
Pingテスト構成


 それぞれのPCのipconfigの結果(IPv6アドレス部分のみ)
 ローカールエリア接続は有線NICで、ワイヤレスネットワーク接続は無線NICです。

 PC1
  イーサネット アダプター ローカル エリア接続:
    リンクローカル IPv6 アドレス. . . . : fe80::6930:3aee:55ef:aaaa%10
 
  Wireless LAN adapter ワイヤレス ネットワーク接続:
    リンクローカル IPv6 アドレス. . . . : fe80::6930:3aee:55ef:bbbb%11


 PC2
  イーサネット アダプター ローカル エリア接続:
    リンクローカル IPv6 アドレス. . . . : fe80::6930:3aee:55ef:cccc%10 




で、PC1で有線接続状態からPC2のIPv6アドレスにPingを実施。
ping fe80::6930:3aee:55ef:cccc%10
   → OK (Ping応答が返ってくる)

つぎに、PC1を無線接続に変更して同様にPC2のIPv6アドレスにPing実施。
ping fe80::6930:3aee:55ef:cccc%10
   → NG (Ping応答が返ってこない。具体的には「宛先ホストに到達できません」となり失敗。)

結果としてこれは認識が間違えていた。

結論言うと、Pingで指定するゾーンIDは相手のアドレスコピペしちゃだめだよ!





ipconfigで表示される

"fe80::6930:3aee:55ef:aaaa%10"

の"fe80::6930:3aee:55ef:aaaa"部位はもちろん当該NICに割りあたっているIPv6アドレスを表わすが
その後ろの"%10"が何を意味するか。
これはゾーンID(zone_ID)というものらしい。


ローカル使用 IPv6 アドレスのゾーン ID

 ゾーンIDを利用することにより、リンクやサイトを見分けるということが目的らしい。
 ローカル使用アドレス(リンクローカル、サイトローカル:廃止)に関連付けられたゾーンは

   Address%zone_ID

 で表されるとのことらしい。

 ここが重要で、つまりグローバルアドレスの場合はこれはつかない(はず。試せてません。)
 このゾーンIDはそれぞれの端末が一意に持ち、同じリンクに接続されているからと言ってすべての端末が
 同じになるわけではないらしい。PC1のゾーンIDが1だとしても、PC2のゾーンIDが1とは限らない。



で、何がいけないかというとこのゾーンIDは自分(送信元ホスト)が認識するゾーンID(インタフェース)だということ。
正確に言うと、Pingで指定するゾーンIDは自分の出力インタフェース(ゾーンID)を指定するということ!


簡単なpingコマンドは、”ping 宛先IP”というコマンドになるが、上でやったpingコマンドは宛先ホストのゾーンIDを指定していた。
ping fe80::6930:3aee:55ef:cccc%10

この%10は、たまたま自分の有線インタフェースで表示されるゾーン"10"と一致していたため有線では応答がありゾーンIDが"11"となっていた無線インタフェースでは応答されなかった。おそらく、送信I/Fが異なっていたからそもそも出力されていなかったはず。


次のようにするとうまくいった。
 
 有線接続状態
  ping fe80::6930:3aee:55ef:cccc%10
    → OK

 無線接続状態
   ping fe80::6930:3aee:55ef:cccc%11
    → OK


偶然にも有線の時のゾーンIDが一致していたので混乱した。



●まとめ?

リンクローカルアドレスは「fe80」で始まるため、これがPCに複数あるとどのI/Fから送信していいのか判断できない。そのためにゾーンIDを指定する必要がある。(と解釈した。間違ってたらごめんなさい)

ちなみに、リンクしているI/Fが一つの時はゾーンIDを指定しなくてもうまくいった。
このことは、複数のI/Fをリンクさせて複数のリンクローカルアドレス(fe80)を持たせた状態でのPingは失敗したことからも上の推測は正しいと思う。


なお、Linux(Ubuntu)、MacOSXでのIPv6Pingコマンドは以下のようになります。
 
 ping6 -i インタフェース名 宛先アドレス
  (例: ping6 -i eth0 fe80::6930:3aee:55ef:cccc)

このインタフェース名がWindowsでいうゾーンIDに相当する。こっちのほうがいかにも送信I/Fを指定しているようで感覚的にわかりやすい気がする。

Windwosの場合、ipconfigでゾーンIDが表示され、PingでゾーンIDを指定するのが混乱させる。
(こんなことでハマるのは、自分だけか・・・)



間違いあったらご指摘ください。

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を側に配置します。
つまりこういう構成ですね。

ddwrt-vpnsv-testfig.png



DD-WRT(+OpenVPN)でリモートサーバとする場合、クライアントの通信はグローバル側にVPNを貼り、その通信をLAN側のプライベートインタフェースに転送するような前回の構成がノーマル?(笑)な使い方だと思います。


今回は、LAN側に設置するのでブロードバンドルータで言うと、WAN側I/Fに自宅のプライベートIPが割当たる構成になります。通常構成だとこの下に更に別のプライベートアドレスを作る構成になると思いますが、細かい説明は省きますが、複雑、既存への影響、無線PCとの通信などでのデメリットもあると思い今回はボツ。
ddwrt-vpn2.png


またOpenVPNにはL2VPNのようなブリッジングモードも構成可能らしいのですが、ブロードキャスト等もすべて通過してしまうので今回はやめました。この場合は、リモート端末が自宅LANと同じスイッチにつながるイメージになります。


今回のポイントとしては
 ・OpenVPNサーバをNAT(マスカレード)配下に配置
 ・外部からOpenVPNサーバにアクセスした後に、自宅LANに接続
  つまりルータの入ったI/Fから暗号化解除されて再び出てくる感じ
という形になると思います。通信を図にするとこんな感じ。
ddwrt-vpn-routefig.png

さて、前置きが長くなりましたが概念がわかれば、やることは簡単です。

■■ 環境 ■■
・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にしました。
OpenVPN-ifconfig.png


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)を使っています。

DD-WRTで遊んでみる -OpenVPNでリモートアクセスルータにする-

DD-WRTでOpenVPNに挑戦してみる

前回DD-WRT化したBuffalo WHR-HP-G54の使い道を考えてみました。
以前より、外から自宅の中にリモートアクセス、もしくは自宅から職場にリモートアクセスができたらいいなと思って
Packetix(今はSoftEtherVPN)などを挑戦しようとおもった事もありました。
ただ、上記だと常時稼働のサーバが必要になるのでどうしても電気代がかかります。
そこでRaspberryPiですよ!と言いたいのですが、ちょっと別用途に埋まっており機能共存させたくない(笑)

で、DD-WRTのOpenVPN機能というのに着目。
サーバなどを立ち上げてサイト間VPNやリモートVPNを実現できるものらしく、このサーバ機能をを持てるという話。
省電力なOpenVPNサーバを作ってみることにしました。

OpenVPN自体が初めてだったのでちょっと苦戦しました・・・。ので後で参考にするためにメモ。

参考になるサイト
http://www.dd-wrt.com/wiki/index.php/VPN_%28the_easy_way%29_v24%2B



■■ 環境 ■■
・OpenVPNサーバ:DD-WRT on WHR-HP-G54
・OpenVPNクライアント:Ubuntu12.04 LTS


■■ 前提 ■■
・前回の手順に従って、OpenVPNに対応したDD-WRTファームの入ったルータができている事


■■ テスト構成及び、目指す構成 ■■

テスト構成
vpn-テスト構成


目指す構成
VPN-接続構成





1.事前準備
※ルータでの作業

ルータにGUI画面の管理>コマンド実行の実行コマンドで以下を実行する。
nvram show | grep size
実行結果が表示されます。
size: 28613 bytes (4155 left)
コマンドを実行して、空きメモリを調べる。最低5.2KBの空きがないとダメらしい。



2.証明局、証明書の作成
※Ubuntuでの作業

①必要パッケージのインストール
$ sudo apt-get install openvpn openssl


②認証局・サーバ/クライアント証明書の作成等

rootになってから、作業ディレクトリに移動します。
$sudo su
#cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/

③varsファイルのバックアップ
#cp vars vars.original

④varsファイルの編集。
下記赤字の箇所を変更する。
# vim /etc/openvpn/easy-rsa/vars
KEY_COUNTRY=JP ←国名
KEY_PROVINCE=Tokyo ←県名
KEY_CITY=Shinagawa ←市町村名
KEY_ORG="MyHome" ←団体名
KEY_EMAIL="me@yhost.mydomain" ←メールアドレス
#vim vars

export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Shinagawa"
export KEY_ORG="MyHome"
export KEY_EMAIL="me@myhost.mydomain"
#export KEY_EMAIL=mail@host.domain
#export KEY_CN=changeme
#export KEY_NAME=changeme
#export KEY_OU=changeme
#export PKCS11_MODULE_PATH=changeme
#export PKCS11_PIN=1234


⑤設定ベースファイルのコピー
#cp openssl-1.0.0.cnf openssl.cnf


⑥認証局・証明書などを作成します

・事前準備
※基本的には先ほど設定したパラメータがデフォルト値となっているのでEnterでいけます。
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys
#./clean-all

・認証局(CA)の証明書と鍵を作成
# ./build-ca
Generating a 1024 bit RSA private key
................................++++++
..++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Shinagawa]:
Organization Name (eg, company) [MyHome]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [MyHome CA]:
Name []:
Email Address [me@myhost.mydomain]:


・サーバ側の証明書、秘密鍵の作成
# ./build-key-server server
Generating a 1024 bit RSA private key
..............++++++
...................................++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Shinagawa]:
Organization Name (eg, company) [MyHome]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Name []:
Email Address [me@myhost.mydomain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'JP'
stateOrProvinceName :PRINTABLE:'Tokyo'
localityName :PRINTABLE:'Shinagawa'
organizationName :PRINTABLE:'MyHome'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Apr 7 07:20:29 2023 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


・クライアント側の証明書、秘密鍵
※クライアントを複数つくることを想定して、「client1」としました。
# ./build-key client1
Generating a 1024 bit RSA private key
................................++++++
......++++++
writing new private key to 'client1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Shinagawa]:
Organization Name (eg, company) [MyHome]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client1]:
Name []:
Email Address [me@myhost.mydomain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'JP'
stateOrProvinceName :PRINTABLE:'Tokyo'
localityName :PRINTABLE:'Shinagawa'
organizationName :PRINTABLE:'MyHome'
commonName :PRINTABLE:'client1'
emailAddress :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Apr 7 07:22:01 2023 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


・DH 鍵共有パラメータを作成
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
....................................+...................+..............+............................+.........................+....+............................................+......+..+.................
(中略)
..................................................................................+......+.........................................++*++*++*



keysというフォルダにこんな感じのファイルができていれば成功。
これを使ってルータの設定を行います。
# ls -la ./keys
合計 76
drwx------ 2 root root 4096 4月 9 16:22 .
drwxr-xr-x 4 root root 4096 4月 9 16:16 ..
-rw-r--r-- 1 root root 3855 4月 9 16:20 01.pem
-rw-r--r-- 1 root root 3735 4月 9 16:22 02.pem
-rw-r--r-- 1 root root 1208 4月 9 16:18 ca.crt
-rw------- 1 root root 912 4月 9 16:18 ca.key
-rw-r--r-- 1 root root 3735 4月 9 16:22 client1.crt
-rw-r--r-- 1 root root 672 4月 9 16:22 client1.csr
-rw------- 1 root root 916 4月 9 16:22 client1.key
-rw-r--r-- 1 root root 245 4月 9 16:22 dh1024.pem
-rw-r--r-- 1 root root 213 4月 9 16:22 index.txt
-rw-r--r-- 1 root root 21 4月 9 16:22 index.txt.attr
-rw-r--r-- 1 root root 21 4月 9 16:20 index.txt.attr.old
-rw-r--r-- 1 root root 106 4月 9 16:20 index.txt.old
-rw-r--r-- 1 root root 3 4月 9 16:22 serial
-rw-r--r-- 1 root root 3 4月 9 16:20 serial.old
-rw-r--r-- 1 root root 3855 4月 9 16:20 server.crt
-rw-r--r-- 1 root root 672 4月 9 16:20 server.csr
-rw------- 1 root root 916 4月 9 16:20 server.key



3.ルータの設定(OpenVPN)

Webアクセスにてルータ(DD-WRT)の画面にログインする。

・Web画面から「ネットワーク -> PPTPサーバ/クライアント」の順にたどる。
・OpenVPNデーモンで下記設定を行う。
 Start OpenVPN デーモン : ON
 公開サーバー証明書: /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/ca.crt
 公開クライアント証明書: /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/server.crt
 Private Client Key: /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/server.key
 DH PEM: /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/dh1024.pem

※ファイル名を指定している個所は、指定しているファイルの中身(テキスト)をボックスに張り付けることを意味しています。(catやlessなどで中身を表示して張り付ける)

次に「OpenVPN Config」の箇所に以下を張り付ける。
※最初の3行は自分のネットワーク環境にあわせてください。(上の図と見比べると対応がわかると思います。)
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

dev tun0
proto udp
keepalive 10 120
dh /tmp/openvpn/dh.pem
ca /tmp/openvpn/ca.crt
cert /tmp/openvpn/cert.pem
key /tmp/openvpn/key.pem

# Only use crl-verify if you are using the revoke list - otherwise leave it commented out
# crl-verify /tmp/openvpn/ca.crl

# management parameter allows DD-WRT's OpenVPN Status web page to access the server's management port
# port must be 5001 for scripts embedded in firmware to work
management localhost 5001


これを張り付ける。
以上でサーバ側は完了。「設定」ボタンを押して設定を反映する。


4.ルータの設定(ルーティング、フィルタ)
DD-WRTのWeb画面で「管理->コマンド実行」の順にたどり、実行コマンドに以下を張り付け
※ここも自分の環境と合わせてください。
iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT
iptables -I FORWARD 1 --source 192.168.66.0/24 -j ACCEPT
# These next two lines may or may not be necessary.
# I (dereks) did not need them, but bmatthewshea did.
# Thus, we include them so that this works for more people:
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT

下の「Firewallスクリプトとして保存」ボタンをクリック。


5.クライアント(Ubuntu)の設定
クライアントとするUbuntuにログインし、openVPN-clientの設定をする。
まず、設定サンプルをホームディレクトリにコピーする。
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/
自分がアクセスできるように所有権・アクセス権を変更し、内容を変更する。
変更箇所は以下
remote 192.168.100.253 1194

client
remote-cert-tls server
dev tun0
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
float
;comp-lzo

#If the pushed routes appear not to be added on windows hosts, add the following:
route-delay 30

ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key

※remoteで指定するIPは、VPNルータのWANIP。
 最後の3行に関しては、証明書ファイルを配置した場所・ファイル名にします。
 私は、ホームディレクトリに".openvpn"というディレクトリを作成しそこにcrient.cnfと証明書関連ファイル入れました。



6.接続確認
Ubuntuでターミナルを開いて、ipenvpnコマンドを実行する。
$ sudo openvpn client.conf
Wed Apr 10 10:34:30 2013 OpenVPN 2.2.1 i686-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Feb 27 2013
Wed Apr 10 10:34:30 2013 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Wed Apr 10 10:34:30 2013 LZO compression initialized
(中略)
Wed Apr 10 10:34:34 2013 TUN/TAP device tun0 opened
Wed Apr 10 10:34:34 2013 TUN/TAP TX queue length set to 100
Wed Apr 10 10:34:34 2013 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Apr 10 10:34:34 2013 /sbin/ifconfig tun0 192.168.66.6 pointopoint 192.168.66.5 mtu 1500
Wed Apr 10 10:34:34 2013 /sbin/route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.66.5
Wed Apr 10 10:34:34 2013 /sbin/route add -net 192.168.66.1 netmask 255.255.255.255 gw 192.168.66.5
Wed Apr 10 10:34:34 2013 Initialization Sequence Completed

こんな表示が出れば完了。
※ファイルの配置、アクセス権によっては、sudoは不要です。

もし定期的に
「Wed Apr 10 10:36:49 2013 Bad LZO decompression header byte: 42」
が表示されるようであれば、client.confの「comp-lzo」がコメントアウトされていることを確認する。
※もしくはサーバ側でも合わせれば良いはずだが・・・うまく行かなかった。



-確認-

うまく行けばTerminalでifconfigを見ると
tun0 Link encap:不明なネット ハードウェアアドレス 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inetアドレス:192.168.66.6 P-t-P:192.168.66.5 マスク:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 メトリック:1
RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:100
RXバイト:0 (0.0 B) TXバイト:0 (0.0 B)

というインタフェースが追加されている。

また、「netstat -rn」コマンドで、VPNルータのLAN側のセグメント(192.168.1.0.0)向けのルーティングがtun0インタフェース向けに設定されていることがわかる。
$ netstat -rn
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 192.168.100.254 0.0.0.0 UG 0 0 0 eth0
10.82.12.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
192.168.1.0 192.168.66.5 255.255.255.0 UG 0 0 0 tun0
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.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0


試しに、リモートPC(Ubuntu)から自宅PC想定(Win)にTracerouteを試してみると
$ traceroute 192.168.1.131
traceroute to 192.168.1.131 (192.168.1.131), 30 hops max, 60 byte packets
1 192.168.66.1 (192.168.66.1) 24.173 ms 24.988 ms 25.964 ms
2 192.168.1.131 (192.168.1.131) 26.868 ms 27.784 ms 28.768 ms

となっており、Tunnelインタフェースを経由して到達していることがわかります。

ちなみに、Windows側(自宅相当)からTracerouteを試すと
C:\Users\user>tracert 192.168.66.6
192.168.66.6 へのルートをトレースしています。経由するホップ数は最大 30 です
1 1 ms <1 ms <1 ms DD-WRT [192.168.1.1]
2 3 ms 3 ms 3 ms 192.168.66.6
トレースを完了しました。


となり、ルータの先に直結されているイメージになっています。
これでリモートVPNが可能なルータができました♪


firewallルールなどちょっといじってみてもできたのですが、とりあえずWikiのものをそのまま使っています。
全体的に間違いあったらご指摘いただけると嬉しいです。



次回はこれをルータと言うよりも、省電力VPNサーバにしてみます。



DD-WRTで古いルータを復活してみる

DD-WRTで遊んでみる

またしても日経Linxuネタです。日経Linux4月号の「Linuxなら簡単何でも復活」という特集でDD-WRTというものを知った。
フリーのルータOSといった感じのもので、よくある家庭用ブロードバンドルータ(Buffalo,Corega...など)にインストールすることで、より高度な制御ができるルータにできちゃうらしいのです。
今回利用したBaffalo製のWHR-HP-G54などだと純正ファームウェアではWPAしか対応していないのがWPA2に対応できたりVPN機能を持たせたり、そのほかルータとしての機能もいろいろ強化できます。
ナニコレスゴイ。
というわけで、転がっていた「WHR-HP-G54」で遊んでみることにしました。


DD-WRTのオフィシャルサイト

事前に読んでおくべきあたり
Buffalo
Installation
TFTP Flash※TFTPで行う場合


【注意】当然のことながら、自己責任で実施してください。ルータが文鎮化(っていうの?)しても責任は持てません




1.事前準備

 ①対象ルータ用のファームウェアをダウンロードする
 
 上記サイトの「Router Database」から型名を入力して調べる。
 Supportedとなっていれば入れることができるようだよ。

 何も考えず推奨バージョン(v24perSP2[Beta]Build14896)のものをダウンロード。
 どれをダウンロードするかは
 http://www.dd-wrt.com/wiki/index.php/What_is_DD-WRT%3F
 に各ファームごとのサポート機能一覧が乗っているので確認する。
 今回は、「dd-wrt.v24_vpn_generic.bin」を選択した。


 インストール方法はいくつかあるみたいだけど、今回のルータはTFTPで行いました。
 (WebGUIからのインストールはエラーになってうまくいかなかった。)
 TFTP Flashの説明にある簡易TFTPサーバをダウンロードしておく。(TFTPであれば何でもよい。)
 以降はここでDLした「tftp2.exe」を利用する説明です。
 http://dd-wrt.com/wiki/index.php/TFTP_flash#Windows
 

 ②Buffaloファームの最新化
  やれと書いてあるけど、果たして必要かは不明。えっ?私はやりましたよ。

 ③ルータの初期化
  背面のINITボタンを長押しして、ルータを初期化する。
  (Web画面からでもいいと思います)

 ④PCの設定
  ・PCをルータのLAN側ポートにLANケーブルで接続する
  ・PCのIPアドレス、サブネットマスクを 
   192.168.11.2 255.255.255.0
   に設定しておく。
  ・TFTPサーバを起動して
   Server:192.168.11.1
   Password:なし
   File:先ほどダウンロードした「dd-wrt.v24_vpn_generic.bin」を選択

  ・ルータの電源ケーブルを抜いて電源をOFFにする。


2.インストール

本手順のポイントとしては、ルータブート中にTFTPでファイルをルータにアップロードするという事です。
 
 ①ルータの電源ON
  ルータに電源ケーブルを挿し、起動する。
 
 ②TFTPサーバのUpgradeボタンを押す
  ルータの” DIAG ”ランプが赤く点滅したら、すかさずファイルのアップロードを始めます。
  ※タイミングがあるみたいです。

  下のメッセージに「Firmware was upgraded successfully!」と表示されればアップロード成功です。
 
DDWRTファームアップロード


  しばらく待ちます。
  ルータが再起動され、DD-WRTファームウェアで起動してきます。

3.ルータへのログイン

 ①PCのIP設定をDHCPに変えます
 ②ブラウザでhttp://192.168.1.1にアクセスします
 
 DD-WRTの画面が表示されれば成功です。
DDWRT-Initial


パスワードの変更を行ってログインしてください。


4.日本語表示にする

Adminirationタブ>LanguageSelectionでJapaneseを選択して「ApplySetting」をクリックすると日本語表示になります。

以上で完了です。



今回はルータの細かい設定内容には触れません。
もともと、Buffaloの無線ルータの設定はどうもわかりづらいなと思っていたので、これでとっつきやすくなるとイイな♪
日本語になれば、ネットワークの知識が多少あれば基本的な使い方はできると思いますが
細かくはオフィシャルサイトのWikiが充実してそうなので参考になると思いますよ。



 
プロフィール

Author:Opecha-DaDa
メモ的なブログですが、あなたのお役に立てる内容があれば幸いです。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR