2009.04.17

Amazon EC2でVPN

2月にこのブログを始めたころ、Amazon EC2のLinuxを使いPPTPdやL2TP/IPsecを構築して遊んでたんです。
しかし、外部からEC2のVPNサーバに接続はできたんですが、EC2内サーバ同士でやろうとすると、GREなどのIPレベルのプロトコルが通信できないエラーが発生するなどして、Amazon EC2内でVPN構築ができなかったんですね。

それから放置すること約2ヶ月。

別の人から「動きましたよ?」との連絡を受ける。

過去に構築したイメージを起動して自分でも試してみる。
LinuxのVPNサーバへWindowsから普通にVPN接続できる。

あれー?

そのあたりのプロトコルを通信できるようにネットワーク変更が行われてたんでしょうか。
それとも前回試したときはなにか接続方法を間違えてたんでしょうか。
謎です。

ちなみに、このブログにあるPPTPd構築の方法で大丈夫みたいです。
これでまたEC2で遊べることが増えるぞー。

2009.03.04

Windows Server 2008の新VPNプロトコル「SSTP」

PPTPに懲りず、Microsoftが新しいVPNプロトコルを実装している。
その名も「Secure Sockets Tunneling Protocol(SSTP)」だ。

これはカテゴリ的には「SSL VPN」と言うものらしい。
Microsoftは「SSL VPNではない新しいものだ」と主張してるという噂もあるけど。

現在SSL VPNでもっとも有名なのはOpenVPN
アプリをインストールするだけでホスト間のVPNを構築でき、OSの対応も多種多様。
インストールの手間をいとわない、もしくはインストールしないと使えないという作業でセキュリティレベルを上げるならお勧めだ。
複雑なIPsecと競い合ってる一品。

さて、話は戻って
そんなSSL VPNに入ってきたMicrosoftのSSTPだが
特徴をあげてみよう。

1.通信ポートが簡単
SSTPでは通信にHTTPS(TCPポート443)のみを使用しているのが最も大きな特徴だ。
これまでのPPTPはTCPポート1723とIPプロトコル番号47のGREを使用している。
TCPポート1723はWebやメールしか見れないなんていうセキュリティの厳しい大企業以外はいいとしても
TCPでもUDPでもないGREのパケットは環境によっては使えないこともあった。
またL2TP/IPsecでも同様にUDPポート1701、500が必要。
さらにIPプロトコル番号50のESPを使用し、NATを介する場合はUDPポート4500が必要と何かと複雑だった。
IPsecパススルーとかないとだめだしね。

そんなわけで
どんなネットワークでも使えるであろうHTTPSのポートのみを使用してVPNが構築できるのはすごい。

2.利用が簡単
「Windows Vista SP1」で何気にSSTPが追加されている。
そのためWindowsユーザはこれまでのVPN接続の設定と同様の手順でSSTPが利用できる。

3.証明書が必要
これはデメリットになるのだが
SSTPサーバを構築するためにはSSL用のサーバ証明書が必要となるらしい。
サーバ証明書なんて取るだけでお金がかかるため、趣味では使いにくいかもしれない。

4.ホスト間のみ
これもデメリットだと思うのだが
現状対応しているのが「Windows Server 2008」と「Windows Vista SP1」のみ。
L2TP/IPsecのようにルータで手軽にネットワーク同士をVPN構築できたりしないので面倒と言えば面倒。
Windows Server大好きな人はそれをルータにしてくれても構わないが
個人的趣向で言えばWindowsでそんなことはやりたくない。

そんなわけで
Windows Server 2008をまだ実際に触ったことないので
構築手順もなにも書けないのですが
サーバ証明書がどうにかだませるなら試してみたいなとは思う一品。

詳しくはWEBで ->
http://www.techworld.jp/channels/software/102099/(削除されていました)

(さらに…)

なぜPPTPよりもL2TP/IPsecなのか

よく言われる話ですがPPTPはセキュリティレベルが低い。
漠然と「危険」とは思っていましたが、なぜかは知りませんでした。

そんなわけで調べたことのまとめ。

1.認証の問題
PPTPにはMS-CHAPを認証に使用します。
MS-CHAP v1は暗号強度がMD4の40bit、RASの偽装を確認できない、送受信が同じ暗号鍵という問題がありました。
そこでMS-CHAP v2に改良されました。
RASの偽装などはできなくなりましたが、チャレンジレスポンスにMD4とDESが使われることはv1と変わりません。
このMD4は既に脆弱性が見つかっており、DESに関しても解読されることが確認されています。
またMS-CHAPではユーザ名とパスワードのみで認証が行われるため、そこが解読されるとアウトです。

2.暗号化の問題
PPTPでは暗号化にはMPPEが使用されています。
このMPPEは暗号鍵が128bitの固定なので攻撃が簡単になります。
またこのMPPEの暗号鍵は先に述べた安全でないMS-CHAPで交換が行われるためここにも問題があります。

