OpenVPN で VPN トンネル内に IPv6 を通す

とりあえず、Debian GNU/Linux 9 において、OpenVPN の VPN トンネル中で IPv6 を通すメモです。

基本的に「OpenVPN 設定メモ (Debian 7 Wheezy)」の項目が設定できていて (Debian 9 でもおおよそ同じです) 、サーバ側にはグローバル IPv6 が当たっていて、適切なフィルタリングが出来ているものと想定します。

■前提

  • VPN の内側で使用するネットワークは、ユニークローカルアドレス、「fd00:abcd:abcd:abcd::/64」、サーバの VPN 側 IPv6 は「fd00:abcd:abcd:abcd::1」を使うことにする。
  • 上記のメモの内容が Debian GNU/Linux 9 の OpenVPN パッケージで構築済みである。
  • 設定するサーバには IPv6 の接続性がある。

■設定

/etc/openvpn/server.conf に以下を追記します。

server-ipv6 fd00:abcd:abcd:abcd::1/64
push "route-ipv6 fd00:abcd:abcd:abcd::/64"
push "route-ipv6 2000::/3"
push "dhcp-option DNS DNSサーバのIPv6アドレス" # オプション

ip6tables で以下の様なルールを設定します。(設定内容はこのままコピペじゃなくて、実際の環境に合わせて下さい。)

ip6tables -A INPUT -i tun0 -s fd00:abcd:abcd:abcd::/64 -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A OUTPUT -o tun0 -d fd00:abcd:abcd:abcd::/64 -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A FORWARD -i tun0 -o ens3 -s fd00:abcd:abcd:abcd::/64 -d ::/0 -j ACCEPT
ip6tables -A FORWARD -i ens3 -o tun0 -s ::/0 -d fd00:abcd:abcd:abcd::/64 -j ACCEPT -m state --state ESTABLISHED,RELATED
ip6tables -t nat -A POSTROUTING -o ens3 -s fd00:abcd:abcd:abcd::/64 -d ::/0 -j MASQUERADE
ip6tables -A FORWARD -j DROP

上記を設定後、openvpn サーバを再起動させて、iPhone などのクライアントから OpenVPN で接続すると、VPN 側で IPv4 アドレスの他、IPv6 アドレスも付与されます。

■課題

当然ながら、IPv6 アドレスオンリーのサイトにも繋がるはずですが、なぜか一部画像が表示されなかったりという現象を確認しています。mtu の問題なのかなぁ、と思っているのですが、「OpenVPN Connect iOS FAQ」によれば、iOS の OpenVPN クライアントでは fragment パラメータを設定しているサーバには接続できないらしく、どうしたものかと考え中です。

OpenVPN 設定メモ (Debian 7 Wheezy)

OpenVZ (多分) の VPS を借りて、VPN サーバを立てようとしたのだけど、IPsec に必要なモジュールがロードされていなくて動作せず、他の VPN と言っても今さら PPTP は無いし、で探したところ、「OpenVPN」と言うものがあったので、それの設定メモ。

続きを読む

IPsec 、ややこしくてわかりにくい・・・

IPsec 関係で、以前書いた下記の 2 本のエントリを若干修正しました。

で、今何がわからないかというと、/etc/ipsec.conf での「ike」と「phase2alg」に設定すべき値です。

双方のパラメータに「aes-sha1;modp3072」を指定してあげると、認証または疑似乱乱数関数は SHA1 、暗号化は AES 、共通鍵暗号の鍵長は 128 となるはずなのですが、この組み合わせで接続できない端末からの接続はどうなるかなど、よくわかりません。

と言うか、上記の設定を行った VPN サーバに対して、Windows XP から接続に行くと、暗号化が 3DES とかになっているようなんですよね・・・。

上記のような事情があります故、該当エントリーは修正が度々入るかもしれません。(いやきっと入るだろう)

・2012/08/28 追記

上記は、Windows XP は IPsec において、そもそも AES に対応していないし、たとえ /etc/ipsec.conf で「aes-sha1;modp3072」と指定していても AES ではなく、3DES で暗号化するため modp2048 で接続するみたい、だと理解した。(事にする)

Debian GNU/Linux で L2TP / IPsec を使用する VPN サーバを設定する (サーバ側で NAPT する場合)

