关于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