これらの理由からPPTPは安全でないと言われているようです。
Windowsクライアントから簡単に接続できるVPN環境を構築するなら
L2TP/IPsecを使用しろってことですね。

ネットワークなんて誰が盗聴してるかわからないですから。。。

2009.02.24

L2TPでVPN接続

PPTPよりセキュリティの強いL2TPにチャレンジ。
OSはFedora8(i386)を使用してます。

1.IPsecのインストール
2.l2tpdのインストール
3.サービス起動
4.Windows XPを使っている場合の注意点

1.IPsecのインストール
L2TPはトンネルを作成するプロトコルでPPTPとは違い暗号化までは行われない。
そこでIPレベルでの暗号化を行うためIPsecをインストールします。
ここではopenswanを使用します。
http://www.openswan.org/
また、事前共有鍵方式と証明書方式があるが、ここでは事前共有鍵方式を使う。

とりあえずインストール。

# yum install openswan

設定ファイルをサンプルからコピー。
特に修正必要なし。

# cp /etc/ipsec.d/examples/l2tp-psk.conf /etc/ipsec.d/

事前共有鍵の作成。
/etc/ipsec.d/l2tp-psk.secrets

# vi /etc/ipsec.d/l2tp-psk.secrets

以下を入力。

: PSK "pre-shared-key"

2.l2tpdのインストール
実際にトンネルをはるプロトコル。
第2層のデータリンク層らしい。
ここではxl2tpdを使用する。

# yum install xl2tpd

ちなみにこのxl2tpdをCentOS5.2にインストールしようとしたところ
rpmはなくソースから適用しようとするとkernel2.6.23以上を求められた。
CentOS5.2のkernelは2.6.18である。面倒なので挫折。

L2TPの設定ファイルを編集。
/etc/xl2tpd/xl2tpd.conf

# vi /etc/xl2tpd/xl2tpd.conf

以下の内容を修正。
ここでは
サーバIP:192.168.0.1
割り当てIP:192.168.0.101-192.168.0.254
としているが、各自のネットワークを考慮して割り当ててください。

ip range = 192.168.0.101-192.168.0.254
local ip = 192.168.0.1

PPPの設定ファイルを編集。
/etc/ppp/options.xl2tpd

# vi /etc/ppp/options.xl2tpd

接続PCに割り当てるDNSとWINSを指定。
今回DNSはL2TPサーバ自身。WINSはなし。

ms-dns 192.168.0.1

また、同ファイルに以下を追加。
認証はmschap-v2を使えという指示。

refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
logfile /var/log/xl2tpd.l2tp-ipsec.log

VPNアクセスユーザアカウントの定義を作成。
/etc/ppp/chap-secrets

# vi /etc/ppp/chap-secrets

アカウントを追加。

ユーザ名 * パスワード *

こんな感じです。

3.サービス起動
サービスの登録と起動。

# chkconfig xl2tpd on
# chkconfig ipsec on
# /etc/init.d/xl2tpd start
# /etc/init.d/ipsec start

4.Windows XPを使っている場合の注意点
WindowsXP SP2ではL2TP/IPsecをNAT越しに利用できないようになっています。
これを利用できるようにするためレジストリの変更が必要となります。

regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPsec
の中に
"AssumeUDPEncapsulationContextOnSendRule"
というDWORD値を作り、値に"2"を設定する。

詳しくはMicrosoftのページへhttp://support.microsoft.com/kb/885407/jaへ。

以上でサービスの構築は終了です。
WindowsXPなどのクライアントから接続してみてください。

ルーティングなどに関してはPPTPdの構築記をご参照あれ。

2008.03.29

PPTPでVPN接続

自宅サーバにPPTPdを構築し
外部から自宅PCにVPN接続したくなったのでその構築記。

1.pptpdのインストール
2.設定ファイルの編集
3.サービス起動

1.pptpdのインストール
PPTPdにはOpenSourceのPopTopを使用。
まずはそのインストールから。

地道にrpmをダウンロードしてインストールしてもいいんですが
やはりここは美しくyumで一括インストール。

安定版
http://poptop.sourceforge.net/yum/stable/
ベータ版
http://poptop.sourceforge.net/yum/beta/

上記サイトから該当する構成を選択してリポジトリ登録用のrpmを取得。
今回は安定版を選択し、僕の環境ではFedora8のi386だったので
http://poptop.sourceforge.net/yum/stable/fc8/i386/pptp-release-current.fc8.noarch.rpm
を使用しました。
自分の構成がない場合は
http://poptop.sourceforge.net/yum/stable/packages/
からおとなしく必要なrpmをダウンロードしてインストールしてください。その説明は割愛。

以下インストール

# rpm -Uvh
 http://poptop.sourceforge.net/yum/stable/fc8/i386/pptp-release-current.fc8.noarch.rpm
# yum --enablerepo=poptop-stable install pptpd

インストール完了。

