EdgeRouter X を使ったL2TPv3 over IPsec

2地点間でLayer2 のVirtutal Bridge を構成する必要があり EdgeRouter X を使って、IPv4 で L2TPv3 over IPsec の設定をしてみた。

実際は同じセグメント内で Virtual Bridge をVirtual Private Network(VPN)を利用して構成したいだけだが、特殊な状況で、セグメント内だが、IPアドレスが Dynamic で固定できない。Dynamic IP を扱うには IPsec の利用が必要のようだ。IPsec上で Layer 2 (L2) ブリッジを構成するには L2TPv3 が簡単そうなので、それを使うことにした。

同一セグメント内なので Multicast DNS (mDNS)でできないかと思ったが、EdgeRouter X ではうまく、IPsec のサイト名としてうまく使えなかった。しかたがないので、Dynamic DNS (DDNS)を使っている。

最近は IPv6 で設定する場合が多いと思うが、IPv4 を利用した設定の備忘録として記録しておく。

設定にあたっては、以下のサイトが参考になった。

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

EdgeRouter 6P – 12. 自宅と実家を L2 VPN で一体化する ( L2TPv3 Bridging )

EdgeRouter X – 14. L2 VPN アプライアンスとして使う

格安ルータ「EdgeRouter」でフレッツ NGN 網折り返し拠点間 L2VPN(L2TPv3/IPSec over IPv6)を構築する

環境・機材

Dynamic DNS には 無料の duckdns.org を利用した。

EdgeRouter X のバージョンは、v2.0.9-hotfix.4 を利用した。

EdgeMAX OS の GUI画面から VPN、ConfigTree、Wizardsのタブを利用して設定を行った。

構成の概要を次の図に示す。

XXXXXXX-ivy1 (以下では単に ivy1とする) の eth4 と XXXXXXX-ivy2 (以下では単に ivy2とする)の eth4 でL2 Bridge を構成する。

  • ivy1
    • eth0: インターネットへの接続 (DHCP)
    • eth1, eth2, eth3: 192.168.11.0/24, DHCP有効 PCを接続する
    • eth4: L2TPv3 VPN
  • ivy2
    • eth0: インターネットへの接続 (DHCP)
    • eth1, eth2, eth3: 192.168.22.0/24, DHCP有効 PCを接続する
    • eth4: L2TPv3 VPN

EdgeRouter X (ivy1)の設定

まず、1台のEdgeRouter X の設定を示す。2台目も基本的に同じことであるが、後で設定を示す。2台目の方が設定手順などで手戻りがなかったので、2台目の方が細部ではより正確と思う。

EdgeRouter X を hardware reset した状態から設定した。

eth0 に PCを接続し、PCのIPアドレスを192.168.1.2/24、192.168.1.1をゲートウェイアドレスに設定して基本設定をした。

Basic Setup で LANに 192.168.11.1/24 を設定した。

 

リブートをして設定を確認。

Dynamic DNS の設定

eth1 (eth2, eth3でも可) に PCを接続し、設定を進めていく。

Services タブ → DNS タブ →  Dynamic DNS を使って設定をした。

しかし、設定を確認すると interface が other null になってしまう。しかたがないので、ConfigTree から eth0 で設定した。

  • services
    • dns
      • dynamic
        • interface
          • eth0
            • service:   add custom-duckdns
              • custom-duckdns:   add XXXXXXX-ivy1
                • login: nouser
                • password: Duck DNS で指定されているもの
                • protocol: dyndns2
                • server: www.duckdns.org

IPsec Site-to-Site接続の設定

VPN タブ → IPsec Site-to-Site タブで IPsec の設定をした。

  • Peer: XXXXXXX-ivy2.duckdns.org
    • Description: peer2 (何でも)
    • Local IP: any
    • Pre-shared secret: ivy1 と ivy2 で共通になるよう決めたもの
    • Local subnet: 192.168.11.0/24
    • Remote subnet: 192.168.22.0/24

ファイアウォール設定

Firewall/NATタブのFirewall Policies でファイアウォール設定を詳細にした方が良い場合もあるであろうが、IPsec Site-to-Site設定で作成されるデフォルトのファイアウォールのままにしてある。

IPsec Site-to-Site接続の確認

Peer(ここではivy2)もIPsec Site-to-Site接続の設定済みなら、 Wizards タブの VPN status を確認することで、IPsec による Site-to-Site 接続ができていることを確認できる。うまく接続できていれば、しばらくするとVPN Status List の Statusが down から up になるはず。

また、ivy1 に接続したPCから ivy2 に接続したPC (192.168.22.39とする) に Ping を送って適切な応答があることを確認する。

PS C:\Users\XXXXXXXX> ping 192.168.22.39

