AIX Path MTU Discovery / TCP MSS

 ( lacos | 2012. november 23., péntek - 19:03 )

AIX veteránok véleményére lennék kíváncsi az alábbi probléma kapcsán, köszönettel.

Adott egy AIX ssh kliens és egy Linux ssh szerver, sok hop távolságra egymástól. Kettejük között található egy ipsec gateway, amelyen az MTU 1294 byte.

AIX->Linux irányban működőképes a "traceroute" parancs (külön "tracepath" nincs, de az AIX traceroute-ba bele van építve az MTU csökkentése szükség esetén). Ez a pontos PMTU-t nem keresi meg (cca. 1400-ról mindjárt cca. 1000-re ejti, majd nem megy feljebb; a valós gateway MTU a kettő között van).

Linux->AIX irányban kezdeményezve sem a traceroute, sem a tracepath-t, sem a beépített PMTUD nem működik (brutál tűzfalszabályok vannak); jobb híján a helyi 1500-as MTU-t veszi PMTU-nak a Linux.

A probléma az, hogy az alábbi parancs:

aix$ ssh linux cat bigfile

"megakad".

tcpdump szerint az AIX a SYN packet-be 1300-at rak MSS-nek.

Linux a SYN/ACK-ba 1460-as MSS-t tesz (PMTU - IP hdrs - TCP hdrs == 1500 - 20 - 20 == 1460, ahol ugye a PMTU=1500 nem valós, csak éppen a tűzfalszabályok miatt nem találja meg a Linux PMTUD az igazi PMTU-t, ezért a helyi MTU-val, 1500-zal dolgozik).

A csomagokon be van nyomva a DF (don't fragment). Ez feltehetően annak a következménye, hogy PMTUD után nincs értelme fragmentálni.

Amikor a Linux az első 1300 byte-os csomagot küldi (az AIX-tól kapott MSS-nek megfelelően), DF-fel, akkor a gateway az út közepén ezt kikukázza, és küld egy "Fragmentation required / DF flag set" ICMP csomagot a Linux ssh szervernek. Ennek nincs hatása (bár úgy tűnik, megérkezik); a Linux nem kezd tördelni, és a kimenő szegmensméretet sem csökkenti.

Az alábbi kerülőket találtuk:

  • AIX MTU csökkentése 1294-re vagy alája. Ekkor az AIX által a SYN-ben küldött MSS is kisebb, így a Linux kisebb csomagokat küld, amelyek átjutnak az ipsec gateway-en.
  • Linux-on a net.ipv4.ip_no_pmtu_disc sysctl-lel kikapcsolva a PMTUD-t úgy látszik, hogy a "fragmentation required" üzeneteket a Linux figyelembe veszi, és tördel.

Mindkettő statikus/globális beállítás, ezért kellemetlen.

A kérdésem az, hogy ennek az egésznek lehet-e oka az AIX szerver félrekonfigurálása. A weben találtam tcp_pmtu_discover és tcp_mssdflt nevű kernelbeállításokat. Az olvasottak alapján úgy gondolom, hogy ha ezeket rosszul állítják be (= PMTUD kikapcsolása, plusz mind az interface MTU, mind az interface-hez (ill. a route-hoz) tartozó default MSS-nek a gateway MTU fölé állítása), akkor az indokolja a látottakat.

Lényegében az AIX által kiküldött 1300-as MSS valótlan (korrekt PMTUD-nek nem lehet az eredménye!), és azok a csomagok, amelyeket a Linux valóban ekkorára méretez, elakadnak a gateway-ben. Az onnan származó "fragmentation required / DF set" ICMP üzeneteket pedig a Linux nem veszi figyelembe, amikor a saját PMTUD-je nincs letiltva.

Látott már valaki ilyet?

Köszönöm.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A Linux hostnak küldött ICMP hibaüzenet tartalmazza a megfelelő MTU-t?

Igen, a tcpdump szerint "need to frag (mtu 1294)".

Ha az AIX oldaláról nem menne, a Linux oldalán is meg lehet közelíteni a probléma megoldását.
Azt írod, hogy a Linux által küldött 1300 byte-os csomagra a gateway ICMP Destination Unreachable Fragmentation Needed and Don't Fragment was Set üzenettel reagál. Meg kellene nézni, hogy a Linuxon nincs-e szűrve INPUT irányban a Type 3 Code 4, lehet hogy emiatt nem működik a Linux felől a PMTUD.

Ha máshogy nem megy, a Linuxon kézzel is be lehet vésni az adott host irányába a megfelelő méretet, például:
# ip route add to 192.168.2.10/32 via 192.168.1.254 mtu 1294 advmss 1254

A másik lehetőség az iptables --set-mss vagy --clamp-mss-to-pmtu alkalmazása.

Mondjuk írja, hogy:
"Linux-on a net.ipv4.ip_no_pmtu_disc sysctl-lel kikapcsolva a PMTUD-t úgy látszik, hogy a "fragmentation required" üzeneteket a Linux figyelembe veszi, és tördel."

Szerintem ez megoldja a problémát.
Azt nem tudom, hogy mit csinál az iptables clamp-mss-to-pmtu, ha a sysctl nincs átállítva...

"Jegyezze fel a vádhoz - utasította Metcalf őrnagy a tizedest, aki tudott gyorsírni. - Tiszteletlenül beszélt a feljebbvalójával, amikor nem pofázott közbe."

Igen, utólag észrevettem, hogy az INPUT tűzfalas rész felesleges, viszont pont hogy nem a /proc/sys/net/ipv4/ip_no_pmtu_disc segítségével (1-re állításával) szeretné megoldani, mivel "Mindkettő statikus/globális beállítás, ezért kellemetlen.". A specifikus route plusz mtu és advmss opció viszont biztosan csak arra az irányra vonatkozik, amit megad neki az ember.

Köszi!

@AIX így hirtelen: route add -host destinationIP gatewayIP -mtu 1294
(rebootnál elfelejti)

Az elején is érdemes lenne elkezdeni: miatökért kell ssh-t beipsecezni? :)
Illetve, ha ez így jó nektek, akkor válaszd bármelyik megoldást, amit eddig találtál - jobbat nem fogsz, erre mérget vehetsz.
(Nameg mindig elborítja a vér az agyamat, hogy a retardált programozó belöki a DF bitet az IP fejlécbe, mert miért ne.)