ページ

2013年10月19日土曜日

RaspberryPiと戯れてみる 3 - VPNサーバー化 -

■ Raspberry PiをVPNサーバー化してみる

まず、VPNを作る代表的なプロトコルである、「PPTP」、「IPSec」を勉強。
どちらも認証、暗号化、カプセル化を行う。

・PPTP(Point to PointTunneling Protocol)

・・・Microsoft社によって提案された暗号通信のためのプロトコル。2台のコンピュータの間で情報を暗号化して送受信するので、インターネットを通じて安全に情報をやり取りできる。企業などで、インターネットを介した遠距離のLAN間接続や、社員がインターネットを通じて社内LANにアクセスするのに使われる。同社のWindows NTシリーズには標準でPPTPの機能が付属する。

・IPSec(Security Architecture for IP)

・・・インターネットで暗号通信を行うための規格。IPのパケットを暗号化して送受信するため、TCPやUDPなど上位のプロトコルを利用するアプリケーションソフトはIPsecが使われていることを意識する必要はない。現在インターネットで使われているIPv4ではオプションとして使用することができるが、次世代のIPv6では標準で実装される。


今回はPPTPを使用したVPNサーバ作りに挑戦
参考サイト 
http://qiita.com/sumyapp/items/b7300a9ffa316d676aa1

1. Pptpdのインストール

 pi@raspberrypi ~ $ sudo apt-get install pptpd
 


















2. Pptpdの設定

自身のIPと接続クライアントへの割当IP
【 /etc/pptpd.confの編集 】
pi@raspberrypi ~ $ diff /etc/pptpd.conf /etc/pptpd.conf.org
76,77c76,77
< localip 192.168.0.4
< remoteip 192.168.0.234-238,192.168.0.245
---
> #localip 192.168.0.1
> #remoteip 192.168.0.234-238,192.168.0.245

3. DNSの設定

接続してきたクライアントが使用するDNSサーバの設定
【 /etc/ppp/pptpd-optionsの編集 】
pi@raspberrypi ~ $ diff /etc/ppp/pptpd-options /etc/ppp/pptpd-options.org
55c55
< ms-dns 192.168.0.1
---
> #ms-dns 10.0.0.1

4. 接続クライアントのアカウント設定

【 /etc/ppp/chap-secretsの編集 】
pi@raspberrypi ~ $ sudo diff /etc/ppp/chap-secrets /etc/ppp/chap-secrets.org 
3c3
< chopper pptpd chopper *
---

5. IPフォワード設定

IPフォワード(IPフォワーディング - IP forwarding)とは
・・・他のホストから受け取ったIPパケットを別の経路へ向けて再送信すること。これを専門に行うネットワーク機器にはルータがある。また、プロキシサーバやファイアウォールがプライベートネットワークとインターネットの間で行っているのもIPフォワーディングと言える(厳密には、IPより上位のプロトコルに基づいて動作していることがあるのでIPフォワーディングに含めないという立場もある)。IPフォワーディングの際に一定条件を満たすパケットのみを転送するようにしたものがパケットフィルタリングである。

※宛先アドレスが自分では無いパケットも転送するようにしなければ、VPN経由で接続した端末からのパケットはすべて破棄されてしまう

【 /etc/sysctl.confの編集 】
pi@raspberrypi ~ $ diff /etc/sysctl.conf /etc/sysctl.conf.org
28c28
< net.ipv4.ip_forward=1
---
> #net.ipv4.ip_forward=1
44c44
< net.ipv4.conf.all.accept_redirects = 0
---
> #net.ipv4.conf.all.accept_redirects = 0
52c52
< net.ipv4.conf.all.send_redirects = 0
---
> #net.ipv4.conf.all.send_redirects = 0

※参考サイトとに書いてある項目が無かったりしたので、あるのだけコメントを外す。

6. MTU/MRUの設定

【 /etc/ppp/optionsの編集 】
pi@raspberrypi ~ $ diff /etc/ppp/options /etc/ppp/options.org
80c80
< mru 1280
---
> #mru 542
185c185
< mtu 1280
---
> #mtu <n>

6. ルータの設定

ポートフォワード設定
一般的な家庭では、ブロードバンドルータの類の下にサーバをぶらさげているかと思います。このように pptpd サーバが LAN の内部にある場合、ポート転送が必要になります。ルータの設定にて TCP の 1723 番ポートと、プロトコルの 47 番を pptpd サーバに転送してください。TCP の 47 番ポートではなく、47 番のプロトコル(GRE)であることに注意してください。

※GREとは
GRE ( Generic Routing Encapsulation ) はトンネルプロトコルの1つです。RFC1701, 2784で定義されています。トンネルプロトコルにはLayer2トンネリングのL2F, PPTP, L2TPとLayer3トンネリングのGRE, IPsec等があります。トンネリングとは、あるトラフィックを別のプロトコルでカプセル化して伝送することにより、通信を行う技術です。
パケットのカプセル化とその解除はトンネルの両端の機器で行う為、両端の機器が直結しているように見えます。

・自宅ルータの設定内容
ルータ ATerm BL190HW    ATerm D9C9DC






これでいける。。。はずだが、Android端末からは接続できませんでした。。
※ちなみにRaspberry PIにはパケットが到着している模様
解析ツール sudo tcpdump -s0 -i eth0 -X port 1723
http://linux-biyori.sakura.ne.jp/setting/st_tcpdump.php

※追加 2013.10.26
その後つながらない事の調査

http://www.kurobuti.com/blog/?p=4275
↑サイトを参考に /var/log/pptpd.logにログ出力

・Android端末からの接続時のエラーログ
Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
pptpd-logwtmp: $Version$
using channel 8
Using interface ppp0
Connect: ppp0 <--> /dev/pts/1
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <mru 1280> <asyncmap 0x0> <auth chap MS-v2> <magic 0xbfcfb351> <pcomp> <accomp>]
LCP: timeout sending Config-Requests
Connection terminated.

Modem hangup

LCP: timeout sending Config-Requests ◀︎ここが怪しい?

Connect: ppp0 <--> /dev/pts/1 ◀︎これは何をしているのか?
https://www.grnt.ne.jp/internet_config.php?cnt=40
↑ここにこんな記述が
PPPOEで接続した場合の仮想NICは【ppp0】になります。iptables等でNICを設定している場合は【ppp0】に変更して下さい

PPPoEとは・・・
http://www.n-assist.com/booknavi/pppoe.htm

NICとは・・・
http://e-words.jp/w/NIC-2.html

iptablesとは・・・
Linuxに実装されたファイアウオール機能です。Linuxカーネル2.4以降に組み込まれています。
 iptablesでは、コンピュータがやり取りするパケットを、あらかじめ定義しておいた「チェイン」単位に分類し、チェインごとにどのような処理を行うかを「ルール」として設定します。

 主なLinuxディストリビューションでは、次の3種類のチェインが標準で用意されています(図1)。

・INPUT
(サーバーへ到達するパケット)
・FORWARD
(サーバーを通過するパケット)
・OUTPUT
(サーバーから送出するパケット)
 ユーザーが新しいチェインを追加することもできます。

 ルールでは、パケットの送出元(ソース・アドレス)やパケットのあて先(ディスティネーション・アドレス)などを指定し、該当するパケットに対し、どのような処理を行うかを指定します。処理には、パケットを破棄する「DROP」、拒否パケットを送出する「REJECT」、許可をする「ACCEPT」などを指定します。

現在のiptablesの設定
pi@raspberrypi ~ $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   


0 件のコメント:

コメントを投稿