L2TP/IPSecサーバ構築の忘備録

2014-01-06_vpn-image.png

喫茶店や街角の無料WiFiが信用出来ない時海外での接続時など、

「悪い人が沢山いるインターネッツ怖い!」「今すぐVPNが使いたい!」 って時。意外とあると思います。

自分自身何度かそんな目にあった結果、何も考えずにコマンド一発でL2TP/IPSecなクライアントVPN環境を構築するスクリプトを紹介します。 (画像はイメージですが、オフィス内や自宅内に構築する事で、オフィスや自宅に安心して接続出来る環境を作る事もできます。)

最後に一応スクリプトの解説も載せておきます。 出先からの使い捨て用VPNではなく、長期で利用を検討している人は一部設定内容(パスワード等)の変更をお勧めします。

構築手順

(事前準備)サーバを用意します

何にせよ、まずは構築対象のサーバが必要です。 今回作ったスクリプトはCentOS 6.x用に作られているので、適当にCentOS 6.xなサーバを用意します。 直接グローバルIPアドレスを取得しているサーバだと設定が楽です。

個人的よく使うのはさくらのVPSの980円プランか、さくらのクラウドです。 1ヶ月以上維持して使う様なサーバはさくらのVPSを使って、一瞬しか使わない様な場合はさくらのクラウドを利用しています。

ただ、実際に一番良く使っているのは個人的事情によりニフティクラウドだったりします。 ニフティクラウドはサーバから10Gbps共有でインターネットへ接続出来していて、ネットワーク回線が爆速なのでVPNみたいな使い方には最高です。(ステマ)

オフィス内や自宅内に構築する際は、ルータからVPNサーバへのポートフォワードやVPNパススルー設定にお気をつけ下さい。

サーバが用意できればあとは簡単です。

構築スクリプトを実行!

  • 事前に準備したサーバへログインし root 権限を取得します
% su -
Password:
#
  • root になったら下記ワンライナーを実行して完成です
# curl -L 'https://gist.github.com/ysaotome/6097172/raw/L2TP_IPSec_vpn_setup_for_centos65.sh' | bash
  • こんなログが流れます
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4522    0  4522    0     0   2457      0 --:--:--  0:00:01 --:--:-- 21330
(石川さんごめんなさい)
/usr/sbin/setenforce: SELinux is disabled

....省略....

iptables: Bad rule (does a matching rule exist in that chain?).
iptables: ファイアウォールのルールを /etc/sysconfig/iptables に保存中: [  OK  ]
iptables: チェインをポリシー ACCEPT へ設定中filter nat [  OK  ]
iptables: ファイアウォールルールを消去中: [  OK  ]
iptables: モジュールを取り外し中:[  OK  ]
iptables: ファイアウォールルールを適用中: [  OK  ]
Starting xl2tpd: [  OK  ]
ipsec_setup: Starting Openswan IPsec U2.6.32/K2.6.32-431.3.1.el6.x86_64...
ipsec_setup: /usr/libexec/ipsec/addconn Non-fips mode set in /proc/sys/crypto/fips_enabled
ipsec_setup: /usr/libexec/ipsec/addconn Non-fips mode set in /proc/sys/crypto/fips_enabled
L2TP/IPsec SERVER IP     : xxx.xxx.xxx.xxx
L2TP/IPsec USER/PASSWORD :
# Secrets for authentication using CHAP
# client    server  secret          IP addresses
#==============================================
# username auth_server password auth_ipaddress
"hoge001" "xl2tpd" "hoge##123" *
"hoge002" "xl2tpd" "hoge##456" *
#==============================================
L2TP/IPsec PSK SECRETS   : HOGESECRETS
Install log              : /var/log/L2TP_IPsec-installer.log
  • 最後の部分に接続情報などが表示されています
L2TP/IPsec SERVER IP     : xxx.xxx.xxx.xxx      //←接続先IPアドレス(VPNサーバのIPアドレス)
L2TP/IPsec USER/PASSWORD :
# Secrets for authentication using CHAP
# client    server  secret          IP addresses
#==============================================
# username auth_server password auth_ipaddress
"hoge001" "xl2tpd" "hoge##123" *                //←接続用のユーザー名とパスワード1個目(←の場合 hoge001 がユーザ名で hoge##123 がパスワード
"hoge002" "xl2tpd" "hoge##456" *                //←接続用のユーザー名とパスワード2個目(←の場合 hoge002 がユーザ名で hoge##456 がパスワード
#==============================================
L2TP/IPsec PSK SECRETS   : HOGESECRETS          //←L2TP/IPSec接続時に必要になる シークレットキー(←の場合 HOGESECRETS
Install log              : /var/log/L2TP_IPsec-installer.log //←インストール処理のログ

