YAMAHAのルーターRTX1200でL2TP/IPsecでVPNできるようにしたので、その方法をここにメモしておきます。ちなみに端末はiPhoneです。

設定内容を書く前に、今回のパケットの構成を簡単に記載します。プロコトルは先ほどご説明したとおり、L2TP/IPsecです。


まず送りたいパケットは上記のとおりとします。ここではTCPヘッダと書いてありますが、UDPヘッダかもしれません。


認証やIPアドレス通知に便利なプロトコルであるPPPを使います。ただし、PPPはその名のとおり、1対1の通信で使われることを想定されているプロトコルですので、L2TPでトンネリングします。L2TPヘッダとUDPヘッダ(ポート番号1701)がつきます。


ここでは説明を割愛しておりますが、この段階までにIKEプロトコルで暗号化するための共通鍵をお互いに(今回の場合だとiPhoneとRTX1200同士)交換していることが前提となります。そしてその鍵でパケットを暗号化します。L2TPは暗号化の仕様がないので、この作業が必要になります。

まず、ESPヘッダをつけます。このヘッダには、SA(IPSecのトンネル)を識別するための番号のようなもの(SPI)が入っております。

そして、ESPトレーラーをつけます。これは主に暗号化対象のデータを固定長にするためのパディングデータが入っています。暗号化アルゴリズムが求める長さのデータにしなければならないらしいです。

次は、IKEで交換した認証用のアルゴリズム及び認証用の鍵で、上記の「認証範囲」で示されている範囲のデータのダイジェストを作成して、ESP認証データとして、パケットの一番後ろに付与します。パケットが途中で改ざんされていないかどうかを対向の機器で確認するために使います。

最後に、IKEで交換した暗号アルゴリズムと鍵で、パケットを暗号化します。暗号化の範囲は、上記のとおりです。もちろんESPヘッダは暗号化の対象に含まれません。

ちなみに、今回はL2TPヘッダでトンネリングしているため、IPSecはトランスポートモード(ESPヘッダとUDPヘッダの間にIPヘッダが入らない)で動作します。


対向機器(今回の場合では、iPhoneとRTX1200)のIPアドレスが入ったIPヘッダとUDPヘッダがつきます。

このUDPヘッダはNAT Traversal用のもので、ポート番号は500です。IPSecの暗号化で使われるESPはトランスポート層のプロトコルで、TCPやUDPのようにポート番号を持ちません。ただし、NATをするためにはポート番号は必須です。ポート番号で送信元IPアドレスの変換を行うためです。つまり、ESPヘッダだけでは、NAT環境で通信が出来ません。この現象を回避するためにESPをUDPでさらにカプセル化します。これをNAT Traversalと言います。

以上が、今回のVPNでやりとりするパケットの構成でした。次は実際の設定ファイルを書きます。以下のとおりになります。

ip route default gateway pp 1
ip filter source-route on
ip filter directed-broadcast on
vlan port mapping lan1.1 vlan1
vlan port mapping lan1.2 vlan1
vlan port mapping lan1.3 vlan1
vlan port mapping lan1.4 vlan1
vlan port mapping lan1.5 vlan2
vlan port mapping lan1.6 vlan3
vlan port mapping lan1.7 vlan3
vlan port mapping lan1.8 vlan4
lan type lan1 port-based-option=divide-network
ip vlan1 address 192.168.1.1/24
ip vlan2 address 192.168.2.1/24
ip vlan2 proxyarp on
ip vlan3 address 192.168.3.1/24
ip vlan4 address 192.168.4.1/24
pp select 1
 pp always-on on
 pppoe use lan2
 pp auth accept pap chap
 pp auth myname (PPPoEユーザー名) (PPPoEパスワード)
 ppp lcp mru on 1454
 ppp ipcp msext on
 ppp ccp type none
 ip pp address (プロバイダから与えられた固定IPアドレス)
 ip pp mtu 1454
 ip pp secure filter in 1020 1030 200080 200081 200082 200083 2000
 ip pp secure filter out 1010 1011 1012 1013 1014 1015 3000 dynamic 100 101
 ip pp nat descriptor 1
 pp enable 1
pp select anonymous
 pp bind tunnel1
 pp auth request chap-pap
 pp auth username (L2TPのユーザー名) (L2TPのパスワード)
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ip pp remote address pool 192.168.2.100-192.168.2.150
 ip pp mtu 1258
 pp enable anonymous
