EdgeRouter X – 8. 自宅と実家の2つの LAN を拠点間 VPN でつなぐ ( IPsec )

続いて IPsec での拠点間 VPN ( site-to-site VPN ) の設定です。

EdgeRouter のヘルプ等を見るとまず始めに出てくるのがサブネット方式の設定です。この設定は簡単で手軽に2つの LAN を相互に通信できるようになりますが、この設定はルーティングできるトンネルがないので、これだけでは後述のいつでも地域制限のかかったサイトを見られるようにしたい場合に難があります。

ルーティングできるトンネルを作る場合は GRE を使うのが一般的ですが、この場合は基本的には WAN 側に固定 IP アドレスが必要になります。家庭用のインターネットで固定 IP を持っている人はそうは多くないですよね。しかし、そこは EdgeRouter です。なんとダイナミック IP アドレスでも GRE のトンネルを IPSec の上に張るやり方がありました。ループバックアドレスを使います。この設定が自分の中では最難関で、きちんと動作する設定を見出すのにかなり時間がかかりました。設定できた自分を褒めてあげたいです。対象ファームウェアは 1.9.1 です。

ちなみにルーティングが必要なく、単に2拠点が互いに通信(レイヤー3レベル)できるだけでよければ、サブネット方式として設定すれば簡単に設定できます。

site-to-site IPsec の種類

EdgeRouter では、 site-to-site IPsec を実現するやり方に大きく3つの種類があります。

  1. サブネット方式
  2. VTI
  3. GRE over IPsec

これらのメリットデメリットをまとめるとこんな感じです。

サブネット VTI GRE
設定 簡単 難しい 難しい
ルーティング 不可
ダイナミック IP 対応 非対応 非対応

サブネット方式

ヘルプのページやフォーラム等で一番設定例が多く簡単なのがサブネット方式ですが、これだと2拠点の LAN がただ相互にアクセスできるようになるだけで、トンネル経由のルーティングができません。つまり日本のサイトを見るにはせっかく拠点間 VPN があるというのに L2TP を使わなければならないと言うことです。なので今回は除外です。

VTI

VTI は site-to-site IPsec でルーティングが必要な場合の手段としてこちらもヘルプや設定例をよく見かけますが、 WAN 側の IP アドレスがダイナミックな場合動作しないのと、既存の L2TP サーバーの動作に支障をきたすので、これも除外します。

GRE

残るは GRE です。ルーテイングが必要な場合によく推奨される万能トンネルですが、 EdgeRouter のフォーラムやいろいろなブログ等を見ると基本的には「固定 IP アドレスでしか使えないものだ」とされています。ただしフォーラムで見つけた以下の2つのスレッドで、 ダイナミック IP アドレスでの GRE over IPsec の設定に成功してそうな例をみつけました。どうもヒントはループバックアドレス lo をトンネルの終端に使うことのようです。自分でも試したところ・・動きました!やったー!

Routed IP (VTI or GRE) over IPSec with dynamic peer?

My HowTo on multiple dynamic ospf-gre-ipsec tunnels

と書いてしまうと簡単ですが・・ここの設定にたどりつくまで半年かかりました。設定できた自分を褒めてあげたいです。そんな苦心作を、今日は惜しげも無く公開です。

前提条件

設定の前提となる条件は前回同様です。ダイナミック IP にホスト名と、 GRE が嫌がる条件ばかりです。

自宅 実家
DDNS yaberouter1.duckdns.org yaberouter2.duckdns.org
WAN 側 ポート eth0 pppoe0
WAN 側 IP アドレス ダイナミック / DHCP ダイナミック / PPPoE
LAN 側 ポート switch0 switch0
LAN 側 ネットワーク 192.168.1.0/24 192.168.2.0/24
ループバックアドレス 192.168.112.1/32 192.168.112.2/32
GRE トンネル IP アドレス 192.168.122.1/30 192.168.122.2/30

このような前提条件で、張り切ってダイナミック IP 使用時の GRE over site-to-site IPsec を設定してみます。


自宅側