192.168.22.39 に ping を送信しています 32 バイトのデータ:
192.168.22.39 からの応答: バイト数 =32 時間 =1ms TTL=126
192.168.22.39 からの応答: バイト数 =32 時間 =2ms TTL=126
192.168.22.39 からの応答: バイト数 =32 時間 =1ms TTL=126
192.168.22.39 からの応答: バイト数 =32 時間 =2ms TTL=126

192.168.22.39 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 1ms、最大 = 2ms、平均 = 1ms

スイッチの設定

EdgeRouter X の Ethernetポート eth4 を L2 Bridge に利用する設定を行う。このため、switch0 から取り除く。

ConfigTreeタブ の interfaces / switch / switch0 / switch-port / interface のパネルから インタフェース eth4 を削除する。

L2TPv3 の設定

L2TPv3 の設定をするために、L2TPv3の端点となる bridgeインタフェース、L2TPv3インタフェースの作成を行う。

Bridgeの作成・設定

ConfigTreeタブ の interfaces / bridge  のパネルで br1 を作成し、設定を行う。

  • interfaces
    • bridge: add br1
      •  br1
        • multicast: enable
        • promiscous: enable

インタフェース l2tpeth1 の作成・設定

ConfigTreeタブ の interfaces / l2tpv3 のパネルでインタフェース l2tpeth1  を作成する。

以下の例では、port, session-id, tunnel-id で桁数を変えてある。

  • interfaces
    • l2tpv3: add l2tpeth1
      • l2tpeth1
        • description: L2TPv3 ivy1 (なんでも良い)
        • destination-port: 22000
        • encapsulation: udp
        • local-ip: 192.168.11.1
        • peer-session-id: 2200
        • peer-tunnel-id: 220
        • remote-ip: 192.168.22.1
        • session-id: 1100
        • source-port 11000
        • tunnel-id: 110

ConfigTreeタブ の interfaces / l2tpv3 / l2tpeth1 / bridge-group に br1 を設定する。

  • interfaces
    • l2tpv3
      • l2tpeth1
        • bridge-group
          • bridge: br1

Ethernet ポート eth4 の設定

ConfigTreeタブ の interfaces / ethernet / eth4 / bridge-group を br1に設定する。

TCP MSS Clamping

VPNを使っているので、TCP Maximum Segment Size (MSS) を調整する TCP MSS Clamping を有効にする。

EdgeRouter X (ivy2)の設定

EdgeRouter X を hardware reset した状態から設定した。

eth0 に PCを接続し、PCのIPアドレスを192.168.1.2/24、192.168.1.1をゲートウェイアドレスに設定して基本設定をした。

Basic Setup で LANに 192.168.22.1/24 を設定した。設定を反映させるために Restart する。

EdgeRouter X のホスト名の設定

ホスト名を EdgeRouter-X-ivy2 にする。

ホスト名を変更した後にはダッシュボードの左上が変わる。

Dynamic DNS のivy2での設定

eth1 (eth2, eth3でも可) に PCを接続し、設定を進めていく。

Services タブ → DNS タブ →  Dynamic DNS を使って設定をしてみたが、ivy1と同じことなので、 interface が other null になってしまう。

そこで、ConfigTree から null を削除し、 eth0 を追加して設定した。

  • services
    • dns
      • dynamic
        • interface
          • eth0
            • service:   add custom-duckdns
              • custom-duckdns:   add XXXXXXX-ivy2
                • login: nouser
                • password: Duck DNS で指定されているもの
                • protocol: dyndns2
                • server: www.duckdns.org

IPsec Site-to-Site接続のivy2での設定

VPN タブ → IPsec Site-to-Site タブで IPsec の設定をした。

  • Peer: XXXXXXX-ivy1.duckdns.org
    • Description: peer1 (何でも)
    • Local IP: any
    • Pre-shared secret: ivy1 と ivy2 で共通になるよう決めたもの
    • Local subnet: 192.168.22.0/24
    • Remote subnet: 192.168.11.0/24

ファイアウォールのivy2での設定

Firewall/NATタブのFirewall Policies でファイアウォール設定を詳細にした方が良い場合もあるであろうが、IPsec Site-to-Site設定で作成されるデフォルトのファイアウォールのままにしてある。

IPsec Site-to-Site接続の確認

Peer(ここではivy1)も設定済みなら、 Wizards タブの Feature Wizards の中のVPN status を確認することで、IPsec による Site-to-Site 接続ができていることを確認できる。

また、ivy2 に接続したPCから ivy1 に接続したPC (192.168.11.40とする) に Ping を送って適切な応答があることを確認する。

PS C:\Users\XXXXXX> ping 192.168.11.40