先日は LAN 内のサーバにおいて、その LAN に VPN クライアントを接続する、「Debian GNU/Linux で L2TP / IPsec を使用する VPN サーバを設定する (サーバ側で NAPT しない場合)」という設定を行いましたが、今回は、自 VPS でグローバル IPv4 が一つだけあたっていて、LAN 側が存在しない場合の設定を行ってみます。

■注意点

  • クライアントと VPN サーバ間が暗号化されます。
  • 暗号化されていることは tcpdump で確認したまでとなり、実際に十分な強度で暗号化されているかは確認していません。
  • クライアント側の設定も確実に VPN 側にパケットが流れるように、よく確認して下さい。
  • 基本的に全開と設定はほぼ同じです。この例では、VPS などを借りていて、この VPS とクライアント間で VPN を張ります。つまり、外部へのネットワーク接続のうち、「クライアントと VPS 間のみ」が暗号化されるはずです。

■前提

  • 対象サーバは、単一のグローバル IPv4 アドレスを持っている事を想定。
  • VPN 側の仮想的なネットワークは 192.168.64.0/24 を想定。
  • 設定するサーバの VPN 側 IPv4 アドレスは 192.168.64.1 を想定。
  • 設定するサーバでは、ネームサーバが動作していて、VPN 側からの名前解決が出来る。
  • OS は Debian GNU/Linux 6.0 squeeze (AMD64) を利用。

■設定環境

  • OS : Debian GNU/Linux 6.0 (AMD64)
  • IPsec は事前共有鍵 (PSK) で認証。
  • L2TP は MS-CHAPv2 で認証。
  • L2TP サーバ名は l2tp とする。
  • サーバのグローバル IPv4 アドレス : aaa.bbb.ccc.ddd
  • サーバのグローバル IPv4 アドレスがあたっているインタフェース : eth0
  • サーバの VPN 側 IPv4 アドレス : 192.168.64.1
  • DNS サーバ : 192.168.64.1 (設定する VPS でネームサーバが動作している)
  • VPN クライアントに割り当てる IPv4 アドレス : 192.168.64.11 〜 192.168.64.20 (サーバ側では ppp0 〜 ppp9 のインタフェースと通信する)

例によって、MS-CHAPv2 で L2TP を認証しますが、これは先に IPsec によりネットワークが暗号化されている状態で行われるので外部から見えないから問題がない、と言う認識です。

■設定

サーバ側設定手順としては、以下の通りです。

・必要なパッケージをインストール

# apt-get install openswan xl2tpd

・ネットワークパラメータの設定

/etc/sysctl.conf ファイルに下記を設定します。

net.ipv4.ip_forward = 1		# パケットを転送可能とする。
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0

※ IPv4 があたっているインタフェース全部に対して設定します。

・設定を反映

上記で設定した内容を、実際に反映させます。

# sysctl -p

・openswan (IPsec) の設定

IPsec の設定を行います。
/etc/ipsec.conf を設定します。

version 2.0
config setup
	nat_traversal=yes
	virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
	oe=off
	protostack=netkey

conn L2TP-PSK-NAT
	rightsubnet=0.0.0.0/0
	also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
	forceencaps=yes
	authby=secret
	pfs=no
	auto=add
	keyingtries=3
	ike=aes-sha1;modp3072		# ike phase1 の設定 (暗号化アルゴリズムは AES 、ハッシュアルゴリズムは SHA1 、Diffie-Hellman グループは 15 (3,072bit))
	phase2=esp					# ike phase2 の設定 (セキュリティプロトコルは ESP)
	phase2alg=aes-sha1;modp3072	# ike phase2 の設定 (暗号化アルゴリズムは AES 、ハッシュアルゴリズムは SHA1 、Diffie-Hellman グループは 15 (3,072bit))
	rekey=no
	ikelifetime=8h
	keylife=1h
	type=transport
	left=aaa.bbb.ccc.ddd		# 自サーバの「グローバル IPv4 アドレス (重要)」を設定する。
	leftprotoport=17/1701
	right=%any
	rightprotoport=17/%any
	# 以下は iOS クライアント向けの設定。
	dpddelay=40
	dpdtimeout=130
	dpdaction=clear

・openswan (IPsec) の事前共有鍵の設定

/etc/ipsec.secrets (root:root 600) を設定します。

aaa.bbb.ccc.ddd %any: PSK "PRESHAREDKEY"

