Bloody Mary - blog

Bloody Mary 別館

VPN サーバをルータ代わりにする 1

L2TPD + Openswan 環境の設定

お品書き

  1. xl2tpd と Openswan のインストール (いまここ)
  2. Windows 7 に VPN 接続設定
  3. VPN サーバのルータ化 ( iptables NAT )
  4. Samba をインストール

一昔前には考えもしなかったが、ネットワークに規制をかけるプロバイダが多くなってきた。

アップロードが 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 までのざっくりとした流れ

  1. VPN サーバを構築するために xl2tpd と Openswan をインストールする。 (いまここ)
  2. 一旦サーバから離れて、 Windows 端末で VPN 接続設定を行う。
  3. VPN サーバをルータ化するため、 iptables で MASQUERADE の設定をする。ついでに VPN 内にある端末を外部に公開するために、 iptables で DNAT の設定を行う。接続試験をしつつ iptables でファイアウォールの設定を厳しくしていく。(要根気)
  4. 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 の設定を行う。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Bloody Mary - blog © 2008 - 2021