tunnel select 1
 tunnel encapsulation l2tp
 ipsec tunnel 101
  ipsec sa policy 101 1 esp aes-cbc sha-hmac
  ipsec ike keepalive use 1 off
  ipsec ike local address 1 192.168.2.1
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 (事前共有鍵)
  ipsec ike remote address 1 any
 l2tp tunnel disconnect time off
 l2tp keepalive use on 10 3
 l2tp keepalive log on
 l2tp syslog on
 ip tunnel tcp mss limit auto
 tunnel enable 1
ip filter 1010 reject * * udp,tcp 135 *
ip filter 1011 reject * * udp,tcp * 135
ip filter 1012 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 1013 reject * * udp,tcp * netbios_ns-netbios_ssn
ip filter 1014 reject * * udp,tcp 445 *
ip filter 1015 reject * * udp,tcp * 445
ip filter 1020 reject 192.168.2.0/24 *
ip filter 1030 pass * 192.168.2.0/24 icmp
ip filter 1040 reject * 192.168.1.0/24
ip filter 1041 reject * 192.168.2.0/24
ip filter 1042 reject * 192.168.4.0/24
ip filter 2000 reject * *
ip filter 3000 pass * *
ip filter 200080 pass * 192.168.2.1 esp * *
ip filter 200081 pass * 192.168.2.1 udp * 500
ip filter 200082 pass * 192.168.2.1 udp * 4500
ip filter 200083 pass * 192.168.2.1 udp * 1701
ip filter dynamic 100 * * tcp
ip filter dynamic 101 * * udp
nat descriptor type 1 masquerade
nat descriptor address outer 1 (プロバイダから与えられた固定IPアドレス)
nat descriptor masquerade static 1 1 192.168.2.1 esp
nat descriptor masquerade static 1 2 192.168.2.1 udp 500
nat descriptor masquerade static 1 3 192.168.2.1 udp 4500
ipsec auto refresh on
ipsec transport 1 101 udp 1701
syslog notice off
syslog debug on
dhcp service server
dhcp scope 1 192.168.2.200-192.168.2.254/24
dhcp scope option 1 dns=192.168.1.2
dns server pp 1
dns private address spoof on
l2tp service on

上記の中から、VPNの設定に関係のありそうなものを抜粋して説明します。

ip vlan2 address 192.168.2.1/24
ip vlan2 proxyarp on