192.168.11.40 に ping を送信しています 32 バイトのデータ:
192.168.11.40 からの応答: バイト数 =32 時間 =2ms TTL=126
192.168.11.40 からの応答: バイト数 =32 時間 =2ms TTL=126
192.168.11.40 からの応答: バイト数 =32 時間 =1ms TTL=126
192.168.11.40 からの応答: バイト数 =32 時間 =2ms TTL=126

192.168.11.40 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 1ms、最大 = 2ms、平均 = 1ms

スイッチのivy2での設定

EdgeRouter X の Ethernetポート eth4 を L2 Bridge に利用する設定を行う。このため、switch0 から取り除く。

ConfigTreeタブ の interfaces / switch / switch0 / switch-port / interface のパネルから インタフェース eth4 を削除する。

L2TPv3 のivy2での設定

L2TPv3 の設定をするために、L2TPv3の端点となる bridgeインタフェース、L2TPv3インタフェースの作成を行う。

Bridge br2の作成・設定

ConfigTreeタブ の interfaces / bridge  のパネルで br2 を作成し、設定を行う。

  • interfaces
    • bridge: add br2
        • br2
          • multicast: enable
          • promiscous: enable

インタフェース l2tpeth2 の作成・設定

ConfigTreeタブ の interfaces / l2tpv3 のパネルでインタフェース l2tpeth2  を作成する。

ConfigTreeタブ の interfaces / l2tpv3 / l2tpeth1 / bridge-group に br2 を設定する。

以下の例では、port, session-id, tunnel-id で桁数を変えてある。

  • interfaces
    • l2tpv3: add l2tpeth2
      • l2tpeth2
        • description: L2TPv3 ivy2 (なんでも良い)
        • destination-port: 11000
        • encapsulation: udp
        • local-ip: 192.168.22.1
        • peer-session-id: 1100
        • peer-tunnel-id: 110
        • remote-ip: 192.168.11.1
        • session-id: 2200
        • source-port 22000
        • tunnel-id: 220
        • bridge-group
          • bridge: br2

Ethernet ポート eth4 へ br2 の設定

ConfigTreeタブ の interfaces / ethernet / eth4 / bridge-group を br2に設定して、L2TPv3 と eth4 が br2 でブリッジされるようにする。

TCP MSS Clamping

VPNを使っているので、TCP Maximum Segment Size (MSS) を調整する TCP MSS Clamping を有効にする。

Restart をして設定を反映させる。

 

L2TPv3 接続の確認

設定後に再起動してしばらくしてから Dashboard を見ることで、L2TPv3 の l2tpeth1 が Connected になっていれば接続されていることを確認できる。

ivy2 の eth4 をたとえば 192.168.1.0/24 のDHCPが有効になっているLANに接続し、 ivy1 の eth4 に PC を接続する。ping によって ivy2のeth4が接続されているルータ 192.168.1.1 から応答を得ることができる。

PS C:\Users\XXXXXXXX> ping 192.168.1.1

192.168.1.1 に ping を送信しています 32 バイトのデータ:
192.168.1.1 からの応答: バイト数 =32 時間 =2ms TTL=64
192.168.1.1 からの応答: バイト数 =32 時間 =2ms TTL=64

192.168.1.1 の ping 統計:
パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 2ms、最大 = 2ms、平均 = 2ms

ivy2側の eth4 のケーブルを外すと ping で 192.168.1.1 に到達できなくなることから L2TPv3 経由で通信していると考えられる。

また、arp -a で調べると 192.168.1.0/24 のセグメントの状態が見られることを確認した。

設定の保存

EdgeRouter Xでファイルに保存

ここでは、ivy2 の設定をファイルに保存する例を示す。

EdgeMAX OS の CLI を起動してログインし、show configuration の出力をファイルに保存する。

次のコマンドを実行した例を示す。

show configuration > ivy2.configuration.txt

ファイルをPCなどにコピー

scp を利用するなどして、EdgeRouter X 内のファイルをコピーしてPCなどに保存する。

Windowsで次のコマンドを実行した例を示す。

scp ubnt@192.168.22.1:/home/ubnt/ivy2.configuration.txt ivy2.configuration.txt

この例では ユーザ名は、ubntであり、初回の接続なので、 yes と回答してキーを~/.ssh/known_hosts に保存する。

その後、ubnt のパスワードを入力することでコピーが行われる。

コピーして保存した ivy2の設定ファイルの内容を記録しておく。

