スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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サーバにしてみます。



スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

Author:Opecha-DaDa
ニッチな技術メモ的なブログになりつつありますが、だからこそあなたのお役に立てる内容があれば幸いです。

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

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。