ãã¹MTUãã£ã¹ã«ããªãŒãã©ãã¯ããŒã«ã«é¢ããããã€ãã®èšè
åå ãã代ããã«
çã®ã·ã¹ãã 管çè ïŒãŸãã¯ãã®ããã«æ¯ãèã管çè ïŒããšã«1åãçå®ã®ç¬éã蚪ããŸãã 圌ã«ã¯ãGNU / Linuxãã€ã³ã¹ããŒã«ãããŠããã³ã³ãã¥ãŒã¿ãŒã§ã«ãŒã¿ãŒãæ§æããéåœããããŸãã ãã§ã«ããã«åæ ŒããŠãã人ã¯ãããã«è€éãªãã®ã¯äœããªãããšããããŠããã€ãã®ããŒã ã«äŒãããšãå¯èœã§ããããšãç¥ã£ãŠããŸãã ãããŠä»ãç§ãã¡ã®ç®¡çè ã¯ãããã®ã³ãã³ããèŠã€ããŠã³ã³ãœãŒã«ã«éããèªãããã«ãã¹ãŠããã§ã«æ©èœããŠããããšããŠãŒã¶ãŒã«äŒããŸãã ããããããã¯ãããŸãã-ãŠãŒã¶ãŒã¯èªåã®ãæ°ã«å ¥ãã®ãµã€ããéããªããšèšããŸãã 圌ã®äººçã®äžéšã詳现ã®è§£æã«è²»ãããåŸãã»ãšãã©ã®ãµã€ãã¯æ¬¡ã®ããã«åäœããããšãããããŸããã
1.ããŒãžãéããšãã¿ã€ãã«ãããŒãããããã以äžã¯äœããããŸããã
2.ãã®ç¶æ ã§ã¯ãããŒãžã¯ç¡æéã«ãã³ã°ããŸãã
3.ãã©ãŠã¶ã®ã¹ããŒã¿ã¹ããŒã¯åžžã«ãããŒãžãããŒããããŠããããšã瀺ããŸãã
4.ãã®ãµã€ããžã®Pingãšãã¬ãŒã¹ã¯åé¡ãããŸããã
5.ããŒã80ãžã®telnetæ¥ç¶ãæ£åžžã«æ©èœããŸãã
ãã£ãããã管çè ããããã€ããŒã®ãã¯ãã«ã«ãµããŒãã«é»è©±ããŸãããããã«ãããåãé€ããWindows OSã§ã«ãŒã¿ãŒãèšå®ããããã¢ããã€ã¹ããããã§åäœããªãå Žåã¯ããŒããŠã§ã¢ã«ãŒã¿ãŒãè³Œå ¥ããŸãã
ãã®ç¶æ³ã¯å€ãã®äººã«ããç¥ãããŠãããšæããŸãã èªåèªèº«ã«é¥ã£ã人ãããã°ã圌女ãšåéã«ãªã£ã人ãããã°ããã©ãŒã©ã ãä»ã®äŒè°ã§ãã®ãããªç®¡çè ã«äŒã£ã人ãããŸããã ã ããïŒããããªãããã®ãããªç¶æ³ã«ãããªããããã§ãšãããããŸãïŒ ããªãã¯ãã©ãã¯ããŒã«ãçºèŠãããã¹MTUã«çŽé¢ããŠããŸãã ãã®èšäºã¯ããã®åé¡ãçºçããçç±ãšãã®åé¡ã解決ããæ¹æ³ã«ã€ããŠèª¬æããŠããŸãã
èšäºãç解ããããã«å¿ èŠãªçšèªã
MTUïŒMaximum Transmission UnitïŒ -ãã®çšèªã¯ãOSIãããã¯ãŒã¯ã¢ãã«ã®ããŒã¿ãªã³ã¯å±€ã§éä¿¡ã§ããæ倧ãã±ãããµã€ãºïŒãã€ãåäœïŒã決å®ããããã«äœ¿çšãããŸãã ã€ãŒãµãããã®å Žåãããã¯1500ãã€ãã§ãã ãã倧ããªãã±ãããå°çããå ŽåïŒããšãã°ãããŒã¯ã³ãªã³ã°ãä»ããŠïŒãããŒã¿ã¯MTU以äžïŒã€ãŸã1,500ãã€ã以äžïŒã®ãã±ããã«åæ§æãããŸãã å¥ã®MTUã§ã®ãã±ããã®åæ§ç¯ã®æäœã¯ãã©ã°ã¡ã³ããŒã·ã§ã³ãšåŒã°ããã«ãŒã¿ãŒã«ãšã£ãŠã¯é«äŸ¡ã§ãã
PMTUïŒãã¹MTUïŒ -ãã®ãã©ã¡ãŒã¿ãŒã¯ããœãŒã¹ãšã¬ã·ãŒããŒéã®MTUããŒã¿ãã£ãã«ã®äžã§æå°ã®MTUã瀺ããŸãã
PMTUãã£ã¹ã«ããªãŒã¯ãã«ãŒã¿ãŒã®è² è·ã軜æžããããã«èšèšãããPMTUãã£ã¹ã«ããªãŒãã¯ãããžãŒã§ãã 1988幎ã«RFC 1191ã§èª¬æãããŠããŸã ã ãã®ãã¯ãããžãŒã®æ¬è³ªã¯ã2ã€ã®ãã¹ããæ¥ç¶ããããšãDFïŒãã©ã°ã¡ã³ãåããªãïŒãã©ã¡ãŒã¿ãŒãèšå®ããããã±ããã®æçåãé²æ¢ãããããšã§ãã ããã«ãããMTUããã±ãããµã€ãºãããå°ããããŒãã¯ããã±ããã®éä¿¡ãæåŠããDestination is unreachableã¿ã€ãã®ICMPã¡ãã»ãŒãžãéä¿¡ããŸãã ãšã©ãŒã¡ãã»ãŒãžã«ã¯ãããŒãã®MTUå€ã䌎ããŸãã éä¿¡ãã¹ãã¯ãã±ãããµã€ãºãçž®å°ããåéä¿¡ããŸãã ãã®ãããªæäœã¯ããã±ãããæçåããã«å®å ãã¹ãã«å°éããã®ã«ååå°ãããªããŸã§çºçããŸãã
MSSïŒMaximum Segment SizeïŒ -æ倧ã»ã°ã¡ã³ããµã€ãºãããªãã¡ TCPãæ¥ç¶ã®ãªã¢ãŒãã®ããäžæ¹ã®ç«¯ã«éä¿¡ããããŒã¿ã®æ倧ãã£ã³ã¯ã 次ã®åŒã§èšç®ãããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹MTU-Header_IP_SizeïŒ20ãã€ãïŒ-Header_TCP_SizeïŒ20ãã€ãïŒã åèšã¯éåžž1460ãã€ãã§ãã æ¥ç¶ã確ç«ããããšãåãµã€ãã¯ç¬èªã®MSSã宣èšã§ããŸãã æå°å€ãéžæãããŸãã 詳现ã¯ãã¡ããã芧ãã ãã ã
ãã©ã°DFïŒãã©ã°ã¡ã³ãåããªãïŒ -IPãã±ããããããŒã®ãã©ã°ãã£ãŒã«ãå ã®ãããã1ã«èšå®ãããŠããå Žåããã®ãã±ããã®ãã©ã°ã¡ã³ãåãèš±å¯ãããŠããªãããšã瀺ããŸãã ãã®ãããªãã©ã°ãæã€ãã±ããã次ã®è»¢éã®MTUããã倧ããå Žåããã®ãã±ããã¯ç Žæ£ãããéä¿¡è ã«ICMPãšã©ãŒãéä¿¡ãããŸãïŒãæçåãå¿ èŠã§ãããããããã©ã°ã¡ã³ããèšå®ãããŠããŸããã
è©Šéšå Ž
ãã®åé¡ã¯å®éã«ã¯æãããç¥ã£ãŠããŸãïŒãã ããäžåžãè³ã®äžã§å«ã¶ãšãã®ãã©ãã«ã§ã¯ãããŸããïŒã ãããè¡ãããã«ãå³1ã«ç€ºããã¹ããããã¯ãŒã¯ãäœæããŸããã
å³ 1.ãã¹ããããã¯ãŒã¯ã
ããã¯ãã°ããŒãã«ãããã¯ãŒã¯ã®ç°¡æããŒãžã§ã³ã§ãã 圹å²
1. deb-serv-03ãšããååã®ã³ã³ãã¥ãŒã¿ãŒãLinuxã«ãŒã¿ãŒã§ãã éèŠ -eth2ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãMTUãµã€ãºã1400ãã€ãã«åæžãããŸããã
2. deb-serv-05-ããŒã«ã«ãããã¯ãŒã¯äžã®ã¯ã©ã€ã¢ã³ãã
3. deb-home-ãããã€ããŒã«ããã«ãŒã¿ãŒã
4. deb-serv-ããŒã¿ã亀æããã€ã³ã¿ãŒãããäžã®WebãµãŒããŒã www.site.localããã ããã«ãããµã€ãº5.9Kbã®ããŒãžãååŸããŸãã
ãã¡ãããå®éã«ã¯ãã§ãŒã³ã¯ã¯ããã«å€§ãããªããŸãããå®äŸãšããŠã¯ããã§ååã§ãã ãã®ãããã¯ãŒã¯äžã®ãã¹ãŠã®ã³ã³ãã¥ãŒã¿ãŒã¯ãDebian GNU / Linux 5.0 Lennyãå®è¡ããŠããŸãã ãããã¯ãŒã¯ã®ããŸããŸãªãã€ã³ãã§ãtcpdumpããã°ã©ã ã䜿çšããŠç¶æ³ãå¶åŸ¡ããŸãã
PMTUã®éåžžã®æ€åº
ãŸããããŒãžãéãããšãã«ãããã¯ãŒã¯äžã§äœãèµ·ããããèŠãŠã¿ãŸãããã WebãµãŒããŒããã®ããã±ãŒãžã®è¡ãæ¹ãåŠã³ãŸãã TCPDUMPïŒ1ã®åºåãèŠãŸãïŒeth0 deb-servã§ïŒïŒ
1 IP 172.16.5.3.48547 > 192.168.0.1.80: Flags [S], seq 2947128725, win 5840, options [mss 1460...], length 0
2 IP 192.168.0.1.80 > 172.16.5.3.48547: Flags [S.], seq 757312786, ack 2947128726, win 5792, options [mss 1460...], length 0
3 IP 172.16.5.3.48547 > 192.168.0.1.80: Flags [.], ack 1, win 1460, options [...], length 0
4 IP 172.16.5.3.48547 > 192.168.0.1.80: Flags [P.], seq 1:118, ack 1, win 1460, options [...], length 117
5 IP 192.168.0.1.80 > 172.16.5.3.48547: Flags [.], ack 118, win 181, options [...], length 0
6 IP 192.168.0.1.80 > 172.16.5.3.48547: Flags [.], seq 1:2897, ack 118, win 181, options [...], length 2896
7 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
8 IP 192.168.0.1.80 > 172.16.5.3.48547: Flags [.], seq 1:1349, ack 118, win 181, options [...], length 1348
9 IP 192.168.0.1.80 > 172.16.5.3.48547: Flags [.], seq 1349:2697, ack 118, win 181, options [...], length 1348
10 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
æåã®10åã®ããã±ãŒãžã®ã¿ãæäŸããæšæºã®tcpdumpåºåã®äœåãªéšåããã¹ãŠåãæšãŠãŸãã 解æïŒ
1. 1è¡ç®ãã3è¡ç®ã«ã¯ãtcpæ¥ç¶ã®ã»ããã¢ããã衚瀺ãããŸãã åœäºè ã¯SYNãSYN-ACKãACKãã±ããã亀æããŸãã ããã§ã¯ããªãã·ã§ã³ãã£ãŒã«ããã€ãŸãåœäºè éã§äº€æãããMSSãã©ã¡ãŒã¿ã«æ³šæãã䟡å€ããããŸãã äž¡åŽã§1460ãã€ãã§ãã ã€ãŸããåœäºè ãäºãã«éä¿¡ãããã±ããã®æ倧ãµã€ãºã¯ã1460ïŒMSSïŒ+20ïŒTCPããããŒïŒ+20ïŒIPããããŒïŒ= 1500ãã€ãã§ãã
2. 4è¡ç®ã§ãdeb-serv-05ããWebããŒãžã®ãªã¯ãšã¹ããéä¿¡ããŸãã è¡5ã¯ããã®ããã±ãŒãžã®åé ã確èªããŸãã
3. 6è¡ç®ã§ã¯ãèŠæ±ã«å¯Ÿããå¿çã®éä¿¡ïŒã€ãŸããWebããŒãžã®äžéšã®éä¿¡ïŒã確èªããŸãã ãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®pcapã®ç¹æ§ã«ãããtcpdumpã¯ãµã€ãºã2948ãã€ãã®ãã±ããã1ã€èªèããŸããããµã€ãºã1500ããã³1452ãã€ãã®ãã±ãã2ã€ã¯ãããããããã¯ãŒã¯ã«éä¿¡ãããŸãã tcpdumpã®ãã詳现ãªåºåãèŠããšãDFãã©ã°ããã®ããã±ãŒãžïŒãŸãã¯ããã±ãŒãžïŒã«ããããšãããããŸãã
IP (tos 0x0, ttl 64, id 5177, offset 0, flags [DF], proto TCP (6), length 2948)
192.168.0.1.80 > 172.16.5.3.48547: Flags [.], seq 1:2897, ack 118, win 181, options [nop,nop,TS val 86620459 ecr 4922429], length 2896
4.ãããã®ããŒã¿ãã±ãããdeb-serv-03ã«å°éãããšãMTU 1400ãšã®æ¥ç¶ãééã§ãããã©ã°ã¡ã³ãåã§ããªãããïŒDFãã©ã°ïŒãICMPã¡ãã»ãŒãžã¿ã€ã3ã³ãŒã4ãçæãããããã ç Žæ£ãããŸãïŒ ICMP 172.16 .5.3å°éäžèœ-ãã©ã°ã¡ã³ãåããå¿ èŠããããŸãïŒmtu 1400ïŒ ãããã¯7è¡ç®ã§èŠãããŸãïŒ10è¡ç®ã§ã¯ã2çªç®ã®ããã±ãŒãžã«ã¡ãã»ãŒãžãæ¥ãŸãïŒã ãã®ã¡ãã»ãŒãžã¯ãç®çã®MTUãéä¿¡ããŸãã
5. 8è¡ç®ãš9è¡ç®ã§ã¯ãMTU = 1400ãåä¿¡ããdeb-servããWebããŒãžã®åãéšåã1400ãã€ãã®ãµã€ãºã®ãã±ããã§éä¿¡ããæ¹æ³ã芳å¯ããŸãã ãããã®ãã±ããã¯ãããŒãžå šäœã転éããããŸã§ç¢ºèªãçæãããdeb-serv-05ã«å°éããŸãã åŸç¶ã®ãã¹ãŠã®ãã±ããã®ãµã€ãºã¯1400ãã€ã以äžã§ãã
ãã®äŸã¯ãRCF1911ã§èª¬æãããŠãããã©ã³ã¹ããŒãMTU決å®æé ïŒPMTUïŒã瀺ããŠããŸãã å³2ã«ç°¡ç¥åããŠç€ºããŸããã
å³2. PMTUã決å®ããæé ã
Path MTU Discoveryãã©ãã¯ããŒã«ãšã®ããŒãã£ã³ã°
次ã«ãæ°ããå°é家ããããã€ããŒã«æ¥ãŠãçŸåšæ åœããŠããdeb-homeãä»ããicmpãã±ããã®éä¿¡ãçŠæ¢ããïŒããšãã°ãicmpãã©ããããä¿è·ããïŒããšã決ãããšããŸãã äœãèµ·ãããèŠãŠã¿ãŸãããïŒ
TCPDUMPïŒ1åºåïŒeth0 deb-servã§ïŒïŒ
1 IP 172.16.5.3.57925 > 192.168.0.1.80: Flags [S], seq 1723325723, win 5840, options [mss 1460...], length 0
2 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [S.], seq 2482933888, ack 1723325724, win 5792, options [mss 1460...], length 0
3 IP 172.16.5.3.57925 > 192.168.0.1.80: Flags [.], ack 1, win 1460, options [...], length 0
4 IP 172.16.5.3.57925 > 192.168.0.1.80: Flags [P.], seq 1:118, ack 1, win 1460, options [...], length 117
5 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], ack 118, win 181, options [...], length 0
6 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:2897, ack 118, win 181, options [...], length 2896
7 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
8 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
9 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
10 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
TCPDUMPïŒ2åºåïŒeth0 deb-serv-03äžïŒïŒ
1 IP 172.16.5.3.57925 > 192.168.0.1.80: Flags [S], seq 1723325723, win 5840, options [mss 1460...], length 0
2 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [S.], seq 2482933888, ack 1723325724, win 5792, options [mss 1460...], length 0
3 IP 172.16.5.3.57925 > 192.168.0.1.80: Flags [.], ack 1, win 1460, options [...], length 0
4 IP 172.16.5.3.57925 > 192.168.0.1.80: Flags [P.], seq 1:118, ack 1, win 1460, options [...], length 117
5 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], ack 118, win 181, options [...], length 0
6 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
7 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
8 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1449:2897, ack 118, win 181, options [...], length 1448
9 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
10 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
11 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
12 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
13 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
14 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
15 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
16 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
17 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
18 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
19 IP 172.16.250.2 > 192.168.0.1: ICMP 172.16.5.3 unreachable - need to frag (mtu 1400), length 556
20 IP 192.168.0.1.80 > 172.16.5.3.57925: Flags [.], seq 1:1449, ack 118, win 181, options [...], length 1448
ã芧ã®ãšãããç¶æ³ã¯ããªãäºæ³ãããŸãã ååºåã®æåã®6è¡ã¯ãéåžžã®è»¢éã®å ŽåãšãŸã£ããåãã§ãïŒåã®äŸã®èª¬æãåç §ïŒã ãããããã®åŸãççŸãå§ãŸããŸãã ICMP 3ïŒ4ã¯deb-serv-03ïŒTCPDUMPïŒ2ã®è¡7ã9 11.13ã15ã17ã19ïŒã§åãæ¹æ³ã§çæãããŸãããdeb-servã¯ãããåä¿¡ããããµã€ãºã1500ãã€ãã®ãã±ãããéä¿¡ãç¶ããŸãïŒ TCPDUMPïŒ1ã®6ã12ããã³TCPDUMPïŒ2ã®6ã8ã10ã12ã14ã16ã18ã20ã æ¯åãåéä¿¡ã®ééãé·ããªããŸãïŒãããã®äŸã§ã¯ãã¿ã€ã ã¹ã¿ã³ããåé€ããŸããããTCPåéä¿¡ã¡ã«ããºã ã¯å®éã«ãã®ããã«æ©èœããŸãïŒã ãã®å ŽåãPMTUãè¶ ããããŒã¿ã¯éä¿¡ã§ããŸããã ããããæ®å¿µãªãããTCPã¯ãããèªèãããæ¥ç¶ã確ç«ããããšãã«éžæãããMSSã§ãã±ãããéä¿¡ãç¶ããŸãã ãã®ç¶æ³ã¯ã ãã¹MTUãã£ã¹ã«ããªãã©ãã¯ããŒã« ïŒãã©ã³ã¹ããŒãMTUã®å®çŸ©ã«ããããã©ãã¯ããŒã« ïŒãšåŒã°ããŸãã ç§ã¯ãããç°¡ç¥åãã圢ã§å³ã«ç€ºããããšããŸããã 3ã
å³ 3. PMTUã®å®çŸ©ã«ããããã©ãã¯ããŒã«ã
ãã®åé¡ã¯ãŸã£ããæ°ãããã®ã§ã¯ãããŸããã 2000幎ã®RFC 2923ã«èšèŒãããŠããŸã ã ããã«ãããããããããã¯å€ãã®ãããã€ããŒã®éã§ããããŸããç²ã匷ããæºããç¶ããŠããŸãã ãããããã®ç¶æ³ã責ããã®ã¯ãããã€ããŒã§ããICMPã¿ã€ã3ã³ãŒã4ããããã¯ããå¿ èŠã¯ãããŸãããããã«ãéåžžããçç±ã®å£°ãïŒã€ãŸããåé¡ãäœã§ããããç解ããŠããã¯ã©ã€ã¢ã³ãïŒãèããããããŸããã
PMTUåé¡ã®è§£æ±º
ãã¯ãã«ã«ãµããŒãã«é»è©±ããããšã¯ãããŸããããç§ãã¡ã®è³éã«åºã¥ããŠåé¡ã®è§£æ±ºã«åªããŸãã
ããã«ã€ããŠãç¥ã£ãŠããLinuxéçºè ã¯ãiptablesã«ç¹å¥ãªãªãã·ã§ã³ãæäŸããŠããŸãã ç·iptablesããã®åŒçšïŒ
TCPMSS
This target allows to alter the MSS value of TCP SYN packets, to control the maximum size for that connection (usually limiting it to your outgoing interface's MTU minus 40 for IPv4 or 60 for IPv6, respectively). Of course, it can only be used in conjunction with -p tcp. It is only valid in the mangle table. This target is used to overcome criminally braindead ISPs or servers which block "ICMP Fragmentation Needed" or "ICMPv6 Packet Too Big" packets. The symptoms of this problem are that everything works fine from your Linux firewall/router, but machines behind it can never exchange large packets:
1) Web browsers connect, then hang with no data received.
2) Small mail works fine, but large emails hang.
3) ssh works fine, but scp hangs after initial handshaking.
Workaround: activate this option and add a rule to your firewall configuration like:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
--set-mss value
Explicitly set MSS option to specified value.
--clamp-mss-to-pmtu
Automatically clamp MSS value to (path_MTU - 40 for IPv4; -60 for IPv6).
These options are mutually exclusive.
è±èªãèŠæãªäººã®ããã®ç§ã®ç¡æ翻蚳ïŒ
TCPMSS
MSS TCP SYN , ( MTU 40 IPv4 60 IPv6). , -p tcp. mangle. , "ICMP Fragmentation Needed" "ICMPv6 Packet Too Big" . â , :
1) , .
2) , .
3) ssh , scp ( : TCP " ").
: , , :
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
--set-mss
MSS .
--clamp-mss-to-pmtu
MSS (path_MTU - 40 IPv4; -60 IPv6).
.
ã芧ã®ãšããã圌ãã¯å€ãã®ããšãæžããããããã®åé¡ã®çç¶ã説æãããããŸããã ãããŠããããã€ããŒã®ãã®è¡åã¯ãç¯çœªçç¡èœïŒç¯çœªçè³æ»ïŒããšåŒã°ããç§ã¯ãããã«å®å šã«åæããŸãã ãã®ãªãã·ã§ã³ããã®äŸã§ã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã æšå¥šã«ãŒã«ãdeb-serv-03ã«è¿œå ããŸãã
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYNãRST SYN -j TCPMSS âset-mss 1360
ãããŠäœãèµ·ãã£ãã®ãèŠãŠãã ããïŒ
TCPDUMPïŒ1åºåïŒeth0 deb-servã§ïŒïŒ
1 IP 172.16.5.3.33792 > 192.168.0.1.80: flags [s], seq 1484543117, win 5840, options [mss 1360...], length 0
2 IP 192.168.0.1.80 > 172.16.5.3.33792: flags [s.], seq 2230206317, ack 1484543118, win 5792, options [mss 1460...], length 0
3 IP 172.16.5.3.33792 > 192.168.0.1.80: flags [.], ack 1, win 1460, options [...], length 0
4 IP 172.16.5.3.33792 > 192.168.0.1.80: flags [p.], seq 1:118, ack 1, win 1460, options [...], length 117
5 IP 192.168.0.1.80 > 172.16.5.3.33792: flags [.], ack 118, win 181, options [...], length 0
6 IP 192.168.0.1.80 > 172.16.5.3.33792: flags [.], seq 1:2697, ack 118, win 181, options [...], length 2696
7 IP 172.16.5.3.33792 > 192.168.0.1.80: flags [.], ack 1349, win 2184, options [...], length 0
8 IP 192.168.0.1.80 > 172.16.5.3.33792: flags [.], seq 2697:5393, ack 118, win 181, options [...], length 2696
9 IP 192.168.0.1.80 > 172.16.5.3.33792: flags [fp.], seq 5393:6380, ack 118, win 181, options [...], length 987
10 IP 172.16.5.3.33792 > 192.168.0.1.80: flags [.], ack 2697, win 2908, options [...], length 0
TCPDUMPïŒ3åºåïŒeth0 deb-serv-05äžïŒïŒ
1 IP 172.16.5.3.33792 > 192.168.0.1.80: Flags [S], seq 1484543117, win 5840, options [mss 1460...], length 0
2 IP 192.168.0.1.80 > 172.16.5.3.33792: Flags [S.], seq 2230206317, ack 1484543118, win 5792, options [mss 1360...], length 0
3 IP 172.16.5.3.33792 > 192.168.0.1.80: Flags [.], ack 1, win 1460, options [...], length 0
4 IP 172.16.5.3.33792 > 192.168.0.1.80: Flags [P.], seq 1:118, ack 1, win 1460, options [...], length 117
5 IP 192.168.0.1.80 > 172.16.5.3.33792: Flags [.], ack 118, win 181, options [...], length 0
6 IP 192.168.0.1.80 > 172.16.5.3.33792: Flags [.], seq 1:1349, ack 118, win 181, options [...], length 1348
7 IP 192.168.0.1.80 > 172.16.5.3.33792: Flags [.], seq 1349:2697, ack 118, win 181, options [...], length 1348
8 IP 172.16.5.3.33792 > 192.168.0.1.80: Flags [.], ack 1349, win 2184, options [...], length 0
9 IP 172.16.5.3.33792 > 192.168.0.1.80: Flags [.], ack 2697, win 2908, options [...], length 0
10 IP 192.168.0.1.80 > 172.16.5.3.33792: Flags [.], seq 2697:4045, ack 118, win 181, options [...], length 1348
解æïŒ
1. 1ã3è¡ç®ã§ã¯ããã§ã«TCPæ¥ç¶ãç£èŠããããšã«æ £ããŠããŸãã ãã ããMSSå€ã«æ³šæããŠãã ããã TCPDUMPïŒ1ã§ã¯ãdeb-serv-05ã¯å€1360ãåãåããŸãããTCDUMPïŒ3ã§ã¯ãMSS = 1460ã®ãã±ãããéä¿¡ãããŠããããšãããããŸãã ããã¯ãã«ãŒã«ãâset-mss 1360ã§ã©ã®ããã«æ©èœãããã瀺ããŠããŸããééãããã±ããã®MSSå€ãç·šéããŸãã æ»ã£ãŠããSYNãã±ããã®å Žåããã®å€ãç·šéãããŸãã
2.äž¡æ¹ã®çµè«ã®4è¡ç®ãš5è¡ç®ã§ãGETãªã¯ãšã¹ãã®éä¿¡ãšåä¿¡ã®ç¢ºèªã確èªããŸãã
3. TCPDUMPïŒ1ã®6è¡ç®ãšTCPDUMPïŒ3ã®6è¡ç®ãš7è¡ç®ã§ã¯ãããŒã¿ãå«ããã±ãããéä¿¡ããŠããŸãããåãã±ããã®ãµã€ãºã¯1400ãã€ããè¶ ããŠããŸããã ç¹°ãè¿ãã«ãªããŸãããTCPDUMPïŒ1ã§ã¯1ã€ã®å€§ããªãã±ããã衚瀺ãããŸãããTCPDUMPïŒ3ã§ã¯2ã€ã®ãã±ããã®å°çãèŠãããŸãã
4.ããã«ãã±ãã亀æã¯ãTCPãããã³ã«ã®ã«ãŒã«ã«åŸããŸãã ãã ãããã±ãããµã€ãºã1400ãã€ããè¶ ããããšã¯ãããŸããã
ç°¡ç¥åãã圢åŒã§ãMSSã®åäœãå³ã«ç€ºããŸãã 4.éåžžã®åäœã«äŒŒãŠãããããããŒã¿äº€æã¯è¡šç€ºããŸããã§ããã
å³ 4. MSSããã®å Žã§å€æŽããŸãã
man iptablesã«ã¯2ã€ã®ãªãã·ã§ã³ãèšèŒãããŠããŸããããããŸã§ã®ãšãã1ã€ããé©çšããŠããŸããã å¿ èŠãªãªãã·ã§ã³ã¯ãç¹å®ã®ç¶æ³ã«ãã£ãŠç°ãªããŸãã ãã¹ãŠã®ç¶æ³ã¯2ã€ã®ã¿ã€ãã«åé¡ã§ããŸãã
1.ã«ãŒã¿ãŒã§ãµã€ããæ£åžžã«éããããŒã«ã«ãããã¯ãŒã¯äžã®ã¯ã©ã€ã¢ã³ãã§åé¡ãçºçããŸãã
ãã®å Žåããã¹å šäœã«æ²¿ã£ãæå°ã®MTUã¯ãµãŒããŒäžã«ãããŸãã éåžžããããã¯PPPoEãPPtPãªã©ã®ããã€ãã®ã«ãã»ã«åãããã³ã«ã§ãã ãã®ç¶æ³ã«æé©ãªãªãã·ã§ã³ã¯-clamp-mss-to-pmtuã§ããããã¯ããã¹ãŠã®ééãã±ããã®æå°MSSãèªåçã«èšå®ããŸãã
2.ããŒã«ã«ãããã¯ãŒã¯äžã®ã«ãŒã¿ãŒãšã¯ã©ã€ã¢ã³ãã§ã¯ããµã€ãã¯éãããŸããã
ãã®å Žåãæå°ã®MTUã¯ãããã€ããŒã®ã©ããã«ãããæšæºçãªæ¹æ³ã§èšç®ããããšã¯å°é£ã§ãã ç¹ã«ãã®ããã«ãç§ã¯ãã®ç¶æ³ã«å¿ èŠãªMSSãµã€ãºã決å®ããã®ã«åœ¹ç«ã€å°ããªPythonã¹ã¯ãªãããäœæããŸããïŒPEP8ãšè¶³ã§æã€ããšãã§ããªãããšãæ¬åœã«å¿é ããŠããŸããïŒïŒ
#!/usr/bin/env python # -*-coding: utf-8 -*- import socket import os import time import sys # . # , . HOST = 'www.site.local' # , . # , # - . TIMEOUT = 25.0 # , , # . MTU BUF = 3000 # MTU . MTU = 1500 # MSS MTU-LIM-40 MTU-40. # MTU # 100-200 - . LIM = 100 # . # . TRY_TIME = 0 def set_mss(mss, action='A'): return os.system("iptables -t mangle -%s OUTPUT -p tcp --tcp-flags \ SYN,RST SYN -j TCPMSS --set-mss %d" % (action, mss) ) def check_connection(host): sock = socket.socket() sock.connect( (host, 80) ) sock.send('GET / HTTP/1.1\r\nHost: %s\r\n\r\n' % host) sock.settimeout(TIMEOUT) try: answer_size = len( sock.recv(BUF) ) except: answer_size = 0 sock.close() return answer_size def main(): mss = MTU - 40 if not check_connection(HOST): mss = MTU - 40 - LIM set_mss(mss) if not check_connection(HOST): set_mss(mss,'D') print "Error: Too small LIM" sys.exit(1) else: while check_connection(HOST): time.sleep(TRY_TIME) set_mss(mss,'D') if mss >= MTU-40: print "Error in determining MSS" sys.exit(1) mss += 1 set_mss(mss) set_mss(mss,'D') mss -= 1 print 'MSS = %d' % (mss) if __name__ == '__main__': main() sys.exit(0)
ã¹ãŒããŒãŠãŒã¶ãŒç¹æš©ã§ã¹ã¯ãªãããå®è¡ããå¿ èŠããããŸãã 圌ã®ä»äºã®ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
1.éåžžã®MSSå€ãæã€ãµã€ãããäžå®éã®ããŒã¿ãååŸããããšããŠããŸãã
2.ãããæ©èœããªãå Žåã¯ãiptables OUTPUTãã§ãŒã³ã®MSSãMTU-40-LIMã«äžããŸãã
3.ãã®åŸã§ãããŒã¿ãååŸã§ããªãå ŽåãLIMãå°ãããããšãããšã©ãŒã衚瀺ãããŸãã
4.äžè²«ããŠMSSãå¢ãããããŒã¿ãå°çããªããªãç¬éãæ¢ããŠããŸãã ãã®åŸãMSSã®æåŸã®æå¹å€ãæšå®ããŸãã
5. MSS = MTU-40ã«å°éãããšãMSSãç¹å®ã§ããªãããšã瀺ããšã©ãŒã衚瀺ãããŸãã ãã©ã°ã©ã1ã§åæ§ã®ãã§ãã¯ãå®è¡ããçµæãäžèŽããªãå Žåãããã¯èããæ©äŒã§ããããããã®ç¶æ³ã¯èª€ãã§ãã
ç®çã®MSSãåãåã£ããã察å¿ããã«ãŒã«ã«å ¥åããå¿ èŠããããŸãã ç®ã§MSSå€ãäžããããšã«ãããã¹ã¯ãªãããªãã§å®è¡ã§ããŸããã確èªããããšããå§ãããŸã-ãã±ãããéä¿¡ããããã®ãªãŒããŒããããå°ãªããªããŸãã
å€ãã®å Žåããã©ãŒã©ã ã§ã¯ãç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ã§MTUãäžããããã®ãã³ããèŠã€ããããšãã§ããŸãã ããã¯äžèœè¬ã§ã¯ãªãããšãç解ããå¿ èŠããããçµæã¯äœãããã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠç°ãªããŸãã åå è ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®1ã€ã§TCPæ¥ç¶ãäžãããšã宣èšãããMSSãæå°ãã±ãããµã€ãºã«å¯Ÿå¿ãããããå¹æããããŸãã ãã ãããããããšã³ããã€ã³ãã§ã¯ãªããäžç¶ã«ãŒã¿ãŒã®1ã€ã§ããã-clamp-mss-to-pmtuãªãã·ã§ã³ãæå¹ã«ãªã£ãŠããªãå Žåãå¹æã¯ãããŸããã
ãã®èšäºããèªå® ãå人ãç¥äººã®äž¡æ¹ã§åæ§ã®åé¡ã解決ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã ããäžåºŠããããã€ããŒã®å°é家ã«é ŒããŸã-極端ãªèŠä»¶ã¯ICMPã¿ã€ã3ã³ãŒã4ããããã¯ããŸãã-ããã¯ååã«åé¡ãåŒãèµ·ãããŸãã