Diagnózis: a hálózati kapcsolatok távolról DNAT-tal vagy VPN kapcsolaton keresztül akadoznak, megállnak. MTU mindenhol jó, mégis az a tünet tapasztalható, mintha rossz érték lenne.
Megoldás röviden: a belső hálózaton a csomagok MTU-nál nagyobb méretekben is utazhatnak, mivel a hálókártya képes kezelni az ún TSO/GSO opcióval. Viszont a VPN kapcsolaton ez nem megy át, ha a VPN kliens egy alhálózaton van a másik géppel. Ilyen esetben ki kell kapcsolni a TSO/GSO-t, így:
# ethtool -K eth0 tso off
ekkor a csomagoknak maximum MTU-nyi mérete lehet.
Hálózati kommunkációs problémával kapcsolatban nyomozok, és a tcpdump ezt a kimenetet generálta egy adott, 1500 byte-nál biztosan nagyobb HTTP (kérés és) válasz küldésekor (magyarázat a log alatt):
00. 15:18:20.456694 IP client.54491 > server.www: S 3231913881:3231913881(0) win 8192 <mss 1360,nop,wscale 2,nop,nop,sackOK>
01. 15:18:20.472053 IP server.www > client.54491: S 2863046274:2863046274(0) ack 3231913882 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 6>
02. 15:18:20.479738 IP client.54491 > server.www: . ack 1 win 16660
03. 15:18:20.481257 IP client.54491 > server.www: P 1:564(563) ack 1 win 16660
04. 15:18:20.481282 IP server.www > client.54491: . ack 564 win 109
05. 15:18:20.503103 IP server.www > client.54491: . 1:2713(2712) ack 564 win 109
06. 15:18:23.500977 IP server.www > client.54491: . 1:1357(1356) ack 564 win 109
07. 15:18:23.750394 IP client.54491 > server.www: . ack 1357 win 16321
08. 15:18:23.750409 IP server.www > client.54491: . 2713:4069(1356) ack 564 win 109
09. 15:18:23.750413 IP server.www > client.54491: P 4069:4892(823) ack 564 win 109
10. 15:18:23.797477 IP client.54491 > server.www: . ack 1357 win 16321 <nop,nop,sack 1 {2713:4069}>
11. 15:18:23.814654 IP client.54491 > server.www: . ack 1357 win 16321 <nop,nop,sack 1 {2713:4892}>
12. 15:18:29.749315 IP server.www > client.54491: . 1357:2713(1356) ack 564 win 109
13. 15:18:29.796617 IP client.54491 > server.www: . ack 4892 win 16660
14. 15:18:29.823615 IP client.54491 > server.www: P 564:1242(678) ack 4892 win 16660
15. 15:18:29.845470 IP server.www > client.54491: P 4892:5117(225) ack 1242 win 131
16. 15:18:30.074072 IP client.54491 > server.www: . ack 5117 win 16603
17. 15:18:44.846259 IP server.www > client.54491: F 5117:5117(0) ack 1242 win 131
18. 15:18:44.869317 IP client.54491 > server.www: . ack 5118 win 16603
19. 15:18:44.976057 IP client.54491 > server.www: F 1242:1242(0) ack 5118 win 16603
20. 15:18:44.976069 IP server.www > client.54491: . ack 1243 win 131
Amit látok, persze lehetséges, hogy rosszul értelmezem a látottakat:
00-02: felépül a TCP kapcsolat a 80-as porton
03-04: HTTP GET parancsot küld a kliens
05: számomra teljesen érthetelen módon a webszerver egy 2712 byte méretű csomagot küld (holott előtte mss-nek 1360 és 1460-at beszéltek meg)
ezek után vár három másodpercet (gondolom valamilyen csomagvisszaigazolási limit), majd
06: újraküldi az első adatcsomagot immár kisebb, 1356-os mérettel
07-11: de a második csomag kimarad a láncból! ha megfigyelitek 1357-2713 byte-ig a csomagot még nem küldte el! gondolom ezért van az, hogy most vár 6 másodpercet, és
12: elküldi a kimaradt 2. sorszámú csomagot
13-16: maradék csomagok, adatátvitel vége
17-20: nincs már szükség a HTTP kapcsolatra, bontanak a felek
Ami tény:
server# ifconfig eth0 | grep MTU
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
A tcpdumpot a webszerveren futtattam.
A szerver ubuntu 8.04 lts.
A kliens és a szerver DSL kapcsolat mögött ül, mindkettő 1452-es MTU mellett.
A kliens egy VPN kapcsolaton (pptpd) keresztül éri el a webszervert az alábbi IP kofigurációban (példa):
szerver ip: 10.1.0.20 netmaszk: /16
kliens ip: 10.2.0.10 netmaszk: /16
A probléma a következő azon kívül, hogy minden egyes kapcsolat, ami meghaladja az MTU-t legalább 3 másodpercig megakad:
Inkrementálódnak a várakozási idők, azaz először 3, majd 6, és így tovább egyre több időt várakozik a csomagok újraküldése között,
és *nem* *jegyzi* *meg* az átvihető csomag méretét! Továbbra is próbálkozik majd a 2712 byte-ot küldeni ill. láttam
már 2720-as méretű csomagokat is (gyanúsan 1360*2).
A probléma nem csak a webes kapcsolatot érinti, hanem pl. az SSH-t is majd' mindegyik belső szerver irányába. Belső hálózaton minden tökéletes.
Kivétel: van két szerver, amit korábban telepített egy rendszergazda, azok tökéletesen működnek, ott meg sem próbál MTU-nál nagyobb csomagot küldeni.
Próbáltam már VPN nélkül is, iptables-sel DNATolva a gateway-től a webszerverig, ugyanaz a jelenség.
Mit lehet tenni? MTU-kat már állítgattam, de számomra mindenhol normálisnak tűnik.
Kérem valaki világosítson fel mit csinálok rosszul!
Összehasonlítanám a jó és a rossz szerverek sysclt-jét, de nem tudom mit keressek... :\