※「PRESHAREDKEY」の内容は任意のものに変更する必要があります。
※ここでも、サーバのグローバル IPv4 アドレスの指定が必要です。

・openswan (IPsec) の再起動

# /etc/init.d/ipsec restart

・確認

openswan (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.28/K2.6.32-5-xen-amd64 (netkey)
Checking for IPsec support in kernel                        	[OK]
NETKEY detected, testing for disabled ICMP send_redirects   	[OK]
NETKEY detected, testing for disabled ICMP accept_redirects 	[OK]
Checking that pluto is running                              	[OK]
Pluto listening for IKE on udp 500                          	[OK]
Pluto listening for NAT-T on udp 4500                       	[OK]
Two or more interfaces found, checking IP forwarding        	[OK]
Checking NAT and MASQUERADEing                              
Checking for 'ip' command                                   	[OK]
Checking for 'iptables' command                             	[OK]
Opportunistic Encryption Support                            	[DISABLED]

・xl2tpd の設定

/etc/xl2tpd/xl2tpd.conf を設定します。

[global]

[lns default]
ip range = 192.168.64.11 - 192.168.64.20	; VPN クライアントに割り当てる IPv4 アドレスの範囲
local ip = 192.168.64.1						; 自サーバの「VPN 側 IPv4 アドレス (重要)」
length bit = yes
refuse chap = yes
require authentication = yes
name = l2tp
pppoptfile = /etc/ppp/l2tpd-options

・ppp の設定

/etc/ppp/l2tpd-options を設定します。

name l2tp			# /etc/xl2tpd/xl2tpd.conf で設定した name と合わせる
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
ms-dns 192.168.64.1	# DNS サーバの IPv4 アドレス
nodefaultroute
lock
nobsdcomp 
mtu 1280
mru 1280

※今回の用途では、proxyarp は不要

・xl2tpd の認証ファイルの設定

xl2tpd で接続する際の、アカウント情報を設定します。
/etc/ppp/chap-secrets (root:root 600) のファイルを設定します。

# client	server	secret		IP addresses
testuser	l2tp	"password"	*

※上記の例では、L2TP のアカウント「testuser」、パスワード「password」で設定しています。

・xl2tpd の再起動

# /etc/init.d/xl2tpd restart

・サーバ再起動時に Openswan IPsec を自動起動する

# insserv ipsec

・iptables のルールに以下を追加

# iptables -P FORWARD DROP
# iptables -A INPUT -p udp --dport 500  -i eth0 -d aaa.bbb.ccc.ddd -j ACCEPT
# iptables -A INPUT -p udp --dport 1701 -i eth0 -d aaa.bbb.ccc.ddd -j ACCEPT
# iptables -A INPUT -p udp --dport 4500 -i eth0 -d aaa.bbb.ccc.ddd -j ACCEPT
# iptables -A FORWARD -i ppp+ -o ppp+ -s 192.168.64.0/24 -d 192.168.64.0/24 -j ACCEPT
# iptables -A FORWARD -i ppp+ -o eth0 -s 192.168.64.0/24 -j ACCEPT
# iptables -A FORWARD -i eth0 -o ppp+ -d 192.168.64.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.64.0/24 -j MASQUERADE

※必要に応じて、上記の設定が恒常的に有効となるように何らかの方法で設定する。

■今回のはまりどころ

  • 「/etc/ipsec.conf」ファイルの「left=」に設定するのは、サーバのグローバル IPv4 アドレス。
  • lt2pd 関係の設定ファイルについては、VPN 側のプライベート IPv4 アドレス及びネットワーク

最初 /etc/ipsec.conf にプライベート側の 192.168.64.1 を書いてしまい、何故通信できないのかと悩みました。

Debian GNU/Linux で L2TP / IPsec を使用する VPN サーバを設定する (サーバ側で NAPT しない場合)

※ IP Masquerade をする場合は、「Debian GNU/Linux で L2TP / IPsec を使用する VPN サーバを設定する (サーバ側で NAPT する場合)」を参照下さい。

今まで、PPTP にて、VPN を設定していたのですが、「VPNなどで使われる認証プロトコル「MS-CHAPv2」、クラックされる | スラッシュドット・ジャパン セキュリティ」とのことで、PPTP では「MS-CHAPv2」をもろに使っているのでこれをやめて、L2TP / IPsec での VPN 設定を行いました。以下はその個人的な覚え書きです。

VPN クライアントの IPv4 アドレスが、その LAN のネットワーク内と同一ネットワーク内に存在するような設定となります。

例えば、自宅のルータで、IPsec (UDP/500 と UDP/4500 を LAN 内のサーバに通信できるようにしておいて、外部から自宅へ VPN 接続をする用途を想定しています。

■注意点

  • クライアントと VPN サーバ間が暗号化されます。
  • 暗号化されていることは tcpdump で確認したまでとなり、実際に十分な強度で暗号化されているかは確認していません。

■前提

  • ネットワーク内において、いくつかのプライベート IP アドレスが自由に使用できる事。
  • 今回は 192.168.1.0/24 な一般的な家庭内 LAN を想定。
  • 設定するサーバの IPv4 アドレスは 192.168.1.2 を想定。
  • VPN 側に割り当てられる IPv4 アドレスは、他の機器で使用されていない、されない事。
  • OS は Debian GNU/Linux 6.0 squeeze (PPC) を利用。
  • 設定が確認されたあとに、ルータ側で、UDP/500 と UDP/4500 を 192.168.1.2 に転送するように設定する。

■設定環境

  • OS : Debian GNU/Linux 6.0 (PPC)
  • IPsec は事前共有鍵 (PSK) で認証。
  • L2TP は MS-CHAPv2 で認証。
  • L2TP サーバ名は l2tp とする。
  • ネットワークアドレス : 192.168.1.0/24
  • デフォルトゲートウェイ : 192.168.1.1
  • DNS サーバ : 192.168.1.1
  • L2TP / IPsec サーバを設定するサーバ : 192.168.1.2 (インタフェースは eth0)
  • VPN クライアントに割り当てる IPv4 アドレス : 192.168.1.201 〜 192.168.1.210 (サーバ側では ppp0 〜 ppp9 のインタフェースと通信する)

なんで、今回問題となっている MS-CHAPv2 で L2TP を認証するのかですが、これは先に IPsec によりネットワークが暗号化されている状態で行われるので外部から見えないから問題がない、と言う認識です。

■設定

サーバ側設定手順としては、以下の通りです。

・必要なパッケージをインストール

# apt-get install openswan xl2tpd

・ネットワークパラメータの設定

/etc/sysctl.conf ファイルに下記を設定します。

net.ipv4.ip_forward = 1	# パケットを転送可能とする。
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0

※ IPv4 があたっているインタフェース全部に対して設定します。

・設定を反映

上記で設定した内容を、実際に反映させます。

# sysctl -p

・openswan (IPsec) の設定

IPsec の設定を行います。
/etc/ipsec.conf を設定します。(ほとんどサンプルで用意されている設定ファイル通り)

version 2.0
config setup
	nat_traversal=yes
	virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
	oe=off
	protostack=netkey

conn L2TP-PSK-NAT
	rightsubnet=0.0.0.0/0
	also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
	forceencaps=yes
	authby=secret
	pfs=no
	auto=add
	keyingtries=3
	ike=aes-sha1;modp3072		# ike phase1 の設定 (暗号化アルゴリズムは AES 、ハッシュアルゴリズムは SHA1 、Diffie-Hellman グループは 15 (3,072bit))
	phase2=esp					# ike phase2 の設定 (セキュリティプロトコルは ESP)
	phase2alg=aes-sha1;modp3072	# ike phase2 の設定 (暗号化アルゴリズムは AES 、ハッシュアルゴリズムは SHA1 、Diffie-Hellman グループは 15 (3,072bit))
	rekey=no
	ikelifetime=8h
	keylife=1h
	type=transport
	left=192.168.1.2			# 自サーバの IPv4 アドレスを設定する。
	leftprotoport=17/1701
	right=%any
	rightprotoport=17/%any
	# 以下は iOS クライアント向けの設定。
	dpddelay=40
	dpdtimeout=130
	dpdaction=clear

・openswan (IPsec) の事前共有鍵の設定

/etc/ipsec.secrets (root:root 600) を設定します。

192.168.1.2 %any: PSK "PRESHAREDKEY"

※「PRESHAREDKEY」の内容は任意のものに変更する必要があります。
※ここでも、サーバの IPv4 アドレスの指定が必要です。

・openswan (IPsec) の再起動

# /etc/init.d/ipsec restart

・確認

openswan (IPsec) が動作できるように設定されているか確認を行います。

# ipsec verify
Version check and ipsec on-path                             	[OK]
Linux Openswan U2.6.28/K2.6.32-5-powerpc (netkey)
Checking for IPsec support in kernel                        	[OK]
Hardware RNG detected, testing if used properly             	[FAILED]

  Hardware RNG is present but 'rngd' or 'clrngd' is not running.
  No harware random used!

NETKEY detected, testing for disabled ICMP send_redirects   	[OK]
NETKEY detected, testing for disabled ICMP accept_redirects 	[OK]
Checking that pluto is running                              	[OK]
Pluto listening for IKE on udp 500                          	[OK]
Pluto listening for NAT-T on udp 4500                       	[OK]
Two or more interfaces found, checking IP forwarding        	[OK]
Checking NAT and MASQUERADEing                              	[OK]
Checking for 'ip' command                                   	[OK]
Checking for 'iptables' command                             	[OK]
Opportunistic Encryption Support                            	[DISABLED]

※私の環境では「Hardware RNG detected, testing if used properly」が「FAILED」表示となりましたが、特に問題なく暗号化通信が出来ています。

・xl2tpd の設定

/etc/xl2tpd/xl2tpd.conf を設定します。

[global]

[lns default]
ip range = 192.168.1.201 - 192.168.1.210	; VPN クライアントに割り当てる IPv4 アドレスの範囲
local ip = 192.168.1.2						; 自サーバの IPv4 アドレス
length bit = yes
refuse chap = yes
require authentication = yes
name = l2tp
pppoptfile = /etc/ppp/l2tpd-options

・ppp の設定

/etc/ppp/l2tpd-options を設定します。

name l2tp	# /etc/xl2tpd/xl2tpd.conf で設定した name と合わせる
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
ms-dns 192.168.1.1	# DNS サーバの IPv4 アドレス
proxyarp
nodefaultroute
lock
nobsdcomp 
mtu 1280
mru 1280

・xl2tpd の認証ファイルの設定

xl2tpd で接続する際の、アカウント情報を設定します。
/etc/ppp/chap-secrets (root:root 600) のファイルを設定します。

# client	server	secret		IP addresses
testuser	l2tp	"password"	*

※上記の例では、L2TP のアカウント「testuser」、パスワード「password」で設定しています。

・xl2tpd の再起動

# /etc/init.d/xl2tpd restart

基本的に、これで通信が可能になっています。

・サーバ再起動時に Openswan IPsec を自動起動する

# insserv ipsec

以前までは update-rc.d で出来ていたのですが、

# update-rc.d ipsec start 90 2 3 4 5 . stop 1 0 1 6 .
update-rc.d: using dependency based boot sequencing

とか出たので、検索したら、insserv を使うようです。

■参考にさせて頂いたサイト

下記のサイトを参考にさせて頂きました。ありがとうございます。

■その他

上記の設定については、一応、tcpdump 等で暗号化されていることは確認しましたが、とりあえず動いた程度で見て頂けるようにお願いします。

IPsec は今まで何度もチャレンジしていて、その都度挫折していたのですが、今回、設定が出来てまずは良かったと思います。L2TP / IPsec がややこしいのは、複数のプロトコルを組み合わせて、VPN を実現しているところにあるし、結果としてやたら慣れていない設定項目が多くなってしまうからかなぁ、と言うのが印象です。

あとは、Debian GNU/Linux 6.0 の起動用のシンボリックリンクの張り方が変わっていたりして、こちらも勉強になりました。

参考にさせて頂いたサイトの情報がなければ、設定できなかったと思います。ありがとうございます。

間違いなどがあればコメント等を頂けると嬉しいです。

続きを読む

Debian GNU/Linux での pptpd 設定 (サーバ側で NAPT しない場合)

※ VPS 等で pptpd を設定し、nat する場合は、「Debian GNU/Linux での pptpd 設定 (サーバ側で NAPT する場合)」を参照下さい。

以前、VPS において、pptpd の設定を行ったが、これはグローバル IPv4 の割り当てが 1 個のみで、VPN クライアントはこの IPv4 を共有して出ていくように、VPN 用のプライベートネットワークから NAPT (IP Masquerade) する構成だった。

今回は、PPTP クライアントの IPv4 アドレスが、その LAN のネットワーク内と同一ネットワーク内に存在するような設定を行ってみた。

例えば、自宅のルータで、GRE と TCP 1723 を LAN 内のサーバに通信できるようにしておいて、外部から自宅へ VPN 接続をする用途を想定している。

■前提

  • ネットワーク内において、いくつかのプライベート IP アドレスが自由に使用できる環境である。
  • 今回は 192.168.1.0/24 な一般的な家庭内 LAN を想定。
  • VPN 側に割り当てられる IPv4 アドレスは、他の機器で使用されていない、されない事。
  • OS は Debian GNU/Linux 6.0 squeeze を利用した。
  • PPTP サーバ名は localpptpd とする。

■想定するネットワーク

  • ネットワークアドレス : 192.168.1.0/24
  • デフォルトゲートウェイ : 192.168.1.1
  • DNS サーバ : 192.168.1.1
  • pptpd を設定するサーバ : 192.168.1.2 (インタフェースは eth0)
  • VPN クライアントに割り当てる IPv4 アドレス : 192.168.1.201 ~ 192.168.1.210 (サーバ側では ppp0 ~ ppp9 のインタフェースと通信する)

■設定

サーバ側設定手順としては、以下の通り。

・pptpd をインストール
# apt-get install pptpd

・/etc/pptpd.conf を修正

option /etc/ppp/pptpd-options
logwtmp
localip 192.168.1.2
remoteip 192.168.1.201-210

※ localip はサーバ自身の eth0 の IPv4 アドレスを指定する。
※ remoteip には、VPN クライアントに割り当てる IPv4 アドレスを指定する。

・/etc/ppp/pptpd-options を修正

name localpptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 192.168.1.1 # DNS サーバを指定
proxyarp
nodefaultroute
lock
nobsdcomp
mtu 1280
mru 1280

※ mtu と mru の指定をしておかないと、接続できないサイトなどが出る可能性がある。

・/etc/ppp/chap-secrets に PPTP 接続するアカウントを設定

ユーザ名 localpptpd パスワード *

※上記のような書式で指定する。

・pptpd を再起動
# /etc/init.d/pptpd restart

・iptables のルールに以下を追加。

# iptables -P FORWARD DROP
# iptables -A INPUT -i eth0 -p 47 -d 192.168.1.2 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp –dport 1723 -d 192.168.1.2 -j ACCEPT
# iptables -A INPUT -i ppp+ -j ACCEPT
# iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
# iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
# iptables -A FORWARD -i ppp+ -o ppp+ -j ACCEPT

※必要に応じて、上記の設定が恒常的に有効となるように何らかの方法で設定する。

・/etc/sysctl.conf を修正

net.ipv4.ip_forward = 1

を追加。

・/etc/sysctl.conf の設定内容を有効とする
# sysctl -p

・必要に応じて、pptpd への接続制限
/etc/hosts.allow, /etc/hosts.deny にて pptpd への接続制限を設定。

■結果

以下の通り、一応正常に通信できたことを確認。

  • 自宅ルータ側で、GRE プロトコルと、TCP 1723 を今回設定した自宅サーバにスルーする様に設定。
  • iPhone でクライアント側設定し、3G 経由で自宅ルータの IPv4 アドレス宛 (自宅サーバ) サーバ側に、PPTP 接続が行えることを確認。
  • その上で、自宅 LAN 内の機器にアクセス可能であることを確認。
  • さらに、自宅ルータに当たっている IPv4 アドレスから、インターネットへ出て行っていることを確認。
  • VPN 接続されている機器同士での ping 疎通が出来ていることを確認。

・追記 (2012/08/02)

VPNなどで使われる認証プロトコル「MS-CHAPv2」、クラックされる | スラッシュドット・ジャパン セキュリティ」の通り、PPTP で用いられる認証プロトコル、「MS-CHAPv2」がクラックされたとのことですので、この内容での設定については、強く非推奨とします。

Debian GNU/Linux での pptpd 設定 (サーバ側で NAPT する場合)

※自宅サーバ等で pptpd を設定し、サーバ側で NAPT する必要が無い場合は、「Debian GNU/Linux での pptpd 設定 (サーバ側で NAPT しない場合)」を参照下さい。

・・・

pptpd の設定で混乱して悔しいので、再度設定してみたメモ。

とは言っても、ほとんど「さくらのVPSでiPhone用の野良WiFi通信傍受対策のPPTPサーバ(VPN)を設定したメモ – nori_no のメモ」を参考にさせて頂いた。

今回の設定は NAPT (IP Masquerade) する場合。(VPN 側ネットワークからの通信は、サーバのグローバル IPv4 アドレスである、aaa.bbb.ccc.ddd を経由してインターネットに出ていく)

※以前、混乱した原因は、NAPT する場合とそうでない場合がごっちゃになったからだと思う。

■前提

  • WAN 側インタフェースは eth0 でグローバル IPv4 アドレスは aaa.bbb.ccc.ddd
  • VPN 側インタフェースは ppp0 ~ 9 で IPv4 アドレスは 192.168.64.1
  • VPN クライアント側に当てる IPv4 アドレスは 192.168.64.11 ~ 192.168.64.20
  • OS は Debian GNU/Linux 6.0 squeeze
  • PPTP サーバ名は pptpd
  • DNS サーバは PPTP サーバ上で動作しており、VPN 側ネットワークからの問い合わせに応答する様に設定しているものとする

■設定

サーバ側設定手順としては、以下の通り。

・pptpd をインストール
# apt-get install pptpd

・/etc/pptpd.conf を修正

option /etc/ppp/pptpd-options
logwtmp
localip 192.168.64.1
remoteip 192.168.64.11-20

※ localip はサーバ自身の IPv4 アドレスではなく、VPN 側の PPTP サーバのもの。(任意のプライベート IPv4 アドレス)
※前回は、ここを取り違えていた・・・。

・/etc/ppp/pptpd-options を修正

name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 192.168.64.1
nodefaultroute
lock
nobsdcomp
mtu 1280 # 2012/01/14 修正
mru 1280 # 2012/01/14 追記

※ proxyarp は必要ない。(これはおそらく、クライアント側にあてるネットワークと PPTP サーバ外側のネットワークを LAN 上において同一にする場合に必要だと思う。)

・/etc/ppp/chap-secrets に PPTP 接続するアカウントを設定

ユーザ名 pptpd パスワード *

※上記のような書式で指定する。

・pptpd を再起動
# /etc/init.d/pptpd restart

・iptables のルールに以下を追加。
# iptables -P FORWARD DROP
# iptables -A INPUT -i eth0 -p tcp –dport 1723 -d aaa.bbb.ccc.ddd -j ACCEPT
# iptables -A INPUT -i eth0 -p 47 -d aaa.bbb.ccc.ddd -j ACCEPT
# iptables -A INPUT -i ppp+ -p udp –dport 53 -d 192.168.64.1 -j ACCEPT
# iptables -A FORWARD -i ppp+ -o eth0 -s 192.168.64.0/24 -j ACCEPT
# iptables -A FORWARD -i eth0 -o ppp+ -d 192.168.64.0/24 -m state –state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.64.0/24 -j MASQUERADE
※必要に応じて、上記の設定が恒常的に有効となるように何らかの方法で設定する。

・/etc/sysctl.conf を修正

net.ipv4.ip_forward = 1

を追加。

・/etc/sysctl.conf の設定内容を有効とする
# sysctl -p

・pptpd への接続制限
/etc/hosts.allow, /etc/hosts.deny にて pptpd への接続制限を設定。

■結果

以下の通り。

  • iPhone でクライアント側設定 → ちゃんと aaa.bbb.ccc.ddd を経由してインターネットへ接続している。
  • Mac OS X でクライアント側設定 → ちゃんと aaa.bbb.ccc.ddd を経由してインターネットへ接続している。(ただし、ppp0 インタフェースの MTU を 1200 程度に設定する必要有り)
    これは、下記の「/etc/ppp/pptpd-options」に「mtu 1280」および「mru 1280」の指定を追加することで解決した。

■修正

  • 2012/01/14
    タイトルを「Net: 再度 pptpd を設定」から改題。
    「/etc/ppp/pptpd-options」において
    ・mtu 1280
    ・mru 1280
    の指定を追加した。(一部のサイトが VPN 経由で接続できなかったため。)

■追記 (2012/08/02)

VPNなどで使われる認証プロトコル「MS-CHAPv2」、クラックされる | スラッシュドット・ジャパン セキュリティ」の通り、PPTP で用いられる認証プロトコル、「MS-CHAPv2」がクラックされたとのことですので、この内容での設定については、強く非推奨とします。