動作確認

Mac OS Xから接続してみる!

  • 「Spotlight」を起動し system と入力して [Enter] で「システム環境設定」を起動します

2014-01-05_spotlight-search-system.png

  • 「システム環境設定」→「ネットワーク」を開いて、左下の「+」をクリック
  • 「インターフェース」で「VPN」、「VPNタイプ」で「L2TP over IPsec」を選択し、「サービス名」に適当な名前を入力して「作成」をクリック

2014-01-05_system-network-vpn.png

  • 「構成」で「デフォルト」、「サーバアドレス」で「VPNサーバのIPアドレス」、「アカウント名」で「ユーザ名」を入力して「認証設定」をクリック

2014-01-05_system-network-vpn2.png

  • 「ユーザ認証:パスワード」で「ユーザのパスワード」、「コンピュータ認証:共有シークレット」で「シークレットキー」を入力して「OK」をクリック

2014-01-05_system-network-vpn3.png

  • 後は「接続」をクリックするとVPNに接続されます

2014-01-05_system-network-vpn4.png

  • 実際にVPN経由のアクセスになっているか確認
  • ブラウザで http://www.ugtop.com/spill.shtml へアクセス
  • 現在接続している場所(IPv4) の項目に VPNサーバのIPアドレス が表示されていれば無事VPN経由でインターネットへアクセスができています。

2014-01-05_system-network-vpn5.png

Androidから接続してみる!

iPhoneから接続してみる!

Windowsから接続してみる!

うまくつながらない場合

  • サービスがうまく起動しているか確認する
# service xl2tpd status
xl2tpd (pid  1990) を実行中...
#
# service ipsec status
IPsec running  - pluto pid: 2120
pluto pid 2120
1 tunnels up
some eroutes exist
  • iptablesで必要なポートやプロトコルが開いているか確認する
  • 1701/UDP 500/UDP 4500/UDP ESP が開いている必要があります
# service iptables status
テーブル: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:1701
2    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:500
3    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:4500
4    ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:1701
6    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:500
7    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:4500
8    ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

テーブル: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0
2    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

一応スクリプト解説

インストール時に実行していた下記コマンドでは下記スクリプトを取得して実行しています。

特に設定変更したほうが良い箇所は下記3箇所です。

### setting
/bin/cat << _SECRETS_ > /tmp/SECRETS_TMP.txt
#==============================================
# username auth_server password auth_ipaddress
"hoge001" "xl2tpd" "hoge##123" *                //←接続用ユーザ1の ユーザー名 と パスワード
"hoge002" "xl2tpd" "hoge##456" *                //←接続用ユーザ2の ユーザー名 と パスワード
#==============================================
_SECRETS_

PSK_SECRETS='HOGESECRETS'                       //←L2TP/IPSec接続時に必要になる シークレットキー

長期で利用する場合は、この辺りの設定を適当な値へ変更する事をオススメします。

設定変更して構築する場合は、下記手順で適用できます。

  • 事前に準備したサーバへログインし root 権限を取得します
% su -
Password:
#
  • スクリプトをダウンロード
# curl -O 'https://gist.github.com/ysaotome/6097172/raw/L2TP_IPSec_vpn_setup_for_centos65.sh'
  • スクリプトを変更
# vim L2TP_IPSec_vpn_setup_for_centos65.sh
  • スクリプトを実行
# bash L2TP_IPSec_vpn_setup_for_centos65.sh

おまけ

PPTPでVPNサーバを構築する(非推奨)

L2TP/IPsecでVPNサーバを作る時と同様に下記コマンドでPPTPを利用したVPNサーバの構築ができます。

PPTPはWindows XP等の古いOSからもアクセス可能な一方、接続速度が遅かったりしますので、個人的にはL2TP/IPSecがおすすめです。

# curl -L 'https://gist.github.com/ysaotome/6067899/raw/PPTP_vpn_setup_for_centos64.sh' | bash

Comments