keima's caprice diary

気付いたことをメモのように綴ります。なるべく義務っぽくならないように気まぐれに記録します。

LinuxをL2TP/IPsecクライアント兼NATルータにしてみる

■基本情報

OS : CentOS release 6.8 (Final)
IPsec Software : Linux Libreswan 3.15 (netkey) on 2.6.32-642.el6.i686
L2TP Software : xl2tpd-1.3.8

VPN接続情報(伏せ字

Target : [接続先 IP]
PSK : [事前共有鍵]
Account01 : [L2TPユーザ名]
password01 : [L2TPユーザ名に対応するPW ]

■ソフトウェアインストール

yum -y install openswan
rpm -Uvh https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel/6/i386/epel-release-6-8.noarch.rpm
yum -y install xl2tpd

ipsecコンフィグ調整

cp /etc/ipsec.conf /etc/ipsec.conf.org
vi /etc/ipsec.conf
---
# 以下2行のみ記述
config setup
include /etc/ipsec.d/*.conf
---

vi /etc/ipsec.d/ipsec.secrets
---
[自身がVPN接続先と通信する際に使うローカルIP] [接続先 IP] : PSK "事前共有鍵"
---

vi /etc/ipsec.d/connection.conf
---
# 2行目(authby行)以下は行頭にタブが必要
conn PEER_L2TP
authby=secret
pfs=no
rekey=no
keyingtries=3
type=transport
# left=%defaultroute
left=[自身がVPN接続先と通信する際に使うローカルIP]
leftprotoport=17/1701
right=接続先 IP
rightprotoport=17/1701
auto=add
---

cp /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.org
rm -rf /etc/xl2tpd/xl2tpd.conf ; vi /etc/xl2tpd/xl2tpd.conf
---
[lac L2TP1]
lns = [接続先 IP]
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd.conn-1
length bit = yes
redial = yes
redial timeout = 10
max redials = 3
---

vi /etc/ppp/options.xl2tpd.conn-1
---
name [L2TPユーザ名]
noauth
crtscts
mtu 1410
mru 1410
nodefaultroute
lock
proxyarp
logfile /var/log/xl2tpd.conn-1.log
---
echo '[L2TPユーザ名] * [L2TPユーザ名に対応するPW] *' >> /etc/ppp/chap-secrets
---
■NW設定変更

for line in `ls /proc/sys/net/ipv4/conf/*/send_redirects`; do echo 0 > $line ;done
for line in `ls /proc/sys/net/ipv4/conf/*/rp_filter`; do echo 0 > $line ;done
for line in `ls /proc/sys/net/ipv4/conf/*/accept_redirects`; do echo 0 > $line ;done
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sysctl -p

■ひとこと

ここまできたらL2TP over IPsec クライアントとしての設定はほぼ完成。
ここで、VPNクライアント兼NATルータになるLinuxのデフォルトルートを削除しておく。
なぜならLinuxVPN接続した後のLinuxとしてのデフォルトルートをVPN接続先にしておきたいから。

vi /etc/sysconfig/network-scripts/ifcfg-[任意のi/f名称]
-> "GATEWAY" 行を削除
/etc/init.d/network restart

■接続用スクリプト作成

vi startVpn.sh
---
service ipsec stop
service xl2tpd stop
service ipsec start
service xl2tpd start
sleep 5
ip route add [接続先 IP]/32 via 192.168.10.253
echo "c L2TP1" > /var/run/xl2tpd/l2tp-control
ipsec auto --up PEER_L2TP
sleep 5
route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -j ACCEPT

■切断用スクリプト作成

vi stopVpn.sh
---
echo "d L2TP1" > /var/run/xl2tpd/l2tp-control
ipsec auto --down PEER_L2TP
sleep 3
service ipsec stop
service xl2tpd stop
iptables -t nat -D POSTROUTING -o ppp0 -j MASQUERADE
iptables -D FORWARD -j ACCEPT
ip route del [接続先 IP]/32 via 192.168.10.253


iptables微調整(全開放

vi /etc/sysconfig/iptables
---
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
COMMIT

iptables再起動

/etc/init.d/iptables restart

■ルータ化設定

# 確認
grep "net.ipv4.ip_forward" /etc/sysctl.conf
# 変更
sed -i -e "s/net\.ipv4\.ip_forward = 0/net.ipv4.ip_forward = 1/" /etc/sysctl.conf
# 確認
grep "net.ipv4.ip_forward" /etc/sysctl.conf

■ /etc/rc.d/rc.local に echo 1 >/proc/sys/net/ipv4/ip_forward を追記

vi /etc/rc.d/rc.local
---
#!/bin/sh
echo 1 >/proc/sys/net/ipv4/ip_forward

■NETWORKファイル修正(Gateway無効化)

vi /etc/sysconfig/network
---
NETWORKING=yes
HOSTNAME=[任意]
FORWARD_IPV4=yes
GATEWAY=
GATEWAYDEV=

■APIPA無効

echo 'NOZEROCONF=yes' >> /etc/sysconfig/network

■ネットワーク再起動

/etc/init.d/network restart

準備は以上。

VPN接続する

bash startVpn.sh

VPN切断する

bash stopVpn.sh

いくつか他にもやりようはありそう。。。。