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

LinuxマシンをどこぞのVPNサーバーに接続したくてこれをやった。CentOS6用なのでCentOS7以降の場合はiptablesのくだりやネットワークサービス再起動のくだりが変わってくるかと。

基本情報

OSCentOS release 6.8 (Final)
IPSecソフトウェアLibreswan 3.15 (netkey) on 2.6.32-642.el6.i686
L2TPソフトウェアxl2tpd-1.3.8

VPN接続情報

Target接続先IP
PSK事前共有鍵
Account01L2TPユーザー名
Password01L2TPユーザーに対応するパスワード

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

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

IPSecコンフィグ修正(以下2行のみ記述

config setup
include /etc/ipsec.d/*.conf

IPSec事前共有鍵設定修正

[自身がVPN接続先と通信する際に使うローカルIP] [接続先 IP] : PSK "事前共有鍵"

IPSec接続設定修正

vi /etc/ipsec.d/connection.conf

IPSec接続設定内容(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

L2TP関連コンフィグ修正・新規作成

既存コンフィグバックアップ

cp /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.org

既存コンフィグ削除&新規コンフィグ作成

rm -rf /etc/xl2tpd/xl2tpd.conf ; vi /etc/xl2tpd/xl2tpd.conf

新規コンフィグ内容

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

PPP接続設定ファイル作成

vi /etc/ppp/options.xl2tpd.conn-1

PPP接続設定ファイル内容

name [L2TPユーザ名]
noauth
crtscts
mtu 1410
mru 1410
nodefaultroute
lock
proxyarp
logfile /var/log/xl2tpd.conn-1.log

PPP接続用認証ファイル作成

echo '[L2TPユーザ名] * [L2TPユーザ名に対応するPW] *' >> /etc/ppp/chap-secrets

Linuxのネットワーク設定修正

ルーティングの有効化

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のデフォルトルートを削除しておく。なぜならLinuxがVPN接続した後のLinuxとしてのデフォルトルートをVPN接続先にしておきたいから。

デフォルトゲートウェイ削除

ネットワークアダプタのコンフィグ修正

vi /etc/sysconfig/network-scripts/ifcfg-[任意のi/f名称]

ネットワークサービス再起動

/etc/init.d/network restart    # CentOS6
systemctl restart network      # CentOS7

VPN接続用スクリプト作成

touch startVpn.sh
chmod 755 startVpn.sh
vi startVpn.sh

スクリプト内容

service ipsec stop
service xl2tpd stop
service ipsec start
service xl2tpd start
sleep 5
ip route add [接続先 IP]/32 via [Linux所属NWのゲートウェイ]
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

VPN切断用スクリプト作成

touch stopVpn.sh
chmod 755 stopVpn.sh
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 [Linux所属NWのゲートウェイ]

iptables全開放

設定ファイル修正

vi /etc/sysconfig/iptables

設定ファイル内容

: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

サービス再起動

/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

OS起動時にルーター化させる

vi /etc/rc.d/rc.local

/etc/rc.d/rc.localファイル内容

#!/bin/sh
echo 1 >/proc/sys/net/ipv4/ip_forward

デフォルトゲートウェイ削除

ネットワーク設定ファイル修正

vi /etc/sysconfig/network

ファイル内容

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

Leave a Comment