2.設定ファイルの編集
次は設定ファイルの編集です。
編集が必要なファイルは以下の2つです。
/etc/pptpd.conf
/etc/ppp/chap-secrets

設定サイトを参考にしていると
/etc/ppp/options.pptpd
も編集しろと書かれていたりするんですが、これはデフォルトで動作しましたので割愛。

まずはメインのpptpd.confから

# vi /etc/pptpd.conf

この設定ファイルにPPTPd用のIPアドレスとVPN接続してきたクライアント用のIPアドレスを記載します。
PPTPはPPPを利用した接続方式で、PPPはコンピュータを1対1で接続するプロトコルです。
それぞれのコンピュータの識別にIPアドレスを利用するため、それぞれのIPの設定が必要となります。

ファイルの最後に下記を追加。

localip 192.168.0.15
remoteip 192.168.0.151-160

この構成では、PPTPdのサーバとしては192.168.0.15のIPを使用し
クライアントには192.168.0.151から192.168.0.160の空きIPが割り当てられます。
特別必要がない限りはネットワークアドレスの空きを割り当てれば大丈夫です。

続いてchap-secrets。

# vi /etc/ppp/chap-secrets

この設定ファイルはPPTP接続のユーザ認証設定を記載します。

ユーザ名 pptpd パスワード *

こんな感じです。
/etc/ppp/options.pptpdでサーバ名などを真面目に修正される場合は
pptpdの部分をサーバ名に変更する必要があります。
最後の「*」の部分はIPアドレスの設定ですが、あまり気にせずお約束のように「*」を入れておきましょう。
あとSambaのユーザ認証なども使えるようです。
セキュリティ的にそっちのがよければお調べください

これでPPTPdの設定は完了です。

3.サービス起動
最後にサービスをスタート。

# /etc/init.d/pptpd start

さて、ここまではただのインストールで寝ててもできる設定ですね(実際寝てました)
でもこれで終わらないからネットワーク屋さんなのです。
続いてネットワークの設定です。

1.ルータの設定
2.ファイアウォールのINPUTの許可
3.IP packetのフォワード設定
4.ファイアウォールのFORWARDの許可

1.ルータの設定
まずはルータの設定。
PPTPで使用するTCPの1723番ポートを自宅サーバへフォワードするように設定。
これはルータのマニュアル参照。

2.ファイアウォールのINPUTの許可
次に受信したパケットの受け付けを許可します。
iptablesのファイルを編集(IPv6の場合はip6tables)

# vi /etc/sysconfig/iptables

以下の許可を追加。

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1723 -j ACCEPT

RH-Firewall-1-INPUTはFedoraにデフォで設定されてる定義名みたいなものです。
環境が違う場合は各自書き換えを。
iptablesの設定変更を反映。

# /etc/init.d/iptables restart

ここまでの設定でPPTP接続ができるはずです。
WindowsからVPN接続の設定をして試してみてください。
PPTPdサーバに設定したIPからpingが返れば成功です。

3.IP packetのフォワード設定
サーバにデータを置いていれば上記まででいいのですが
残念ながら僕のデータはWindowsマシンのほう。
ということでサーバでパケットの転送を行わなければいけません。

そのためのカーネルパラメータにパケットフォワードの許可の設定。

# vi /etc/sysctl.conf

以下の項目を変更し転送許可を設定。

net.ipv4.ip_forward = 0
↓
net.ipv4.ip_forward = 1

設定の変更を有効に。

# sysctl -p /etc/sysctl.conf

4.ファイアウォールのFORWARDの許可
最後に有効にしたパケットフォワードをファイアウォールで許可。

# vi /etc/sysconfig/iptables

-A FORWARD -j REJECT –reject-with icmp-host-prohibited
より前に以下の設定を追加。

-A FORWARD -p icmp --icmp-type any -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state NEW -m tcp -p tcp --dport 137:139 -j ACCEPT
-A FORWARD -m state --state NEW -m udp -p udp --dport 137:139 -j ACCEPT
-A FORWARD -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
-A FORWARD -m state --state NEW -m udp -p udp --dport 445 -j ACCEPT

ping確認のためのicmpの許可と
ファイル共有を行うために137-139と445を許可しています。

iptablesの設定変更を反映。

# /etc/init.d/iptables restart

以上で設定完了です!
これでいつでもどこからでもWindowsについてるVPN接続で自宅サーバに接続し
自宅PCのファイルにアクセス可能になりました!

余談。

このファイアウォールのフォワードの設定はファイル共有だけっつーけっこーシビアなものなので
VPN接続してる状態でウェブ見たりとかメール見たりとかメッセつないだりとかできない。
ということで

-A FORWARD -i ppp0 -j ACCEPT
-A FORWARD -o ppp0 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

こんな風に書き換えてしまうとVPN接続は全てスルーになります。
まぁ、こっちのが楽でいいかな…(ppp0はVPN接続時のインタフェース名です)