Help us understand the problem. What is going on with this article?

linuxでVPNサーバ

More than 5 years have passed since last update.

はじめに

家の外から自宅のマシンやサーバにアクセスしたいなぁと思って調べていたら
VPN(L2TP/IPsec)という方法で実現出来そうだったので構築してみました。
その時の構築手順のメモ。

環境について

OS

CentOS 6.5

インストールするソフトウェア

libreswan
xl2tpd

その他

下記の手順は全て root ユーザで実行しています。

1.外部リポジトリの追加

libreswan、xl2tpd はCentOSのデフォルトのリポジトリには含まれていないので
追加リポジトリ(epel)を設定します。

# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

yumコマンドを使った時にデフォルトではepelを参照しない様に無効化しておく。

/etc/yum.repos.d/epel.repo
[epel]
enabled=1
↓に修正
enabled=0

2.libreswan xl2tpd をインストール

以下のコマンドでインストール。

# yum -y install --enablerepo=epel libreswan xl2tpd lsof

3.設定ファイルの修正

xl2tpdの設定

l2tp接続する際の動作(認証やIP割当)に関する設定

/etc/xl2tpd/xl2tpd.conf
[lns default]
ip range = 192.168.1.128-192.168.1.254
local ip = 192.168.1.99
↓に修正(各自の環境に合わせる)
ip range = 192.168.1.50-192.168.1.100
local ip = 192.168.1.49

↓コメント解除(行頭の ; 削除)
require chap = yes

各項目の説明

・ip range
 VPNクライアントへ割り振るIPアドレス範囲を指定
・local ip
 サーバ自身のIPアドレスを設定
・require chap
 chapによる認証情報暗号化を設定

トンネリングに関する設定

/etc/ppp/options.xl2tpd
ms-dns  8.8.8.8
↓に修正(各自の環境に合わせる)
ms-dns  192.168.1.1

mtu 1280
mru 1280
↓に修正(各自の環境に合わせる)
mtu 1240
mru 1240

↓追記
netmask 255.255.255.0
persist
require-mschap-v2
logfile /var/log/xl2tpd.log

MTU/MRUの設定は、各環境で数値が変わります。
「ping mtu 測定」等でググって、最適な値を調べて下さい。

ログファイルを作っておく

# touch /var/log/xl2tpd.log

ipsecの設定

/etc/ipsec.conf
#version 2
#plutodebug=none
#klipsdebug=none
virtual_private=%v4:10.0.0.0/8,%v4:・・・(中略)
#include /etc/ipsec.d/*.conf
↓に修正
version 2
plutodebug=none
klipsdebug=none
virtual_private=%v4:192.168.1.0/24
include /etc/ipsec.d/*.conf
/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
  #iOS用の設定
  dpddelay=10
  dpdtimeout=20
  dpdaction=clear
  #iOS用の設定 ここまで
  authby=secret
  pfs=no
  auto=add
  keyingtries=3
  rekey=no
  ikelifetime=8h
  keylife=1h
  type=transport
  left=%defaultroute
  leftprotoport=17/1701
  right=%any
  rightprotoport=17/%any

事前共有鍵の設定

/etc/ipsec.d/default.secrets
: PSK "keyword"

管理者以外は操作ができないように設定

# chmod 600 /etc/ipsec.d/default.secrets

ユーザIDとパスワードの設定

/etc/ppp/chap-secrets
"user1" * "password1" *

管理者以外は操作ができないように設定

# chmod 600 /etc/ppp/chap-secrets

ipsecサービスとl2tpサービスの起動と自動起動設定

# service xl2tpd start
# chkconfig xl2tpd on
# service ipsec start
# chkconfig ipsec on

4.その他の環境設定

SELinuxの無効化

/etc/sysconfig/selinux
SELINUX=enforcing
↓に修正
SELINUX=disabled

カーネルパラメータの変更

ipフォワードを有効化
ipリダイレクトを無効化
rp_filterの無効化

/etc/sysctl.conf
net.ipv4.ip_forward = 1 ←修正

以下は追記
net.core.xfrm_larval_drop = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0

iptablesの設定

/etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:528]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i ppp+ -j ACCEPT
-A FORWARD -o ppp+ -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

設定内容の確認

# ipsec verify

↓みたいになってればOK

Verifying installed system and configuration files

Version check and ipsec on-path                     [OK]
Libreswan 3.12 (netkey) on 2.6.32-431.el6.x86_64
Checking for IPsec support in kernel                [OK]
 NETKEY: Testing XFRM related proc values
         ICMP default/send_redirects                [OK]
         ICMP default/accept_redirects              [OK]
         XFRM larval drop                           [OK]
Pluto ipsec.conf syntax                             [OK]
Hardware random device                              [N/A]
Checking rp_filter                                  [OK]
Checking that pluto is running                      [OK]
 Pluto listening for IKE on udp 500                 [OK]
 Pluto listening for IKE/NAT-T on udp 4500          [OK]
 Pluto ipsec.secret syntax                          [OK]
Checking 'ip' command                               [OK]
Checking 'iptables' command                         [OK]
Checking 'prelink' command does not interfere with FIPSChecking for obsolete ipsec.conf options             [OK]
Opportunistic Encryption                            [DISABLED]

ダメな例
こういうのが出てたら、設定ミスがないか見直す

Checking rp_filter                                  [ENABLED]
 /proc/sys/net/ipv4/conf/default/rp_filter          [ENABLED]
 /proc/sys/net/ipv4/conf/lo/rp_filter               [ENABLED]
 /proc/sys/net/ipv4/conf/eth0/rp_filter             [ENABLED]
Opportunistic Encryption                            [DISABLED]

5.クライアントの設定(iPhone)

設定 -> 一般 -> VPN -> VPN構成を追加...

image.jpg

シークレットには [/etc/ipsec.d/default.secrets] の設定値を
アカウントとパスワードには[/etc/ppp/chap-secrets] の設定値を入力して保存。

設定後、VPNをonにして、iPhoneの右上に[VPN]の文字が出れば成功。

以上

mell3210
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away