概要
設定
set interfaces openvpn vtun1 encryption cipher 'aes256gcm' set interfaces openvpn vtun1 hash 'sha512' set interfaces openvpn vtun1 local-address 192.168.101.1 set interfaces openvpn vtun1 local-port '30000' set interfaces openvpn vtun1 mode 'site-to-site' set interfaces openvpn vtun1 openvpn-option 'auth-nocache' set interfaces openvpn vtun1 persistent-tunnel set interfaces openvpn vtun1 protocol 'udp' set interfaces openvpn vtun1 remote-address '192.168.101.2' set interfaces openvpn vtun1 tls ca-certificate 'ca.crt' set interfaces openvpn vtun1 tls certificate 'vyos1.crt' set interfaces openvpn vtun1 tls crypt-key 'ta.key' set interfaces openvpn vtun1 tls dh-params 'dh.pem' set interfaces openvpn vtun1 tls role 'passive' set interfaces openvpn vtun1 tls tls-version-min '1.3'
set interfaces openvpn vtun1 encryption cipher 'aes256gcm' set interfaces openvpn vtun1 hash 'sha512' set interfaces openvpn vtun1 local-address 192.168.101.2 set interfaces openvpn vtun1 local-port '30000' set interfaces openvpn vtun1 mode 'site-to-site' set interfaces openvpn vtun1 openvpn-option 'auth-nocache' set interfaces openvpn vtun1 openvpn-option 'remote-cert-tls server' set interfaces openvpn vtun1 persistent-tunnel set interfaces openvpn vtun1 protocol 'udp' set interfaces openvpn vtun1 remote-address '192.168.101.1' set interfaces openvpn vtun1 remote-host '192.168.70.2' set interfaces openvpn vtun1 remote-port '30000' set interfaces openvpn vtun1 tls ca-certificate 'ca.crt' set interfaces openvpn vtun1 tls certificate 'vyos2.crt' set interfaces openvpn vtun1 tls crypt-key 'ta.key' set interfaces openvpn vtun1 tls role 'active' set interfaces openvpn vtun1 tls tls-version-min '1.3'
MTU
TunnelインターフェイスのMTU
デフォルトのTunnelインターフェイスのMTUは1500byteに設定されています。
vyos@vyos2:~$ ifconfig vtun1: flags=4305mtu 1500 inet 192.168.101.2 netmask 255.255.255.255 destination 192.168.101.1 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) RX packets 4 bytes 336 (336.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 640 (640.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
この為、Tunnelインターフェイス上で送信できるPingのデータサイズは1472byteが上限です。計算式:1472+20(IP)+8(ICMP)=1500byte。
vyos@vyos2:~$ /bin/ping 192.168.101.1 -c 4 -M do -s 1472
PING 192.168.101.1 (192.168.101.1) 1472(1500) bytes of data.
1480 bytes from 192.168.101.1: icmp_seq=1 ttl=64 time=1.43 ms
1480 bytes from 192.168.101.1: icmp_seq=2 ttl=64 time=0.576 ms
1480 bytes from 192.168.101.1: icmp_seq=3 ttl=64 time=1.42 ms
1480 bytes from 192.168.101.1: icmp_seq=4 ttl=64 time=1.42 ms
--- 192.168.101.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3034ms
rtt min/avg/max/mdev = 0.576/1.210/1.430/0.366 ms
物理インターフェイス上ではフラグメントされている
Tunnelインターフェイスは物理インターフェイス上に仮想的に作られたインターフェイスであり、本稿の設定ではUDPでカプセル化されています。つまり、UDPのオーバーヘッド分を考慮すると、物理インターフェイス上ではフラグメントされています。
同じようにTunnelインターフェイス上でPingを実行します。
vyos@vyos2:~$ /bin/ping 192.168.101.1 -c 4 -M do -s 1472
PING 192.168.101.1 (192.168.101.1) 1472(1500) bytes of data.
1480 bytes from 192.168.101.1: icmp_seq=1 ttl=64 time=1.43 ms
1480 bytes from 192.168.101.1: icmp_seq=2 ttl=64 time=0.576 ms
1480 bytes from 192.168.101.1: icmp_seq=3 ttl=64 time=1.42 ms
1480 bytes from 192.168.101.1: icmp_seq=4 ttl=64 time=1.42 ms
--- 192.168.101.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3034ms
rtt min/avg/max/mdev = 0.576/1.210/1.430/0.366 ms
対向の物理インターフェイス上でパケットを確認すると、flags [+]でフラグメントされていることが分かります。
当初、flags [+]の意味が分からずWireSharkで確認してたのですが、flags [+]はフラグメントされたパケット、flags [DF]はフラグメントされていないパケットのようです。
vyos@vyos1:~$ tcpdump -i eth0 port 30000 -vvv 08:21:56.515170 IP (tos 0x0, ttl 64, id 27135, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: UDP, length 1521 08:21:56.515344 IP (tos 0x0, ttl 64, id 34759, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: UDP, length 1521 08:21:57.515778 IP (tos 0x0, ttl 64, id 28004, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: UDP, length 1521 08:21:57.516167 IP (tos 0x0, ttl 64, id 35354, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: UDP, length 1521 08:21:58.517216 IP (tos 0x0, ttl 64, id 28892, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: UDP, length 1521 08:21:58.517363 IP (tos 0x0, ttl 64, id 36037, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: UDP, length 1521 08:21:59.572446 IP (tos 0x0, ttl 64, id 28895, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: UDP, length 1521 08:21:59.572550 IP (tos 0x0, ttl 64, id 36737, offset 0, flags [+], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: UDP, length 1521
少しずつ下げていき、1423byteでPingを実行します。
vyos@vyos2:~$ /bin/ping 192.168.101.1 -c 4 -M do -s 1423
PING 192.168.101.1 (192.168.101.1) 1423(1451) bytes of data.
1431 bytes from 192.168.101.1: icmp_seq=1 ttl=64 time=0.458 ms
1431 bytes from 192.168.101.1: icmp_seq=2 ttl=64 time=0.430 ms
1431 bytes from 192.168.101.1: icmp_seq=3 ttl=64 time=0.390 ms
1431 bytes from 192.168.101.1: icmp_seq=4 ttl=64 time=0.491 ms
--- 192.168.101.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3069ms
rtt min/avg/max/mdev = 0.390/0.442/0.491/0.037 ms
同じくパケットを確認すると、flags [DF]となり、フラグメントされていません。
vyos@vyos1:~$ tcpdump -i eth0 port 30000 -vvv 08:26:09.946196 IP (tos 0x0, ttl 64, id 13128, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: [udp sum ok] UDP, length 1472 08:26:09.946317 IP (tos 0x0, ttl 64, id 63366, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: [bad udp cksum 0x1330 -> 0x8195!] UDP, length 1472 08:26:10.966058 IP (tos 0x0, ttl 64, id 13325, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: [udp sum ok] UDP, length 1472 08:26:10.966155 IP (tos 0x0, ttl 64, id 63385, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: [bad udp cksum 0x1330 -> 0x2cdb!] UDP, length 1472 08:26:11.988437 IP (tos 0x0, ttl 64, id 13961, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: [udp sum ok] UDP, length 1472 08:26:11.988531 IP (tos 0x0, ttl 64, id 63735, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: [bad udp cksum 0x1330 -> 0x8550!] UDP, length 1472 08:26:13.014732 IP (tos 0x0, ttl 64, id 14434, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.3.30000 > 192.168.70.2.30000: [udp sum ok] UDP, length 1472 08:26:13.014839 IP (tos 0x0, ttl 64, id 63837, offset 0, flags [DF], proto UDP (17), length 1500) 192.168.70.2.30000 > 192.168.70.3.30000: [bad udp cksum 0x1330 -> 0x1668!] UDP, length 1472
Tunnelインターフェイスのオーバーヘッド
物理インターフェイスのMTU:1500byteに収まるようにTunnelインターフェイスのMTUを求めると次のようになります。
①1423+①20+③8=1451byte
①Tunnelインターフェイス上のデータ送信において物理インターフェイス上でフラグメントされない最大サイズ
②IPヘッダー
③ICMPヘッダー
つまり、Tunnelインターフェイスのオーバーヘッドは1500-1451=49byteです。ただし、暗号化の方式、カプセル化をTCPにする等でオーバーヘッドは変化する為、設定内容に応じて確認が必要です。
UDPヘッダー:8byte