最初、この設定が入っていないせいで、VPNはつながるのだけど、内部の端末と全然通信が出来ませんでした(´・ω・`)

VPNクライアント(今回の場合で言えばiPhone)は、通信したい端末のMACアドレスがわからない場合、通常のLANと同様、ARPリクエストを発行します。そのARPリクエストはL2TPによってカプセル化されて、RTX1200に届きます。そして、このARPリクエストを内部のLANに投げたいのですが、このproxyarpの設定がonになっていないと、内部のLANにARPリクエストを投げてくれないらしいです。つまり、通信したい端末のMACアドレスがわかることができません。なので、この設定が必要なのだと理解してます、たぶん。

ちなみにこの環境では、ポートベースVLANで管理しているので、上記のような設定になりますが、ポートベースVLANを使ってない環境では、この限りではありません。

 ip pp secure filter in 1020 1030 200080 200081 200082 200083 2000

ESP(プロトコル番号 50)、IKE/UDP(ポート番号 500)、NAT Traversal/UDP(ポート番号 4500)、L2TP/UDP(ポート番号 1701)をインターネット側の入り口のインターフェースから許可するための設定です。後述するフィルタ番号200080、200081、200082、200083で許可設定が定義されています。

pp select anonymous
 pp bind tunnel1

L2TPでPPPで認証する際の設定になります。後から作成するL2TPトンネルと、このPPPの設定を紐付ける設定になります。

 pp auth request chap-pap

クライアント(iPhone)にPAPもしくはCHAP認証を許可します。

 pp auth username (L2TPのユーザー名) (L2TPのパスワード)

L2TPのユーザー名とパスワードになります。iPhoneのL2TPの設定画面の「アカウント」「パスワード」に入力する値となります。

 ppp ipcp ipaddress on

IPCPによるIPアドレス通知をONにします。これにより、端末に付与するIPアドレスが通知されます。

 ppp ipcp msext on

端末にDNSサーバーやWINSサーバーのIPアドレスを通知できるようになります。

 ip pp remote address pool 192.168.2.100-192.168.2.150

先ほどのIPCPの設定で通知するアドレスの範囲を決めます。この場合は、192.168.2.100から192.168.2.150の範囲でランダムにIPアドレスを割り当てます。

 ip pp mtu 1258

ヤマハルーターでは、トンネルインタフェースのMTUの初期値が1280byteに設定されているそうです。なのでMTUは以下のとおりになります。

トンネルインタフェースのMTUデフォルト値(1280byte) – (UDPヘッダ長(8byte) + L2TPヘッダ長(12byte) + PPPヘッダ長(2byte)) = 1258byte

 pp enable anonymous

このPPインターフェースを有効にする設定です。

tunnel select 1
 tunnel encapsulation l2tp

L2TPのトンネルを作成する設定です。

 ipsec tunnel 101

L2TPのトンネルをIPSecで暗号化しますよという設定です。

  ipsec sa policy 101 1 esp aes-cbc sha-hmac

暗号化プロトコルにESPを用い、暗号アルゴリズムはaes-cbc、認証アルゴリズムはsha-hmacにするという設定です。

  ipsec ike keepalive use 1 off

IPSecのKeep Aliveをオフにします。

  ipsec ike local address 1 192.168.2.1

RTX1200のルータ側のインターフェースのアドレスを設定します。

  ipsec ike nat-traversal 1 on

先ほど説明したNAT Traversalをオンにします。この設定をしないと、NAT環境からVPN出来ません。

  ipsec ike pre-shared-key 1 (事前共有鍵)

IPSecの事前共有鍵になります。128文字までOKですので、できるだけ長いものにします。

  ipsec ike remote address 1 any

接続するクライアントのIPアドレスを設定します。今回はiPhoneでIPアドレスは不定ですので、anyとします。

 l2tp tunnel disconnect time off

L2TPがパケット無送信時に自動切断されないようにします。

 l2tp keepalive use on 10 3

L2TP キープアライブを使用します。10秒毎にキープアライブのパケットを投げて3回無応答だったら再接続します。

 l2tp keepalive log on

キープアライブのログを出力するようにします。

 l2tp syslog on

L2TP通信のログを出力するようにします。

 ip tunnel tcp mss limit auto

端末からのMSS通知を書き換えて、通信可能な最小のMSSサイズへ調整できるようにします。

 tunnel enable 1

L2TPトンネルを有効にします。

ip filter 200080 pass * 192.168.2.1 esp * *
ip filter 200081 pass * 192.168.2.1 udp * 500
ip filter 200082 pass * 192.168.2.1 udp * 4500
ip filter 200083 pass * 192.168.2.1 udp * 1701

先ほどインターネット側の入り口のインターフェースに定義したフィルタの設定です。ESP(プロトコル番号 50)、IKE/UDP(ポート番号 500)、NAT Traversal/UDP(ポート番号 4500)、L2TP/UDP(ポート番号 1701)になります。フィルタよりNATから先に適用されるので、宛先アドレスはRTX1200の内部のインターフェースになります。

nat descriptor masquerade static 1 1 192.168.2.1 esp
nat descriptor masquerade static 1 2 192.168.2.1 udp 500
nat descriptor masquerade static 1 3 192.168.2.1 udp 4500

IPマスカレードの設定です。ESP、IKE、L2TPのパケットが来たら、RTX1200の内部のインターフェースのアドレスに送るように設定しています。

ipsec auto refresh on

IPSecによる鍵交換を行うようにする設定です。

ipsec transport 1 101 udp 1701

NAT Traversalを有効にする設定です。

次にiPhoneの設定になります。

iPhoneのホーム画面から「設定」→「一般」→「VPN」→「VPN構成を追加」で「タイプ」を「L2TP」を選択します。すると以下のような画面になります。

それぞれの項目に以下のように入力します。
説明:わかりやすい名前
サーバ:プロバイダから割り当てられたIPアドレスもしくはホスト名
アカウント:L2TPのユーザー名
RSA SecureID:オフ
パスワード:L2TPのパスワード
シークレット:事前共有鍵
すべての信号を送信:オン

以上で設定は終了になります。

今回一番ハマったのは、RTX1200のファームが古くて、NAT Traversalが使えなくて、VPN張れませんでした。NAT Traversalの設定コマンドを打ってもエラーにならなかったので、全然気づきませんでした。ログ見てもよくわからなかったし(´・ω・`)