投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2018年4月18日水曜日

【Linux CentOS 7】LibreSWAN(3.20)のIPsecトンネルでのMTUの設定について

(更新)
2019年12月25日

ホスト(tkbranch)と、ホスト(oskbranch)が、LibreSWANのトンネルで接続されている。

ホスト(tkbranch)はCentOS7で、LibreSWAN(ver. 3.20)がインストールされ、
ホスト(oskbranch)は、CentOS6で、LibreSWAN(ver. 3.12)がインストールされている。


両拠点でそれぞれに対して、pingでは導通テストができている

また、ホスト(tkbranch)からホスト(oskbranch)に、mount -t cifs で、
共有フォルダにアクセスすることができた。


しかし、ホスト(tkbranch)からホスト(oskbranch)にssh接続しようとしたところ、
無応答のままとなった。
間違ったポートを指定してみたところ、「Connection refused」と表示された。
まったくsshの通信ができていないわけではなかった。


この問題は次のようにして、
LibreSWANのIPsecトンネルに「MTU」の値を適切に指定することによって解決できた。



■LibreSWANのトンネル設定で「MTU」の値を指定した。

○MTUとは何か。

ICMPパケットは「IPヘッダー+ICMPプロトコルヘッダー+データ」で構成されている。
「IPヘッダー」は 24バイト、「ICMPプロトコルヘッダーは 4バイト」、合わせて 28バイトである。

MTUは、これに加えて、最大のデータサイズを合わせた値のことである。
MTU = 24byte + 4byte + 最大データサイズ
したがって、最大のデータサイズがいくらかを調べることで、MTUを計算できる。

pingコマンドは、データサイズを任意に変えることができる。
パケットの分割を許さないように指定しながら、通信可能な最大のデータサイズを探る。


○載せられる最大のデータサイズを探索した。

<オプションの意味>
 -c 1 一回だけ送信して相手からの応答を待つ指定
 -s データサイズの指定
 -M do 分割禁止を指定

172.16.1.11は、ホスト(oskbranch)のアドレスで、当のIPSecトンネルを通過する。

[root@tkbranch ~]# ping -c 1 -s 1400 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1400(1428) bytes of data.
1408 bytes from 172.16.1.11: icmp_seq=1 ttl=64 time=8.69 ms
--- 172.16.1.11 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 8.699/8.699/8.699/0.000 ms

応答が帰ってきたので、IPsecトンネルを通過できたとわかる


さらに、データサイズを増大させてみる。

[root@tkbranch ~]# ping -c 1 -s 1450 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1450(1478) bytes of data.
^C
--- 172.16.1.11 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
今度は応答が帰ってこなかったので、未知のMTUサイズを上回ったとわかる。
1400 < 最大データサイズ < 1450 であることがわかった


したがって、データサイズを小さくして送ってみる。

[root@tkbranch ~]# ping -c 1 -s 1440 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1440(1468) bytes of data.
^C
--- 172.16.1.11 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
まだ、ダメ。大きすぎる。

[root@tkbranch ~]# ping -c 1 -s 1430 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1430(1458) bytes of data.
^C
--- 172.16.1.11 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
もっと小さく。

[root@tkbranch ~]# ping -c 1 -s 1420 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1420(1448) bytes of data.
^C
--- 172.16.1.11 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
もうちょっと。

[root@tkbranch ~]# ping -c 1 -s 1410 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1410(1438) bytes of data.
1418 bytes from 172.16.1.11: icmp_seq=1 ttl=64 time=8.71 ms
--- 172.16.1.11 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 8.719/8.719/8.719/0.000 ms
応答が帰って来た。
1410 < 最大データサイズ < 1420 であることがわかった。


では、1411ではどうだろうか。

[root@tkbranch ~]# ping -c 2 -s 1411 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1411(1439) bytes of data.
^C
--- 172.16.1.11 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
応答がなかった。
このことから、このIPsecトンネルで送れる最大データサイズは、1410だとわかった


○MTUサイズを計算した。

・IPヘッダーサイズ「20バイト」
・ICMPプロトコルヘッダ「8バイト」
・最大データサイズ「1410バイト」

したがって、MTUサイズは三つを足し算して、「1438バイト」だとわかった。


○LibreSWANのトンネル設定ファイルにMTUの値をセットした。
MTU=1438

そして、IPsecサービスの再起動を行った。

<注意>
ところで、下記に記されている通り、現在のところ、
VTIインターフェイスを利用したVPNトンネルを構築している場合、
MTUサイズをLibreswanによる設定で変えることができないようである。
”MTU
We noticed different kernels create different MTU sizes for new VTI devices. Currently the MTU is not set by libreswan.”
実際に、VTIインターフェイスを用いたVPNトンネルの設定において、上記のようにMTUを設定してみたが、
ip a コマンドで確認しても、VTIインターフェイスのMTUは異なる値を示していた。

(参考)
・Route-based VPN using VTI
< https://libreswan.org/wiki/Route-based_VPN_using_VTI#MTU > 2019年12月25日



■動作テスト

[root@tkbranch ~]# ping -c 2 -s 1500 -M do 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 1500(1528) bytes of data.
ping: local error: Message too long, mtu=1438
ping: local error: Message too long, mtu=1438
^C
--- 172.16.1.11 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms
MTUを越えて通らないサイズのデータを指定してみた。
すると、「Message too long, mtu=1438」と教えてくれるようになった。

また、ssh root@oskbranchのアドレス コマンドで、ssh接続できるようになった。




<参考>
・Linux - MTU 最適値の導出!
< https://www.mk-mode.com/octopress/2015/11/26/linux-mtu-best-effort/ > 2018年4月18日

・ネットワーク用語 > IPヘッダ
< http://program.sagasite.info/wiki/index.php?IP%E3%83%98%E3%83%83%E3%83%80 > 2018年4月18日

・第12回 TCP/IPプロトコルを支えるICMPメッセージ (2/3)
< http://www.atmarkit.co.jp/ait/articles/0306/13/news002_2.html > 2018年4月18日

・How to Find Maximum Size of IP Data Payload that can Traverse WAN Environment Without Fragmentation
< https://support.citrix.com/article/CTX115434 > 2018年4月18日

・[Swan] Trouble with connection dropping
< https://lists.libreswan.org/pipermail/swan/2014/000756.html > 2018年4月18日

・ipsec.conf - IPsec configuration and connections
< https://libreswan.org/man/ipsec.conf.5.html > 2018年4月18日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad