一、問題描述
前端是連接因特網的路由器,中間利用LINUX –IPTABLES搭建的防火牆,由PPPOE協議承擔撥入功能,並開通NAT,后端是客戶機,故障現象是當LINUX系統撥入VPN后,LINUX系統本身域名解析和網站瀏覽正常,NAT后端客戶機出現域名解析正常但網站瀏覽失敗。
二、問題解決
我們在給防火牆加入以下規則后,網絡通信恢復正常。
iptables -A FORWARD -p tcp -m tcp--tcp-flags SYN,RST SYN -j TCPMSS--clamp-mss-to-pmtu
我們現在來看下這條規則的具體功能,-A 是增加,-FORWARD是要處理通過的數據包,-p,指定要審查tcp協議,審查內容是SYN, RST標志,TCPMSS,是指通過TCPMSS模塊調整MSS的大小。
那么為什么通過調整MSS的大小就可以解決的網絡通信的故障呢?
三、MSS和MTU
1、什么是TCP-MSS?
MSS: Maxitum Segment Size 最大分段大小,MSS就是TCP每次能夠傳輸的最大數據分段。為了達到最佳的傳輸效能,TCP協議在建立連接時要協商雙方的MSS值,現實情況下,常使用二層協議中的MTU值代替。

TCP報文中MSS的位置在選項的位置,選項中內容有很多種,MSS是其中的一種。MSS在TCP報文中是可選項不是必選項,換句話說MSS是可協商的,而且在協商過后該選項內容可以改變也可以沒有,在協商MSS時一般是建立TCP連接的兩端發送[Syn]標志報文時互相通報然后選取最小MSS作為雙方的約定。
這里又出現了一個概念,MTU。
2、什么是MTU
我們可以根據下面這面圖表來了解MTU
MTU:MaxitumTransmission Unit 最大傳輸單元,在以太網中數據幀最長為1518Bytes,扣除幀頭14Bytes和幀尾CRC校驗部分4Bytes,承載上層協議的數據部分最大是1500Bytes. 這個值我們就把它稱之為MTU。網絡層的IP協議會根據這個值來決定如何對數據進行分片,在網絡,兩台終端進行網絡通信時,數據需要經過各種型號的路由器和多種傳輸媒介才能到達對端,網絡中不同媒介的MTU各不相同,最終取值由最小的MTU值決定。對於網絡層的上層協議而言,它們對MTU的值並沒有特別關心,它們認為這個是網絡層的工作。網絡層IP協議會檢查每個從上層協議下來的數據包的大小,並根據本機MTU的大小決定是否作“分片”處理。分片最大的壞處就是降低了傳輸性能,所以在網絡層更高一層(傳輸層)的實現中往往會對此加以注意。有些高層協議要求在IP包中設置DF標志,DF(Donot Fragment),說明不能進行分片,這樣當這個IP數據包在網絡傳輸的時候,如果遇到MTU小於IP數據包的情況,轉發設備就會根據要求丟棄這個數據 包,然后返回一個錯誤信息給發送者。這樣會造成某些通訊上的問題,不過現實情況是大部分網絡鏈路都是MTU1500或者大於1500。
3、MTU和MSS的聯系
MTU是一個二層的概念,以太網最大的MTU是1500Bytes,MSS是TCP協議中一個可協商的選項,,它是TCP數據包每次能夠傳輸的最大數據分段, IP MTU=MSS+20Bytes(IP包頭)+20Bytes(TCP包頭)。在PPPoE的情況下,還要包括6Bytes的PPPoE頭部和2Bytes的PPP協議ID號,因此, PPP負載數據不能超過1492字節,也就是相當於在PPPOE環境下的MTU是1492字節,MSS是1452字節。
四、原因
現在回頭看下問題的產生原因:在利用pppoe+nat組網時,由於PPPOE是按下圖的形式進行封裝的,
| IP |
| PPP |
| PPPoE |
| Ethernet |
隨着寬帶接入,PPPOE由於具有認證和計的費功能而得廣泛應用。
下面是PPPOE的數據報文格式:
| 版本 |
類型 |
代碼 |
會話ID |
| 長度 |
凈載荷 |
||
PPPOE是通過以太網傳輸的,其含有PPPOE協議頭有6個字節和以太網幀類型2字節。這個8字節的PPPOE封裝字段會在數據從撥號接口發送出去時被添加到數據報文中。因此,該數據報文從撥號接口出去時的真實長度會大於物理以太網接口的MTU值1500,因此,該數據包將會被丟棄,PPPOE造成的影響是二次封裝耗費資源,降低了傳輸效能等等,最大的不足就是PPPoE導致MTU變小了,以太網的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492,所以在PPPOE環境下,設置接口MTU時需要將8個字節的PPPOE封裝字段考慮進去,MTU=1500-8=1492,這樣,當IP報頭(20)+ICMP報頭(8)+ICMP凈荷載長度+PPPOE頭(8)<=物理接口1500(即ICMP凈載荷<=1500-28=1472)時,該數據包不會因為數據包長度超過接口MTU值被丟棄,而且還可以在不需要分片的情況下最大限度的發送數據包,提高傳輸效率
所以有可能由於報文太大需要分片,導致必須通過設置tcpmss解決。另外IP 報文里是由五元組組成的的,報文要進行分片的,這時就有可能只有第一片報文帶有IP的五元組信息(源目的ip位址,源目的端口號,協議號),后續的分片不再保留 TCP/UDP報文所有的標識信息,如端口號信息等,這時,當網關進行NAT轉換時,將導致報文不能正確組包,
因此可以看出,MTU和TCP MSS是密不可分的,在PPPOE+NAT環境下尤為重要。如果是PPPOE+NAT上網出現網站打開不流暢,就有可能是MTU或MSS設置不當了,至此,對PPPOE+NAT上網環境下MTU和MSS的問題基本搞清楚了。
