<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>蓝色数据 &#187; mtu</title>
	<atom:link href="http://bluedata.org/tag/mtu/feed/" rel="self" type="application/rss+xml" />
	<link>http://bluedata.org</link>
	<description>奋斗是幸福的……</description>
	<lastBuildDate>Mon, 14 Sep 2009 01:53:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Debian 做 ADSL NAT 的 MTU 问题</title>
		<link>http://bluedata.org/2006/05/09/debian-adsl-nat-mtu/</link>
		<comments>http://bluedata.org/2006/05/09/debian-adsl-nat-mtu/#comments</comments>
		<pubDate>Tue, 09 May 2006 08:12:06 +0000</pubDate>
		<dc:creator>Bluedata</dc:creator>
				<category><![CDATA[应用技术]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[adsl]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[mtu]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[tcpmss]]></category>

		<guid isPermaLink="false">http://blog.bluedata.org/debian-adsl-nat-mtu/</guid>
		<description><![CDATA[以前用网关路由器拨号上网时使用微软的东西是没有问题的。现在换成用 Debian 拨号再使用 iptables SNAT 后，MSN 就不能登陆了，打开 www.msn.com.cn 非常慢且只能打开页面的头部，而 windowsupdate.microsoft.com 根本就打不开了。
 
google 后得知修改 PC 网卡的 MTU 值可以解决这个问题。
在 Windows 2000/XP 下修改注册表：
『HKEY_Local_Machine』-&#62;『SYSTEM』-&#62;『CurrentControlSet』-&#62;『Services』-&#62;『Tcpip』-&#62;『Parameters』-&#62;『interface』
找到所使用的网卡，『编辑』-&#62;『新增』-&#62;『DWORD值』之后，建立一个名为『MTU』的机码，右键『修改』，选择十进制，填入 1480 。
 
但是，这个方法很蹩脚呢，内网中的机器那么多，一个一个去改是很不现实的。
对网关进行修改才是正道。
 
在网关服务器上，
# ip addr sh
发现 ppp 设备的 mtu 值是 1492 。
就在 /etc/ppp/peers/dsl-provider 文件中取消了“mtu 1492”这行的注释并改为了 1480 ，重新拨号却没有变化。在 /var/log/messages 中还看到这样的信息：
Couldn't increase MTU to 1500
Couldn't increase MRU to 1500
没有设置 mtu 值的时候也会有这样的信息，这就意味着 pppoe 忽略了 mtu 这个参数。
 
没办法，继续 google ，有说 plugin rp-pppoe.so [...]]]></description>
			<content:encoded><![CDATA[<p>以前用网关路由器拨号上网时使用微软的东西是没有问题的。现在换成用 Debian 拨号再使用 iptables SNAT 后，MSN 就不能登陆了，打开 www.msn.com.cn 非常慢且只能打开页面的头部，而 windowsupdate.microsoft.com 根本就打不开了。<br />
 <br />
google 后得知修改 PC 网卡的 MTU 值可以解决这个问题。<br />
在 Windows 2000/XP 下修改注册表：<br />
『HKEY_Local_Machine』-&gt;『SYSTEM』-&gt;『CurrentControlSet』-&gt;『Services』-&gt;『Tcpip』-&gt;『Parameters』-&gt;『interface』<br />
找到所使用的网卡，『编辑』-&gt;『新增』-&gt;『DWORD值』之后，建立一个名为『MTU』的机码，右键『修改』，选择十进制，填入 1480 。<br />
 <br />
但是，这个方法很蹩脚呢，内网中的机器那么多，一个一个去改是很不现实的。<br />
对网关进行修改才是正道。<br />
 <br />
在网关服务器上，<br />
# ip addr sh<br />
发现 ppp 设备的 mtu 值是 1492 。<br />
就在 /etc/ppp/peers/dsl-provider 文件中取消了“mtu 1492”这行的注释并改为了 1480 ，重新拨号却没有变化。在 /var/log/messages 中还看到这样的信息：<br />
<font color="#008000">Couldn't increase MTU to 1500<br />
Couldn't increase MRU to 1500</font><br />
没有设置 mtu 值的时候也会有这样的信息，这就意味着 pppoe 忽略了 mtu 这个参数。<br />
 <br />
没办法，继续 google ，有说 plugin rp-pppoe.so 有 bug ，就注释掉这行，改用<br />
pty "/usr/sbin/pppoe -I eth1 -T 80 -m 1480"<br />
结果根本不能拨号了。-_-!<br />
软的不行就来硬的，直接<br />
# ifconfig ppp0 mtu 1480<br />
这下 MSN 能登陆了，但是微软的网站还是打不开。<br />
 <br />
注：Redhat 可以修改 /etc/sysconfig/networking-script/ifcfg-ppp0 ，添加 CLAMPMSS=1480 。<br />
 <br />
最后的解决办法——用 iptables 改 MTU 值。<br />
# iptables -A FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j<br />
TCPMSS --clamp-mss-to-pmtu<br />
把出站包大小改为 ppp0 的 MTU 尺寸，这下就一切正常了。<br />
MSS 既 Max Segment Size 。</p>
<p>另记：<br />
由于 Microsoft Windows 系列操作系统传送的 TCP 包请求的 segment 太大，超出了 PPPoE 的 frame 所能够接受的范围，导致 PPPoE 传送“don't fragment”的 ICMP 而不是“must fragment”，最终导致网站没有响应。这种情况称为“Black Hole Router”。<br />
—— 2006.05.13 00:30<br />
 <br />
又看了一下 /etc/ppp/ip-up.d 下的脚本，发现 0clampmss 里的内容是这样的：<br />
#!/bin/sh<br />
# Enable MSS clamping (autogenerated by pppoeconf)<br />
iptables -o "$PPP_IFACE" --insert FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu<br />
看来 Debian 的 pppoe 也早有考虑。我在做 SNAT 前清空了 iptables 规则，造成 pppoe 添加的 iptables 规则失效了。<br />
—— 2006.06.01 13:48</p>
]]></content:encoded>
			<wfw:commentRss>http://bluedata.org/2006/05/09/debian-adsl-nat-mtu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