firewall {
    all-ping enable
    broadcast-ping disable
    ipv6-name WANv6_IN {
        default-action drop
        description "WAN inbound traffic forwarded to LAN"
        enable-default-log
        rule 10 {
            action accept
            description "Allow established/related sessions"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    ipv6-name WANv6_LOCAL {
        default-action drop
        description "WAN inbound traffic to the router"
        enable-default-log
        rule 10 {
            action accept
            description "Allow established/related sessions"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
        rule 30 {
            action accept
            description "Allow IPv6 icmp"
            protocol ipv6-icmp
        }
        rule 40 {
            action accept
            description "allow dhcpv6"
            destination {
                port 546
            }
            protocol udp
            source {
                port 547
            }
        }
    }
    ipv6-receive-redirects disable
    ipv6-src-route disable
    ip-src-route disable
    log-martians enable
    name WAN_IN {
        default-action drop
        description "WAN to internal"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    name WAN_LOCAL {
        default-action drop
        description "WAN to router"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    options {
        mss-clamp {
            interface-type all
            mss 1412
        }
    }
    receive-redirects disable
    send-redirects enable
    source-validation disable
    syn-cookies enable
}
interfaces {
    bridge br2 {
        aging 300
        bridged-conntrack disable
        hello-time 2
        max-age 20
        multicast enable
        priority 32768
        promiscuous enable
        stp false
    }
    ethernet eth0 {
        address dhcp
        description Internet
        duplex auto
        firewall {
            in {
                ipv6-name WANv6_IN
                name WAN_IN
            }
            local {
                ipv6-name WANv6_LOCAL
                name WAN_LOCAL
            }
        }
        speed auto
    }
    ethernet eth1 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth2 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth3 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth4 {
        bridge-group {
            bridge br2
        }
        description Local
        duplex auto
        poe {
            output off
        }
        speed auto
    }
    l2tpv3 l2tpeth2 {
        bridge-group {
            bridge br2
        }
        description "L2TPv3 ivy2"
        destination-port 11000
        encapsulation udp
        local-ip 192.168.22.1
        peer-session-id 1100
        peer-tunnel-id 110
        remote-ip 192.168.11.1
        session-id 2200
        source-port 22000
        tunnel-id 220
    }
    loopback lo {
    }
    switch switch0 {
        address 192.168.22.1/24
        description Local
        mtu 1500
        switch-port {
            interface eth1 {
            }
            interface eth2 {
            }
            interface eth3 {
            }
            vlan-aware disable
        }
    }
}
service {
    dhcp-server {
        disabled false
        hostfile-update disable
        shared-network-name LAN {
            authoritative enable
            subnet 192.168.22.0/24 {
                default-router 192.168.22.1
                dns-server 192.168.22.1
                lease 86400
                start 192.168.22.38 {
                    stop 192.168.22.243
                }
            }
        }
        static-arp disable
        use-dnsmasq disable
    }
    dns {
        dynamic {
            interface eth0 {
                service custom-duckdns {
                    host-name XXXXXXX-ivy2
                    login nouser
                    password ****************
                    protocol dyndns2
                    server www.duckdns.org
                }
            }
        }
        forwarding {
            cache-size 150
            listen-on switch0
        }
    }
    gui {
        http-port 80
        https-port 443
        older-ciphers enable
    }
    nat {
        rule 5010 {
            description "masquerade for WAN"
            outbound-interface eth0
            type masquerade
        }
    }
    ssh {
        port 22
        protocol-version v2
    }
    unms {
        disable
    }
}
system {
    analytics-handler {
        send-analytics-report false
    }
    crash-handler {
        send-crash-report false
    }
    host-name EdgeRouter-X-ivy2
    login {
        user ubnt {
            authentication {
                encrypted-password ****************
            }
            level admin
        }
    }
    ntp {
        server 0.ubnt.pool.ntp.org {
        }
        server 1.ubnt.pool.ntp.org {
        }
        server 2.ubnt.pool.ntp.org {
        }
        server 3.ubnt.pool.ntp.org {
        }
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone UTC
}
vpn {
    ipsec {
        allow-access-to-local-interface disable
        auto-firewall-nat-exclude enable
        esp-group FOO0 {
            compression disable
            lifetime 3600
            mode tunnel
            pfs enable
            proposal 1 {
                encryption aes128
                hash sha1
            }
        }
        ike-group FOO0 {
            ikev2-reauth no
            key-exchange ikev1
            lifetime 28800
            proposal 1 {
                dh-group 14
                encryption aes128
                hash sha1
            }
        }
        site-to-site {
            peer XXXXXXX-ivy1.duckdns.org {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                connection-type initiate
                description peer1
                ike-group FOO0
                ikev2-reauth inherit
                local-address any
                tunnel 1 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group FOO0
                    local {
                        prefix 192.168.22.0/24
                    }
                    remote {
                        prefix 192.168.11.0/24
                    }
                }
            }
        }
    }
}