L2TPD + Openswan 環境の設定
お品書き
一昔前には考えもしなかったが、ネットワークに規制をかけるプロバイダが多くなってきた。
アップロードが 30GB/日 を超えたらダメという規制なら可愛いもので、どこかの大陸よろしくネットワークをモニタリングして P2P 通信そのものを制限しているケースが最悪である。
そのような規制でなくとも、混雑するネットワークから接続しているために反応が遅いというケースもある。
というわけで、上記のような状況を回避すべく VPN を試してみた。
VPN とは
Virtual Private Network はインターネット上に作られた仮想的な LAN だと考えるのが分かりやすい。
見ての通り VPN の範囲は Local Area Network からインターネット側にはみ出しているので、視点を変えればダイヤルアップして別の LAN に繋いでいるようにも見える
普通 LAN と言えば、ブロードバンドルータに配線された家庭内のネットワークだ。
上記の図では PC が 192.168.11.2、タブレット端末が 192.168.11.3 になっている。
ルータは 192.168.11.1 というローカルの IP アドレスを持っているが、一方でインターネット上の IP アドレス 1.2.3.4 も持っている。
これこそがルータの特徴だ。 2 つのネットワークに属するネットワークカード (IP アドレスと考えると分かりやすい) を持ち、一方から来るパケットを別のネットワークカードに転送 ( FORWARD ) する。この概念は後にサーバをルータ化する時に重要になるので、軽く頭に留めておいて欲しい。
さて肝心の VPN だが、 PC を VPN クライアント、インターネット上のサーバを VPN サーバとして VPN を構成する。
VPN サーバに対して、 VPN クライアントはサーバのリソースが許す限り何台でも接続できる。接続すればするほど VPN が大きくなる。
同一 VPN 内にファイルサーバを用意すれば、 LAN と同程度のセキュリティで社内情報ファイルをやり取りできるだろう。たぶん、こういうのが本来の使い方だ。
だが今回は、セキュリティ管理者になったつもりで VPN 内に Gateway を用意する。
このページの目的
VPN サーバを LAN から Internet に出ていくための Gateway に見立て、 VPN 内の PC からインターネット上の WEB を閲覧したり、メールを受信したりする環境を構築する。
VPN クライアントと VPN サーバ間は暗号化されているため、 ISP のネットワーク監視型の規制はすり抜けられるはずだ。ただし、容量制限は回避できない。
この構成で BitComet などの P2P 規制を回避できると思う。というか大御所ですらダウンロードリンクに torrent 使っているのに、これを規制する意味が分からん。
必要とするもの
- グローバル IP アドレスを持った Linux サーバ
- インターネット回線
- ブロードバンドルータ (実は VPN パススルー機能は不要)
- パソコン
- 根気
Cloudn の一番安いプラン (400円/月) に Cent OS 6.5 を入れたサーバを用意し、 VPN の設定を行うことにする。
余談ではあるが、 L2TP は NAT 越えの機能を持ったプロトコルなので、 VPN パススルー機能を持たないルータでも一般的な LAN 環境から利用可能である。私のルータは Buffalo エアステーション WZR-1750DHP2 で、 PPTP パススルー機能には最初からチェックが入っていたが、あえてこのチェックを外しても VPN 接続ができた。
パソコンは Windows7 と Android で試験した。
根気はかなり必要かもしれない。なくなったら一休みして回復すること。
VPN までのざっくりとした流れ
- VPN サーバを構築するために xl2tpd と Openswan をインストールする。 (いまここ)
- 一旦サーバから離れて、 Windows 端末で VPN 接続設定を行う。
- VPN サーバをルータ化するため、 iptables で MASQUERADE の設定をする。ついでに VPN 内にある端末を外部に公開するために、 iptables で DNAT の設定を行う。接続試験をしつつ iptables でファイアウォールの設定を厳しくしていく。(要根気)
- Samba をインストールして VLAN 内でファイルのやり取りを行う。 iptables の許可は 1 行。
前提条件
項目 | 値 |
---|---|
サーバのグローバルIPアドレス | 1.2.3.4 |
VPN の IP アドレス帯 | 192.168.100.0/24 |
DMZサーバの IPアドレス | 192.168.100.200 |
DMZ のポート | 8080 |
※ クライアントに IP を固定せずに VLAN に接続すると、192.168.100.2 から取得していく。
※ DMZ には IP アドレスを固定すること。
xl2tpd インストール
VPN サーバと VPN クライアント間を L2TP というトンネルで接続させるため、 xl2tpd をインストールする。この接続は暗号化されていないので、 IPsec という技術で暗号化してセキュリティを担保するために後ほど Openswan をインストールする必要がある。
1. yum でインストール
# yum install xl2tpd
2. /etc/xl2tpd/xl2tpd.conf の設定
# vi /etc/xl2tpd/xl2tpd.conf ------------------------------ [global] listen-addr = 1.2.3.4 [lns default] ip range = 192.168.100.2-192.168.100.254 local ip = 192.168.100.1 require chap = yes refuse pap = yes require authentication = yes ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd length bit = yes ------------------------------
※ 点線は無視すること。
※ listen-addr はサーバのグローバル IP アドレス。
※ ip range は接続される端末に割り振った IP アドレス。
※ local ip は L2TP で接続したときに、 pppX (Xは数字) に割り当てられる IP アドレス。 1台目 ppp0, 2台目 ppp1, 以下略…。面白いことに、いくつ端末が接続されても、作成された仮想ネットワークインターフェース (pppX) には 192.168.100.1 が割り当てられる。
3. /etc/ppp/options.xl2tpd の設定
# vi /etc/ppp/options.xl2tpd ------------------------------ name xl2tpd auth refuse-pap require-chap require-mschap require-mschap-v2 ipcp-accept-local ipcp-accept-remote ms-dns 8.8.8.8 # # for Android Setting #noccp # crtscts idle 1800 mtu 1410 mru 1410 nodefaultroute #debug lock proxyarp connect-delay 5000 ------------------------------
※ name は chap-secrets に合わせること。
※ Android 端末から VPN 接続するなら noccp をコメントアウトすること。
※ crtscts はハードウェアフロー制御を使用。(RTS/CTS)
※ nodefaultroute は VPN 接続されたときに、相手側の端末をゲートウェイにしないということ。
4. CHAP 認証設定
接続時のユーザ名、パスワードの設定。
# vi /etc/ppp/chap-secrets ------------------------------ # User Server Secret IPAddr hogeuser xl2tpd "hogepw" * ------------------------------
※ タブ区切りらしい。空白でもいい?
※ ユーザ名とパスワードはそのまま使わないこと。
※ Server名を変えるなら /etc/ppp/options.xl2tpd の name も変更する。
パーミッションを 600 に (最初からなっているが)。
# chmod 600 /etc/ppp/chap-secrets
とりあえずここまで。起動は後ほど。
Openswan のインストール
L2TP で接続したトンネルを IPSec で暗号化するため、 Openswan をインストールする。
1. Openswan のインストール
# yum install openswan
2. /etc/ipsec.conf の設定
# vi /etc/ipsec.conf ------------------------------ version 2.0 # conforms to second version of ipsec.conf specification config setup protostack=netkey nat_traversal=yes virtual_private=%v4:192.168.100.0/24 oe=off include /etc/ipsec.d/*.conf ------------------------------
3. /etc/ipsec.d/l2tp-psk.conf の設定
# vi /etc/ipsec.d/l2tp-psk.conf ------------------------------ conn L2TP-PSK-NAT rightsubnet=0.0.0.0/0 forceencaps=yes also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT authby=secret pfs=no auto=add keyingtries=3 rekey=no ikelifetime=8h keylife=1h type=transport left=1.2.3.4 leftprotoport=17/1701 right=%any rightprotoport=17/%any ------------------------------
※ left にグローバル IP アドレス。
4. PSK の設定 (事前共有鍵)
暗号通信を始める前の事前共有鍵を設定する。
# vi /etc/ipsec.d/default.secrets ------------------------------ : PSK "jizenkagi" ------------------------------
※ PSK を 10 文字以上にすると一部の Android で接続できない可能性があるらしい。
他のユーザから読み込みできないようにしておく。
# chmod 600 /etc/ipsec.d/default.secrets
起動と verify
xl2tpd と openswan を起動し、問題がないかどうかのチェックを行う。
自動起動を ON にする。
1. SELinux を無効化する
# vi /etc/selinux/config ------------------------------ 変更点 SELINUX=disabled ------------------------------ # setenforce 0
※ SELINUX=disabled にして reboot すれば反映されるが、手っ取り早く「setenforce 0」を打って無効化する。両方やること。
2. xl2tpd と ipsec を起動する
# service xl2tpd start # service ipsec start
※ 起動順が異なると Mac 等から接続できなくなることがあるらしい。
※ その場合 service ipsec restart すれば OK。後ほどスクリプトを作る。
3. lsof をインストール
ipsec verify の設定確認に必要。
# yum install lsof
4. IPsec チェックする
# ipsec verify Checking your system to see if IPsec got installed and started correctly: Version check and ipsec on-path [OK] Linux Openswan U2.6.32/K2.6.32-504.3.3.el6.x86_64 (netkey) Checking for IPsec support in kernel [OK] SAref kernel support [N/A] NETKEY: Testing for disabled ICMP send_redirects [OK] NETKEY detected, testing for disabled ICMP accept_redirects [OK] Testing against enforced SElinux mode [OK] Checking that pluto is running [OK] Pluto listening for IKE on udp 500 [OK] Pluto listening for NAT-T on udp 4500 [OK] Checking for 'ip' command [OK] Checking /bin/sh is not /bin/dash [OK] Checking for 'iptables' command [OK] Opportunistic Encryption Support [DISABLED]
OK のようだ
5. 自動起動するようにしておく
# chkconfig xl2tpd on # chkcofig ipsec on
サーバ側の「ハードウェア」ファイアウォール設定
サーバ側にファイアウォールがある場合、以下のポートを許可しておくこと。
cloudn の場合は次の場所にある。
[ポータル] – [コンソールへ]
[ネットワーク] – [セキュリティグループ]
[default(人によっては別の名前)] – [受信規則]
プロトコル | ポート | CIDR | 備考 |
---|---|---|---|
UDP | 1701 | 0.0.0.0/0 | L2TP パケットの最初の待ち受け |
UDP | 500 | 0.0.0.0/0 | isakmp |
UDP | 4500 | 0.0.0.0/0 | non500-isakmp |
TCP | 8080 | 0.0.0.0/0 | DMZ 用解放ポート |
ここまででとりあえずつながる VPN サーバになったはずだが、 iptables の設定が終わるまでは通信できないと思われる。
従って次に iptables と行きたいところだが、 Step by Step ということで、 Windows7 の設定を行う。