Vyatta(VyOS)で、IPsecの設定方法をまとめます。IPsecは「GRE等のトンネルを経由する通信を暗号化する手法」と「VTI(Virtual Tunnel Interfaceを使用する方法」があります。最近では後者の設定例を見る事が多くなりましたが、歴史的な経緯を把握する意味で両者の設定手法を紹介します。
設定まとめ
IKE
以下コマンドでIKEのDHグループ, 暗号化アルゴリズム, ハッシュアルゴリズムを指定できます。
set vpn ipsec ike-group <グループ名> proposal <番号> dh-group <DHグループ> set vpn ipsec ike-group <グループ名> proposal <番号> encryption <暗号化アルゴリズム> set vpn ipsec ike-group <グループ名> proposal <番号> hash <ハッシュアルゴリズム>
以下のコマンドでIKEのライフタイムを指定できます。指定省略時は28800秒です。
set vpn ipsec ike-group <グループ名> lifetime <秒指定>
以下のコマンドでIKEをmain modeで動作させるかaggressive modeで動作させるかを指定できます。
main modeはID含めて暗号化されるモードでグローバルIPアドレスが固定の場合に使用可能です。aggressive modeはIDは暗号化されないモードで片方のグローバルIPアドレスが不定の場合に使用できます。指定省略時はmain modeになります。
set vpn ipsec ike-group <グループ名> mode {main|aggressive}
ESP
以下コマンドでESPの暗号化アルゴリズム, ハッシュアルゴリズムを指定できます。
set vpn ipsec esp-group <グループ名> proposal 1 encryption <暗号化アルゴリズム> set vpn ipsec esp-group <グループ名> proposal 1 hash <ハッシュアルゴリズム>
以下のコマンドでESPのライフタイムを指定できます。指定省略時は3600秒です。
set vpn ipsec esp-group <グループ名> lifetime <秒指定>
IPsecをtunnel modeで動作させるかtransport modeで動作させるかを指定します。tunnel modeは文字通りトンネルとして動作させるモードでルータ間でトンネルを確立します。transport modeはホスト間で暗号化するモードでIPヘッダ含めて暗号化されるメリットがあります。
指定省略時はtunnel modeになります。おそらくVyattaはネットワーク機器間でのVPNを実装する事が多いと思いますので、殆どの場合はtunnel modeになるでしょう。
set vpn ipsec esp-group <グループ名> mode {tunnel|transport}
認証方法
以下のコマンドで、対向機器を認証する方法を指定できます。指定方法は事前共有鍵, RSA, x509から選ぶ事ができます。
set vpn ipsec site-to-site peer <IPアドレス> authentication mode {pre-shared-secret|rsa|x509}
以下のコマンドで、事前共有鍵を指定します。
set vpn ipsec site-to-site peer <対向IPアドレス> authentication pre-shared-secret <鍵文字列>
VTIを使用しない場合の設定例
VTIを使用しない場合は、以下コマンドのように対向とのIPsecを確立します。
set vpn ipsec site-to-site peer <対向IPアドレス> local-address <自身IPアドレス> set vpn ipsec site-to-site peer <対向IPアドレス> ike-group <IKEグループ名> set vpn ipsec site-to-site peer <対向IPアドレス> tunnel <番号> esp-group <ESPグループ名>
VTIを使用しない場合は、以下コマンドで暗号化対象を指定できます。対象はIPアドレスやプロトコル番号で指定する事ができます。
set vpn ipsec site-to-site peer <対向IPアドレス> tunnel <番号> local prefix <送信元プレフィックス> set vpn ipsec site-to-site peer <対向IPアドレス> tunnel <番号> remote prefix <宛先プレフィックス> set vpn ipsec site-to-site peer <対向IPアドレス> tunnel <番号> protocol <プロトコル>
VTIを使用する場合の設定例
以下コマンドでVTIインターフェースを作成できます。
set interfaces vti <VTIインターフェース名> address <IPアドレス>
VTIを使用する場合は、以下コマンドのように対向とのIPsecを確立します。
set vpn ipsec site-to-site peer <対向IPアドレス> local-address <自身IPアドレス> set vpn ipsec site-to-site peer <対向IPアドレス> ike-group <IKEグループ名> set vpn ipsec site-to-site peer <対向IPアドレス> vti esp-group <ESPグループ名> set vpn ipsec site-to-site peer <対向IPアドレス> vti bind <VTIインターフェース名>
動作確認
動作確認の構成
以下の環境で動作確認を行います。
+-----------------------+ | host100 | | | +-----------+-----------+ ens224 | .100 | | 192.168.100.0/24 | eth0 | .1 +-----------+-----------+ | vy001 | | Lo:200.1.1.1/32 | +-----------+-----------+ eth1 | .1 | | 200.0.12.0/24 | eth0 | .2 +-----------+-----------+ | vy002 | | Lo:200.2.2.2/32 | +-----------+-----------+ eth1 | .2 | | 200.0.23.0/24 | eth0 | .3 +-----------+-----------+ | vy003 | | Lo:200.3.3.3/32 | +-----------+-----------+ eth1 | .1 | | 192.168.200.0/24 | ens224 | .200 +-----------+-----------+ | host200 | | | +-----------------------+
初期設定
IPv4アドレスとIPv6アドレスは付与済とします。vy001, vy002, vy003の間はOSPFで互いに経路を交換しているものとします。
動作確認 (1) 暗号化のみのIPsec
IPsecと言うとVPNを想像する方が多いかと思いますが、IPSecは暗号化のみの規格です。実運用ではトンネルとIPsecを併用する事が多いため、VPNとのイメージが広まっている実情があります。まずは、仕様理解のために暗号化のみの設定をしてみましょう。
IKEプロポーザル
IPsecを確立する機器同士で、IKEに使用するパラメタを定義します。互いにパラメタを提案し、一致するものがあれば、IKEが確立されます。
このシナリオでは簡略する化するために、vy001とvy003に同じパラメタを投入します。提案するパラメタには「MyIKEGroup」という名前を付けますが、この名前は分かりやすい任意の名前で差し支えございません。
[vy001:VyOS1.4] set vpn ipsec ike-group MyIKEGroup proposal 1 dh-group '2' set vpn ipsec ike-group MyIKEGroup proposal 1 encryption 'aes128' set vpn ipsec ike-group MyIKEGroup proposal 1 hash 'sha1' [vy003:VyOS1.4] set vpn ipsec ike-group MyIKEGroup proposal 1 dh-group '2' set vpn ipsec ike-group MyIKEGroup proposal 1 encryption 'aes128' set vpn ipsec ike-group MyIKEGroup proposal 1 hash 'sha1'
ESPプロポーザル
IPsecを確立する機器同士で、ペイロード暗号化に使用するパラメタを定義します。互いにパラメタを提案し、一致するものがあれば、IKEが確立されます。
このシナリオでは簡略する化するために、vy001とvy003に同じパラメタを投入します。提案するパラメタには「MyESPGroup」という名前を付けますが、この名前は分かりやすい任意の名前で差し支えございません。
[vy001:VyOS1.4] set vpn ipsec esp-group MyESPGroup proposal 1 encryption 'aes128' set vpn ipsec esp-group MyESPGroup proposal 1 hash 'sha1' [vy003:VyOS1.4] set vpn ipsec esp-group MyESPGroup proposal 1 encryption 'aes128' set vpn ipsec esp-group MyESPGroup proposal 1 hash 'sha1'
IPsecの確立
IPsecを確立するIPアドレスや事前共有鍵などを設定します。
[vy001:VyOS1.4] set vpn ipsec site-to-site peer 200.0.23.3 authentication mode 'pre-shared-secret' set vpn ipsec site-to-site peer 200.0.23.3 authentication pre-shared-secret 'SomePreSharedKey' set vpn ipsec site-to-site peer 200.0.23.3 ike-group 'MyIKEGroup' set vpn ipsec site-to-site peer 200.0.23.3 local-address '200.0.12.1' set vpn ipsec site-to-site peer 200.0.23.3 tunnel 0 esp-group 'MyESPGroup' [vy003:VyOS1.4] set vpn ipsec site-to-site peer 200.0.12.1 authentication mode 'pre-shared-secret' set vpn ipsec site-to-site peer 200.0.12.1 authentication pre-shared-secret 'SomePreSharedKey' set vpn ipsec site-to-site peer 200.0.12.1 ike-group 'MyIKEGroup' set vpn ipsec site-to-site peer 200.0.12.1 local-address '200.0.23.3' set vpn ipsec site-to-site peer 200.0.12.1 tunnel 0 esp-group 'MyESPGroup'
ここまでの設定をすると、IKEとESPのネゴシエーションが開始されます。IKEのネゴシエーションに成功したかどうかを確認するには以下のコマンドを使用します。Stateがupとなっていれば正常です。
[vy001:VyOS1.4] vyos@vy001:~$ show vpn ike sa Peer ID / IP Local ID / IP ------------ ------------- 200.0.23.3 200.0.23.3 200.0.12.1 200.0.12.1 State IKEVer Encrypt Hash D-H Group NAT-T A-Time L-Time ----- ------ ------- ---- --------- ----- ------ ------ up IKEv2 AES_CBC_128 HMAC_SHA1_96 MODP_1024 no 8 0 vyos@vy001:~$
ESPのネゴシエーションに成功したかどうかを確認するには以下のコマンドを使用します。Stateがupとなっていれば正常です。
[vy001:VyOS1.4] vyos@vy001:~$ show vpn ipsec sa Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal ------------------------ ------- -------- -------------- ---------------- ---------------- ----------- ------------------------ peer_200-0-23-3_tunnel_0 up 4m15s 0B/0B 0/0 200.0.23.3 N/A AES_CBC_128/HMAC_SHA1_96 vyos@vy001:~$
暗号化対象の定義
IPsecは暗号化する対象を定義する事ができます。全てを暗号化してしまえば負荷上昇にもなりますし、直接接続された機器とのルーティングプロトコルまで暗号化してしまえば疎通不能になります。そのため、暗号化する対象を明示指定する必要があります。
動作確認のため、vy001のloopback(200.1.1.1)とvy003のloopback(200.3.3.3)の間の通信のみを暗号化してみましょう。
[vy001:VyOS1.4] set vpn ipsec site-to-site peer 200.0.23.3 tunnel 0 local prefix '200.1.1.1/32' set vpn ipsec site-to-site peer 200.0.23.3 tunnel 0 remote prefix '200.3.3.3/32' [vy003:VyOS1.4] set vpn ipsec site-to-site peer 200.0.12.1 tunnel 0 local prefix '200.3.3.3/32' set vpn ipsec site-to-site peer 200.0.12.1 tunnel 0 remote prefix '200.1.1.1/32'
予めパケットキャプチャを仕込んだ状態で、vy001からvy003へpingを実行します。1つはeth1を送信元とし、もう1つはloopbackを送信元とします。IPsecが正常に効いているならば、後者のみが暗号化されているはずです。
[vy001:VyOS1.4] vyos@vy001:~$ ping 200.0.23.3 count 3 PING 200.0.23.3 (200.0.23.3) 56(84) bytes of data. 64 bytes from 200.0.23.3: icmp_seq=1 ttl=63 time=0.819 ms 64 bytes from 200.0.23.3: icmp_seq=2 ttl=63 time=0.741 ms 64 bytes from 200.0.23.3: icmp_seq=3 ttl=63 time=0.680 ms --- 200.0.23.3 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2042ms rtt min/avg/max/mdev = 0.680/0.746/0.819/0.056 ms vyos@vy001:~$ vyos@vy001:~$ vyos@vy001:~$ ping 200.3.3.3 interface 200.1.1.1 count 3 PING 200.3.3.3 (200.3.3.3) from 200.1.1.1 : 56(84) bytes of data. 64 bytes from 200.3.3.3: icmp_seq=1 ttl=64 time=0.941 ms 64 bytes from 200.3.3.3: icmp_seq=2 ttl=64 time=0.793 ms 64 bytes from 200.3.3.3: icmp_seq=3 ttl=64 time=0.918 ms --- 200.3.3.3 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2024ms rtt min/avg/max/mdev = 0.793/0.884/0.941/0.065 ms vyos@vy001:~$
パケットキャプチャの結果を確認します。前者は平文でicmpと表示され、後者はESPと暗号化されているのが分かります。
動作確認 (2) GRE over IPSec
一般的にはIPsecはトンネルと併用され、暗号化されたVPNを実現するために使用されるのをよく見ます。以下、GREとの併用例を紹介します。なお、GREは一例であり、カプセル化手法はIPIPやIP6IP6など任意の方法を採用できます。
トンネルの設定
vy001とvy003の間でGREトンネルを確立します。さらに、host100とhost200が互いに疎通可能になるように、ダイナミックルーティングを設定します。
[vy001:VyOS1.4] set interfaces tunnel tun0 address '192.168.13.1/24' set interfaces tunnel tun0 encapsulation 'gre' set interfaces tunnel tun0 remote '200.3.3.3' set interfaces tunnel tun0 source-address '200.1.1.1' set protocols bgp address-family ipv4-unicast network 192.168.100.0/24 set protocols bgp local-as '65000' set protocols bgp neighbor 192.168.13.3 remote-as '65000' [vy003:VyOS1.4] set interfaces tunnel tun0 address '192.168.13.3/24' set interfaces tunnel tun0 encapsulation 'gre' set interfaces tunnel tun0 remote '200.1.1.1' set interfaces tunnel tun0 source-address '200.3.3.3' set protocols bgp address-family ipv4-unicast network 192.168.200.0/24 set protocols bgp local-as '65000' set protocols bgp neighbor 192.168.13.1 remote-as '65000'
トンネルが確立された事を確認するため、vy001とvy003の間でトンネル経由のping疎通が可能である事を確認します。
[vy001:VyOS1.4] vyos@vy001:~$ ping 192.168.13.3 count 3 PING 192.168.13.3 (192.168.13.3) 56(84) bytes of data. 64 bytes from 192.168.13.3: icmp_seq=1 ttl=64 time=0.679 ms 64 bytes from 192.168.13.3: icmp_seq=2 ttl=64 time=0.784 ms 64 bytes from 192.168.13.3: icmp_seq=3 ttl=64 time=0.712 ms --- 192.168.13.3 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2066ms rtt min/avg/max/mdev = 0.679/0.725/0.784/0.043 ms vyos@vy001:~$
暗号化対象の定義
実は、以上でVPNの設定が完了しています。しかし、ここでやや便利な設定を紹介します。
前述の設定では、送信元IPアドレスと宛先IPアドレスで暗号化の対象を定義していますが、プロトコルでも暗号化対象を定義する事ができます。以下のようにgreのみを暗号化するように設定すると、設定をシンプル化する事ができます。
[vy001:VyOS1.4] delete vpn ipsec site-to-site peer 200.0.23.3 tunnel 0 local prefix '200.1.1.1/32' delete vpn ipsec site-to-site peer 200.0.23.3 tunnel 0 remote prefix '200.3.3.3/32' [vy003:VyOS1.4] delete vpn ipsec site-to-site peer 200.0.12.1 tunnel 0 local prefix '200.3.3.3/32' delete vpn ipsec site-to-site peer 200.0.12.1 tunnel 0 remote prefix '200.1.1.1/32' set vpn ipsec site-to-site peer 200.0.12.1 tunnel 0 protocol gre
疎通確認
host100からhost200へ疎通可能である事を確認します。
[host100:RockyLinux8.4] [root@host100 ~]# ping 192.168.200.200 -c 3 PING 192.168.200.200 (192.168.200.200) 56(84) bytes of data. 64 bytes from 192.168.200.200: icmp_seq=1 ttl=62 time=1.77 ms 64 bytes from 192.168.200.200: icmp_seq=2 ttl=62 time=1.53 ms 64 bytes from 192.168.200.200: icmp_seq=3 ttl=62 time=1.65 ms --- 192.168.200.200 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2004ms rtt min/avg/max/mdev = 1.532/1.649/1.767/0.101 ms [root@host100 ~]#
設定削除
次の検証シナリオに備えて、今まで投入した設定を削除します。
[vy001:VyOS1.4] delete interfaces tunnel delete protocols bgp delete vpn ipsec [vy003:VyOS1.4] delete interfaces tunnel delete protocols bgp delete vpn ipsec
動作確認 (3) VTI(virtual tunnel interface)
IPsecはVTI(virtual tunnel interface)を介した接続が可能です。VTI(virtual tunnel interface)は、IPsecが確立される機器間で確立されるトンネルです。
前述の設定に比べると、トンネル確立の手間や暗号化対象の指定などの設定を省略する事ができ、やや簡潔に設定をする事ができます。
VTIの作成
vy001とvy003にVTIを作成します。
[vy001:VyOS1.4] set interfaces vti vti10 address 192.168.13.1/24 [vy003:VyOS1.4] set interfaces vti vti10 address 192.168.13.3/24
IPsec設定
VTIを使用する場合は以下のようにIPsecを設定します。暗号化の対象を定義する必要はなく、トンネルを経由したものが自動的に暗号化されます。
[vy001:VyOS1.4] set vpn ipsec esp-group MyESPGroup proposal 1 encryption 'aes128' set vpn ipsec esp-group MyESPGroup proposal 1 hash 'sha1' set vpn ipsec ike-group MyIKEGroup proposal 1 dh-group '2' set vpn ipsec ike-group MyIKEGroup proposal 1 encryption 'aes128' set vpn ipsec ike-group MyIKEGroup proposal 1 hash 'sha1' set vpn ipsec site-to-site peer 200.0.23.3 authentication mode 'pre-shared-secret' set vpn ipsec site-to-site peer 200.0.23.3 authentication pre-shared-secret 'SomePreSharedKey' set vpn ipsec site-to-site peer 200.0.23.3 ike-group 'MyIKEGroup' set vpn ipsec site-to-site peer 200.0.23.3 local-address '200.0.12.1' set vpn ipsec site-to-site peer 200.0.23.3 vti bind vti10 set vpn ipsec site-to-site peer 200.0.23.3 vti esp-group 'MyESPGroup' [vy003:VyOS1.4] set vpn ipsec esp-group MyESPGroup proposal 1 encryption 'aes128' set vpn ipsec esp-group MyESPGroup proposal 1 hash 'sha1' set vpn ipsec ike-group MyIKEGroup proposal 1 dh-group '2' set vpn ipsec ike-group MyIKEGroup proposal 1 encryption 'aes128' set vpn ipsec ike-group MyIKEGroup proposal 1 hash 'sha1' set vpn ipsec site-to-site peer 200.0.12.1 authentication mode 'pre-shared-secret' set vpn ipsec site-to-site peer 200.0.12.1 authentication pre-shared-secret 'SomePreSharedKey' set vpn ipsec site-to-site peer 200.0.12.1 ike-group 'MyIKEGroup' set vpn ipsec site-to-site peer 200.0.12.1 local-address '200.0.23.3' set vpn ipsec site-to-site peer 200.0.12.1 vti bind vti10 set vpn ipsec site-to-site peer 200.0.12.1 vti esp-group 'MyESPGroup'
IPsecが確立された事を確認します。
[vy001:VyOS1.4] vyos@vy001:~$ show vpn ike sa Peer ID / IP Local ID / IP ------------ ------------- 200.0.23.3 200.0.23.3 200.0.12.1 200.0.12.1 State IKEVer Encrypt Hash D-H Group NAT-T A-Time L-Time ----- ------ ------- ---- --------- ----- ------ ------ up IKEv2 AES_CBC_128 HMAC_SHA1_96 MODP_1024 no 83 0 vyos@vy001:~$ vyos@vy001:~$ vyos@vy001:~$ show vpn ipsec sa Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal ------------------- ------- -------- -------------- ---------------- ---------------- ----------- ------------------------ peer_200-0-23-3_vti up 2m40s 204B/0B 3/0 200.0.23.3 N/A AES_CBC_128/HMAC_SHA1_96 vyos@vy001:~$
IPsec設定
host100とhost200が互いに疎通可能になるように、ダイナミックルーティングを設定します。
[vy001:VyOS1.4] set protocols bgp address-family ipv4-unicast network 192.168.100.0/24 set protocols bgp local-as '65000' set protocols bgp neighbor 192.168.13.3 remote-as '65000' [vy003:VyOS1.4] set protocols bgp address-family ipv4-unicast network 192.168.200.0/24 set protocols bgp local-as '65000' set protocols bgp neighbor 192.168.13.1 remote-as '65000'
疎通確認
host100からhost200へ疎通可能である事を確認します。
[host100:RockyLinux8.4] [root@host100 ~]# ping 192.168.200.200 -c 3 PING 192.168.200.200 (192.168.200.200) 56(84) bytes of data. 64 bytes from 192.168.200.200: icmp_seq=1 ttl=62 time=1.68 ms 64 bytes from 192.168.200.200: icmp_seq=2 ttl=62 time=1.51 ms 64 bytes from 192.168.200.200: icmp_seq=3 ttl=62 time=1.62 ms --- 192.168.200.200 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2004ms rtt min/avg/max/mdev = 1.512/1.605/1.682/0.077 ms [root@host100 ~]#