まずは自宅側 ER-X から CLI で設定します。ループバックアドレスにプライベート IP アドレスを割り振り、それをトンネルの終端に使います。自宅側のトンネルの終端は 192.168.112.1/32 、実家側のトンネルの終端は 192.168.112.2/32 、GRE トンネル自身の IP アドレスは自宅側を 192.168.122.1/30 、実家側を 192.168.122.1/30 としました。 IPsec のシークレットはまたもや secret1 としましたが、任意のものに変更してください。

## 設定モードに入る
configure

## 基本的な IPsec の設定 ( L2TP のところで設定していれば不要 )
set vpn ipsec ipsec-interfaces interface eth0
set vpn ipsec nat-networks allowed-network 0.0.0.0/0
set vpn ipsec nat-traversal enable
set vpn ipsec auto-firewall-nat-exclude enable

## IPsec の ESP/IKE を設定する
set vpn ipsec esp-group ESP-1
set vpn ipsec esp-group ESP-1 compression disable
set vpn ipsec esp-group ESP-1 lifetime 3600
set vpn ipsec esp-group ESP-1 mode tunnel
set vpn ipsec esp-group ESP-1 pfs enable
set vpn ipsec esp-group ESP-1 proposal 1 encryption aes256
set vpn ipsec esp-group ESP-1 proposal 1 hash sha1
set vpn ipsec esp-group ESP-1 proposal 2 encryption 3des
set vpn ipsec esp-group ESP-1 proposal 1 hash md5
set vpn ipsec ike-group IKE-1
set vpn ipsec ike-group IKE-1 key-exchange ikev1
set vpn ipsec ike-group IKE-1 lifetime 3600
set vpn ipsec ike-group IKE-1 proposal 1 dh-group 2
set vpn ipsec ike-group IKE-1 proposal 1 encryption aes256
set vpn ipsec ike-group IKE-1 proposal 1 hash sha1
set vpn ipsec ike-group IKE-1 proposal 1 dh-group 2
set vpn ipsec ike-group IKE-1 proposal 1 encryption aes128
set vpn ipsec ike-group IKE-1 proposal 1 hash sha1

## トンネルの自宅側終端として使うループバックアドレスを設定
set interfaces loopback lo address 192.168.112.1/32

## site-to-site IPsec トンネルを設定
set vpn ipsec site-to-site peer yaberouter2.duckdns.org 
set vpn ipsec site-to-site peer yaberouter2.duckdns.org authentication id yaberouter1.duckdns.org
set vpn ipsec site-to-site peer yaberouter2.duckdns.org authentication mode pre-shared-secret
set vpn ipsec site-to-site peer yaberouter2.duckdns.org authentication pre-shared-secret secret1
set vpn ipsec site-to-site peer yaberouter2.duckdns.org authentication remote-id yaberouter2.duckdns.org
set vpn ipsec site-to-site peer yaberouter2.duckdns.org connection-type initiate
set vpn ipsec site-to-site peer yaberouter2.duckdns.org default-esp-group ESP-1
set vpn ipsec site-to-site peer yaberouter2.duckdns.org description ipsec-1-to-2
set vpn ipsec site-to-site peer yaberouter2.duckdns.org ike-group IKE-1
set vpn ipsec site-to-site peer yaberouter2.duckdns.org dhcp-interface eth0
set vpn ipsec site-to-site peer yaberouter2.duckdns.org tunnel 1
set vpn ipsec site-to-site peer yaberouter2.duckdns.org tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer yaberouter2.duckdns.org tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer yaberouter2.duckdns.org tunnel 1 local prefix 192.168.112.1/32
set vpn ipsec site-to-site peer yaberouter2.duckdns.org tunnel 1 remote prefix 192.168.112.2/32

## GRE トンネルを作成
set interfaces tunnel tun0
set interfaces tunnel tun0 address 192.168.122.1/30
set interfaces tunnel tun0 description gre-1-to-2
set interfaces tunnel tun0 encapsulation gre
set interfaces tunnel tun0 local-ip 192.168.112.1
set interfaces tunnel tun0 mtu 1354
set interfaces tunnel tun0 multicast enable
set interfaces tunnel tun0 remote-ip 192.168.112.2
set interfaces tunnel tun0 ttl 255

