關於MTU (Maximum transmission unit)

* MTU工作在鏈路層,是網卡傳輸(發送/接受)的數據楨最大長度。 * Ethernet(乙太網)最大MTU是1500,通常也是大部分設備默認值 * 網卡收到的數據楨長度超過該網卡的MTU時:如果數據楨里的IP或ICMP數據包header沒有DF標誌(Don’t Fragment flag),將數據分楨(fragmentation),分楨後第二個及以後的楨中只含有一部分IP header,並且沒有tcp和udp header;否則,丟棄這個數據楨,並且給src ip發送一個「ICMP fragmentation required「並附帶自己的MTU值,src可以根據這個MTU值調整自己發送的數據楨長度。(Path MTU Discovery)。 * 向網卡發送數據時,如果IP數據包長度(header + payload)超過了網卡的MTU,也會進行相同處理。 * TCP協議連接時會協商MSS(maximum segment size ), 本機的MSS是MTU減去ip header減去tcp header長度,最大為1460。取連接雙方MSS的較小值。 IPv4 header長度最小為20 IPV6 header長度最小為40 ICMPv4 header長度為20+8 ICMPV6 header長度為40+8 TCP header長度為20 UDP header長度為8 IP(V4 & V6) payload(數據部分)長度最大為65535,因為header中表示長度部分是兩位元組。 測試鏈路MTU # 1472是ethernet最大值,因為ICMP header長度28 ping -s 1472 -M do 8.8.8.8 #超出長度會從最後通過的路由器(這裏就是本機網卡地址)返回ICMP錯誤(如果該路由器防火牆禁止ICMP則沒有返回,直接超時無響應) ping […]

Continue reading

VPN翻牆與P2P下載

#假裝懂技術 #GFW促進學習 在路由器上部署了VPN Client和chnroutes後,連接到國外VPS的VPN Server後,整個區域網內所有設備能夠透明翻牆,但是一些P2P軟件會遇到問題。 P2P軟件需要監聽固定埠,並且需要外網的機器能夠主動連接到運行P2P軟件內網機器。方法是用路由器的「埠映射」功能,將公網IP的某些埠映射到內網某個機器上。這是通過iptables的DNAT實現的: 假設在路由器管理界面中將10400-10499埠映射到192.168.0.4,路由器會添加下面的iptables規則(由於WAN IP通常不是固定的,路由器會在ppp撥號或DHCP獲得公網IP後動態添加這些規則): iptables -t NAT -A PREROUTING -d -p tcp –dport 10400:10499 -j DNAT –to 192.168.0.4 iptables -t NAT -A PREROUTING -d -p udp –dport 10400:10499 -j DNAT –to 192.168.0.4 但是部署OpenVPN和chnroutes後,國外的IP就不能主動和內網機器建立連接了(即使已經按照上面方法在路由器上開啟了埠映射),因為這時國外IP看到的是VPS的IP,不是路由器的公網IP。 要使路由器部署VPN時仍然支持內網P2P下載和其它需要外網埠的應用,需要在VPS和路由器上同時增加新的iptables DNAT規則。 首先,需要知道路由器所使用的OpenVPN客戶端證書的(X509) common name,這個common name是在生成證書時指定的,OpenVPN easy-rsa創建證書時默認使用文件名作為common name。可以在證書crt文件中查看其common name [email protected]:/etc/openvpn/easy-rsa/keys# cat client-common.crt Certificate: Data: Version: 3 (0x2) Serial […]

Continue reading

架設區域網翻牆網關方法

任一台linux機器都可以,不需要配置路由器。 假設LAN網段是192.168.1.0/24 首先在192.168.1.A上正常部署OpenVPN Client和chnroutes,這樣本機就可以翻牆了 然後用下面命令(可以放在啟動腳本rc.local里) echo 1 > /proc/sys/net/ipv4/ip_forward # or below #sysctl -w net.ipv4.ip_forward=1 # or edit /etc/sysctl.conf, # add (or edit) the following line # then run “sysctl -p” (permanant) #net.ipv4.ip_forward=1 #可以加-o tun0條件,在開啟chnroutes時這使得LAN內機器能夠受益於ICMP Redirect,對國內IP直接路由到原始網關 #但會在某些綁定IP和MAC的網絡環境下遇到問題。 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE 就可以了了。區域網內的其它機器只需要將網關改為192.168.1.A,就可以透明翻牆並且國內外分流 此方法適用於公司內自己機器架設VPN翻牆然後分享給同事。

Continue reading

OpenVPN丟包率嚴重

在國外VPS上部署的OpenVPN。客戶端使用static key模式連接,可能因為沒有使用tls模式,埠一直沒有被封。但是長時間連接VPN後丟包率很高,超過30%,有時甚至達到80%。懷疑GFW干擾。 驗證方法很簡單:我的VPS有兩個同一網段IP,A.B.C.67和A.B.C.68,OpenVPN監聽前者埠 ping A.B.C.67 丟包率為0,正常。 ping A.B.C.68 丟包率非常高,干擾嚴重 路由中A.B.C.67是直連的,A.B.C.68走的VPN。 結論是GFW選擇性丟棄了OpenVPN的數據包。 —- VPN是我唯一選擇的翻牆手段,配合第三方固件路由器、dnsmasq、chnroutes和策略路由可以達到最佳效果:LAN所有設備透明翻牆、國內外IP分流、支持CDN加速和P2P下載。這些是其它翻牆方式很難實現的。

Continue reading