スポンサーサイト

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

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に変更する箇所です(赤字)。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

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

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

この人とブロともになる

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