## 実家側の LAN にアクセスする時に gre を使うよう Static Route 設定
set protocols static interface-route 192.168.2.0/24 next-hop-interface tun0

## OpenVPN の Static Route は削除しておく
delete protocols static interface-route 192.168.2.0/24 next-hop-interface vtun0

## 設定を保存する
commit
save

## Operational Mode に戻る
exit

つづいて Firewall で GRE を通すようルールを追加します。

ER-X に管理者アカウントでログインし、 Firewall/NAT タブをクリック
Firewall Policies タブをクリック
WAN_LOCAL の Actions ボタンを押し、 Edit Ruleset を選ぶ

Add New Rule ボタンを押す
[Basic]
Description: Allow GRE
Action: Accept
Protocol: Choose a protocal by name > gre
Save ボタンを押す

追加したルールを元からある Allow established/related と Drop invalid state の間に移動する
Save Rule Order ボタンを押す
WAN_LOCAL の設定ウィンドウを閉じる

今回のトンネルではフレッツの PPPoE + IPSec + GRE という環境下で問題が出ないよう MTU をコンサバに 1354 と設定しています。が、念には念を入れて MSS Clamping も MTU に合わせて変更しておきます。 PPPoE や GRE に合わせて色々変えるのも面倒なので、全部のインターフェースに対しまるっと 1314 を設定してやります。

管理画面の Wizard タブをクリック
TCP MSS clamping をクリック
Enable MSS clamping for TCP connections にチェック
Interface Types: All
MSS: 1314
Apply ボタンを押す

実家側

続いて実家の ER-X を CLI で設定します。実家側のトンネルの終端は 192.168.112.2/32 、 GRE トンネル自身の IP アドレスは 192.168.122.2/30 、としました。

## 設定モードに入る
configure

## 基本的な IPsec の設定 ( L2TP のところで設定していれば不要 )
set vpn ipsec ipsec-interfaces interface pppoe0
set vpn ipsec nat-networks allowed-network 0.0.0.0/0
set vpn ipsec nat-traversal enable
set vpn ipsec auto-firewall-nat-exclude enable

## IPsec の ESP/IKE を設定する
set vpn ipsec esp-group ESP-1
set vpn ipsec esp-group ESP-1 compression disable
set vpn ipsec esp-group ESP-1 lifetime 3600
set vpn ipsec esp-group ESP-1 mode tunnel
set vpn ipsec esp-group ESP-1 pfs enable
set vpn ipsec esp-group ESP-1 proposal 1 encryption aes256
set vpn ipsec esp-group ESP-1 proposal 1 hash sha1
set vpn ipsec esp-group ESP-1 proposal 2 encryption 3des
set vpn ipsec esp-group ESP-1 proposal 1 hash md5
set vpn ipsec ike-group IKE-1
set vpn ipsec ike-group IKE-1 key-exchange ikev1
set vpn ipsec ike-group IKE-1 lifetime 3600
set vpn ipsec ike-group IKE-1 proposal 1 dh-group 2
set vpn ipsec ike-group IKE-1 proposal 1 encryption aes256
set vpn ipsec ike-group IKE-1 proposal 1 hash sha1
set vpn ipsec ike-group IKE-1 proposal 1 dh-group 2
set vpn ipsec ike-group IKE-1 proposal 1 encryption aes128
set vpn ipsec ike-group IKE-1 proposal 1 hash sha1

## トンネルの自宅側終端として使うループバックアドレスを設定
set interfaces loopback lo address 192.168.112.2/32

