1. 程式人生 > >使用ROS或Iptables作為ADSL上網路由器時,部分網站無法開啟的問題

使用ROS或Iptables作為ADSL上網路由器時,部分網站無法開啟的問題

ROS在有些情況下會出現某些網站無法開啟

原因如下

1.在使用ros的PPPOE撥號的時候(且上層的裝置是ISP的modem)設定不當就會出現網路不穩定或某些站點無法開啟

  仔細回顧一下關於PPPOE的知識, 你會發現PPPOE的MTU是1492, 但是乙太網的MTU都是1500,為什麼呢?

  因為其中有8位元組是PPP包的包頭.所以pppoe連結的MTU最大為1492.

2.tcp中的mss(最大段大小)往往需要減去ip層的包頭的通常大小20位元組(ip包頭最大為60位元組),和tcpd段的包頭的通常大小20位元組, 所以最大的MSS是1460. 所以需要在ROS的firewall的mangle表中的forward chain裡面要新增一條, 將tcp的MSS更改為1440(這個值是雙方協商的, 哪邊的小使用哪邊的, 這樣的話也就出現了為什麼有些網站打得開, 有些網站打不開, 打得開的哪一邊的防火牆設定了較小的MSS值, 至於我這裡為什麼要改成1440, 而不用1460,  我得做個測試, 看看是不是小於1500-20-20-8=1452就行)<---測試成功,果然1452就可以了

3.TCP的MSS值過大, 導致不完整的包(data部分丟失了一部分)接收後被要求reset以至於進入了一直重新建立tcp連線的迴圈當中了, 因為TCP是有狀態的連線協議, 會校驗每個資料段是否完整無缺.抓包後你會發現返回的包中校驗和欄位不對.

只要ROS的上端有xDSL裝置(modem), ROS必須更改TCPMSS值的大小.不管這個xDSL裝置是在ROS的上層還是上上層,都需要這麼做

其實只要是利用iptables核心的軟體或硬體裝置來做上網的話, 不管是pppoe撥號還是NAT, 都會遇到這個問題 

ROS解決辦法

ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn action=change-mss 1452

iptables 解決辦法

iptables -t mangle -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1452

Cisco Router

進入interface xx

ip tcp adjust-mss 1452

MTU(第二層幀的最大傳輸單元)

乙太網EthernetII最大的資料幀是1518Bytes, 減去乙太網幀的幀頭(目的MAC地址48bit=6Bytes加上源MAC地址48bit=6Bytes再加上Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes(這個部門有時候大家也把它叫做FCS),那麼剩下承載上層協議的地方也就是Data域最大就只能有1500Bytes這個值我們就把它稱之為MTU.

MSS(第四層TCP的最大段大小)

為了達到最佳的傳輸效能TCP協議在建立連線的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP資料包包頭的大小20Bytes和TCP資料段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小值確定為這次連線的最大MSS值。

所以MSS值設定過大的話會導致TCP連結一直被重置並重新發起這樣的迴圈