## site-to-site IPsec トンネルを設定
## pppoe0 では例のごとく dhcp-interface が使えない
set vpn ipsec site-to-site peer yaberouter1.duckdns.org 
set vpn ipsec site-to-site peer yaberouter1.duckdns.org authentication id yaberouter2.duckdns.org
set vpn ipsec site-to-site peer yaberouter1.duckdns.org authentication mode pre-shared-secret
set vpn ipsec site-to-site peer yaberouter1.duckdns.org authentication pre-shared-secret secret1
set vpn ipsec site-to-site peer yaberouter1.duckdns.org authentication remote-id yaberouter1.duckdns.org
set vpn ipsec site-to-site peer yaberouter1.duckdns.org connection-type initiate
set vpn ipsec site-to-site peer yaberouter1.duckdns.org default-esp-group ESP-1
set vpn ipsec site-to-site peer yaberouter1.duckdns.org description ipsec-2-to-1
set vpn ipsec site-to-site peer yaberouter1.duckdns.org ike-group IKE-1
set vpn ipsec site-to-site peer yaberouter1.duckdns.org local-address 0.0.0.0
set vpn ipsec site-to-site peer yaberouter1.duckdns.org tunnel 1
set vpn ipsec site-to-site peer yaberouter1.duckdns.org tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer yaberouter1.duckdns.org tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer yaberouter1.duckdns.org tunnel 1 local prefix 192.168.112.2/32
set vpn ipsec site-to-site peer yaberouter1.duckdns.org tunnel 1 remote prefix 192.168.112.1/32

## GRE トンネルを作成
set interfaces tunnel tun0
set interfaces tunnel tun0 address 192.168.122.2/30
set interfaces tunnel tun0 description gre-2-to-1
set interfaces tunnel tun0 encapsulation gre
set interfaces tunnel tun0 local-ip 192.168.112.2
set interfaces tunnel tun0 mtu 1354
set interfaces tunnel tun0 multicast enable
set interfaces tunnel tun0 remote-ip 192.168.112.1
set interfaces tunnel tun0 ttl 255

## 自宅側の LAN にアクセスする時に GRE トンネルを使うよう Static Route 設定
set protocols static interface-route 192.168.1.0/24 next-hop-interface tun0

## OpenVPN の Static Route は削除しておく
delete protocols static interface-route 192.168.1.0/24 next-hop-interface vtun0

## 設定を保存する
commit
save

## Operational Mode に戻る
exit

つづいて Firewall で GRE を通すようルールを追加します。

ER-X に管理者アカウントでログインし、 Firewall/NAT タブをクリック
Firewall Policies タブをクリック
WAN_LOCAL の Actions ボタンを押し、 Edit Ruleset を選ぶ

Add New Rule ボタンを押す
[Basic]
Description: Allow gre
Action: Accept
Protocol: Choose a protocal by name > gre
Save ボタンを押す

追加したルールを元からある Allow established/related と Drop invalid state の間に移動する
Save Rule Order ボタンを押す
WAN_LOCAL の設定ウィンドウを閉じる

こちら側でも MSS Clamping を変更しておきます。

管理画面の Wizard タブをクリック
TCP MSS clamping をクリック
Enable MSS clamping for TCP connections にチェック
Interface Types: All
MSS: 1314
Apply ボタンを押す

さて、これで OpenVPN の時と同じく L2TP 等使わなくても反対側の LAN にアクセスできるようになれば成功です。うまく動いたのであれば OpenVPN の設定は削除してしまえばいいと思います。

しかしこのコマンドを一字一句間違えずに入力できる人っているんでしょうか。こんなコマンドを入力せず使える Mac の素敵さを改めて噛み締めてしまいます。

今回は当然ながらこのページを大いに参考にしました。

EdgeRouter – IPsec Dynamic Site-to-Site VPN using FQDNs

Routed IP (VTI or GRE) over IPSec with dynamic peer?

My HowTo on multiple dynamic ospf-gre-ipsec tunnels

この2つページのおかげで今の自分があると言っても過言ではありません。このスレッドを書いたユーザーの方には厚く御礼申し上げます。そしてこの設定を使えば、家庭用のインターネットを使っているほぼすべての人々に、 GRE over IPsec を使う道が拓けます。

以上、お疲れ様でした。これで峠は越しました。


Home > Gadgets > EdgeRouter X – 8. 自宅と実家の2つの LAN を拠点間 VPN でつなぐ ( IPsec )