<?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; ipv6</title>
	<atom:link href="http://blog.lifetoy.org/tag/ipv6/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lifetoy.org</link>
	<description>Something more</description>
	<lastBuildDate>Sun, 31 Jan 2010 14:41:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>在 NAT 后面使用 ISATAP 连接 IPv6</title>
		<link>http://blog.lifetoy.org/2010/01/31/isatap-behide-nat/</link>
		<comments>http://blog.lifetoy.org/2010/01/31/isatap-behide-nat/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 14:40:44 +0000</pubDate>
		<dc:creator>寒水远山</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[isatap]]></category>
		<category><![CDATA[nat]]></category>

		<guid isPermaLink="false">http://blog.lifetoy.org/?p=73</guid>
		<description><![CDATA[寒假回家想用 isatap 连接 ipv6, 但是家里是用路由器上网, isatap 默认在 NAT 后面没法正常工作. 考虑到路由器后面只有我一台机器需要 ipv6 连接, 于是开始瞎折腾, 想办法把所有 isatap 的数据全部定向到我那台机器上. 我机器的系统是 win7, 路由器系统是 openwrt brcm-2.4. 首先在路由器防火墙里面加条规则, 把收到的协议号是 41 的数据包全部重定向到我的机器上面. 像 isatap, 6to4 等协议的协议号都是 41. openwrt 可以直接修改 /etc/config/firewall : config redirect option src                      wan option dest                     lan option dest_ip          192.168.11.2 option proto            41 其他类似的系统 (如 dd-wrt 之类的) 应该可以直接用 iptables 修改. [...]]]></description>
			<content:encoded><![CDATA[<p>寒假回家想用 isatap 连接 ipv6, 但是家里是用路由器上网, isatap 默认在 NAT 后面没法正常工作. 考虑到路由器后面只有我一台机器需要 ipv6 连接, 于是开始瞎折腾, 想办法把所有 isatap 的数据全部定向到我那台机器上.<span id="more-73"></span><br />
我机器的系统是 win7, 路由器系统是 openwrt brcm-2.4.</p>
<p>首先在路由器防火墙里面加条规则, 把收到的协议号是 41 的数据包全部重定向到我的机器上面. 像 isatap, 6to4 等协议的协议号都是 41. openwrt 可以直接修改 /etc/config/firewall :</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">config redirect
option src                      wan
option dest                     lan
option dest_ip          192.168.11.2
option proto            <span style="">41</span></pre></div></div>

<p>其他类似的系统 (如 dd-wrt 之类的) 应该可以直接用 iptables 修改.</p>
<p>不过改了这些之后还是上不了网. 抓包之后觉得可能是因为数据包的 link-local 地址和全局的 ipv6 地址不对, 于是用 netsh 人肉指定了一下这两个地址. 我写了个简单的 bat 来搞这件事情.</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
&nbsp;
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">interface</span>=isatap.lan     // 这个是我 isatap interface 的名字
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">prefix</span>=&quot;<span style="color: #cc66cc;">2001</span>:da8:<span style="color: #cc66cc;">8000</span>:d010&quot;  // 我用的是上交的 isatap router
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">ip</span>=&quot;220.x.x.x&quot;     // 这个是我路由器的外网 ip
&nbsp;
<span style="color: #00b100; font-weight: bold;">for</span> /f &quot; tokens=<span style="color: #cc66cc;">2</span> delims=<span style="color: #33cc33;">%</span><span style="color: #33cc33;">%</span> &quot; <span style="color: #33cc33;">%%</span><span style="color: #448888;">a</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #66cc66;">&#40;</span>'&quot;netsh int ipv6 show addr <span style="color: #33cc33;">%</span><span style="color: #448888;">interface</span><span style="color: #33cc33;">%</span> | findstr /r ^Address.*Parameters$&quot;'<span style="color: #66cc66;">&#41;</span> <span style="color: #00b100; font-weight: bold;">do</span> netsh int ipv6 <span style="color: #b1b100; font-weight: bold;">del</span> addr <span style="color: #33cc33;">%</span><span style="color: #448888;">interface</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">%%</span><span style="color: #448888;">a</span>
&nbsp;
netsh int ipv6 add addr <span style="color: #33cc33;">%</span><span style="color: #448888;">interface</span><span style="color: #33cc33;">%</span> fe80::5efe:<span style="color: #33cc33;">%</span><span style="color: #448888;">ip</span><span style="color: #33cc33;">%</span>
netsh int ipv6 add addr <span style="color: #33cc33;">%</span><span style="color: #448888;">interface</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">prefix</span><span style="color: #33cc33;">%</span>:<span style="color: #cc66cc;">0</span>:5efe:<span style="color: #33cc33;">%</span><span style="color: #448888;">ip</span><span style="color: #33cc33;">%</span>
&nbsp;
netsh int ipv6 isa s s d
netsh int ipv6 isa s s e</pre></div></div>

<p>搞定了这些之后就可以连通 ipv6 站点了 <img src='http://blog.lifetoy.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ps. 最后想了个歪办法来解决路由器后面有多个机器需要 ipv6 连接的情况, 就是每个机器用一个不同的 isatap router.  <img src='http://blog.lifetoy.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lifetoy.org/2010/01/31/isatap-behide-nat/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>VPN over IPv6</title>
		<link>http://blog.lifetoy.org/2009/09/11/vpn-over-ipv6/</link>
		<comments>http://blog.lifetoy.org/2009/09/11/vpn-over-ipv6/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 14:19:43 +0000</pubDate>
		<dc:creator>寒水远山</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[vpn]]></category>
		<category><![CDATA[xl2tpd]]></category>

		<guid isPermaLink="false">http://lifetoy.org/?p=9</guid>
		<description><![CDATA[最近对学校的 VPN 相当不满, 且不说 50 RMB 一个月的价格, 还没正式开学网速就已经慢得忍无可忍, 再加上网络上那啥长城最近越来越 BT, 浏览网页时不时出现的 Connection Reset 让人郁闷至极. (吐槽完毕). 恰好原来租的 DreamHost 马上就要到期了. 正准备考虑以后网页要放哪里的时候, 看到原来一起合租 DreamHost 的一位朋友提到, 可以自己租一个支持 IPv6 的 VPS, 在上面架个 VPN 服务器上网, 顺便还可以穿墙. 学校免费且不限速的 IPv6 网络实在太适合干这种坏事了 :grin: .想法是挺好, 不过折腾起来倒是有些麻烦. 目前支持 IPv6 的 VPN 服务器/客户端还寥寥无几. Google 了一下主要有这几种解决方案: OpenVPN + IPv6 patch 感觉 OpenVPN 算最著名的开源 VPN 解决方案了, 可是这玩意居然不支持 IPv6 实在让我感到诧异. [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-15" href="https://www.lifetoy.org/2009/09/11/vpn-over-ipv6/applications-internet/"><img class="size-full wp-image-15 alignright" title="applications-internet" src="/wp-content/uploads/2009/09/applications-internet.png" alt="applications-internet" width="64" height="64" /></a>最近对学校的 VPN 相当不满, 且不说 50 RMB 一个月的价格, 还没正式开学网速就已经慢得忍无可忍, 再加上网络上那啥长城最近越来越 BT, 浏览网页时不时出现的 Connection Reset 让人郁闷至极. (吐槽完毕). 恰好原来租的 DreamHost 马上就要到期了. 正准备考虑以后网页要放哪里的时候, 看到原来一起合租 DreamHost 的一位朋友<a href="http://www.briefdream.com/seeking-vps-co-tenant/" target="_blank">提到</a>, 可以自己租一个支持 IPv6 的 VPS, 在上面架个 VPN 服务器上网, 顺便还可以穿墙. 学校免费且不限速的 IPv6 网络实在太适合干这种坏事了 :grin:  .<span id="more-9"></span>想法是挺好, 不过折腾起来倒是有些麻烦. 目前支持 IPv6 的 VPN 服务器/客户端还寥寥无几. Google 了一下主要有这几种解决方案:</p>
<ol>
<li>OpenVPN + IPv6 patch<br />
感觉 OpenVPN 算最著名的开源 VPN 解决方案了, 可是这玩意居然不支持 IPv6 实在让我感到诧异. 搜了一下发现早在 04 年邮件列表里面就已经有 IPv6 的讨论了, 并且当时已经有人给出了一个 IPv6 的 patch. 翻了一下 OpenVPN 的 SVN, 看到<a href="http://svn.openvpn.net/projects/openvpn/patches/openvpn-2-1_alpha3a-tcpbind/" target="_blank">某个 2.1 alpha 的 branch</a> 里面是有 IPv6 patch, 一看时间是 05 年  :| , 不知道为啥后来没有进 trunk.<br />
根据作者的说明, 这个 patch 只支持 linux, 于是直接被我 pia 飞了, 因为我在用 Windows <img src='http://blog.lifetoy.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . 不过后来发现这个方法居然已经有商业运营了, 号称 &#8220;IPv6 直通车&#8221;. 看来下它的客户端,  里面包含一个 OpenVPN 的 Windows 版本和一个 proxy.exe. 猜测那个 proxy.exe 是本地监听了一个 v4 的 udp 端口, 然后把所有数据转发到直接的 v6 地址上去. 感觉真囧  <img src='http://blog.lifetoy.org/wp-includes/images/smilies/icon_confused.gif' alt=':-?' class='wp-smiley' />  .</li>
<li>Tinc<br />
官方网站赤裸裸地说对 IPv6 支持良好. 经过某人测试, 的确如此——Linux 客户端确实对 IPv6 支持良好, 不过 Windows 下面就悲剧了. 看了下 mailing list 也提到过这个问题, 然后作者放了一个自己都不知道会不会 work 的 patch = =||, 没胆量去尝试. 就算能用, 我也不想在 Windows 下面折腾这种东西. 最讨厌在 Windows 下面用 mingw 编译这种所谓跨平台程序了, 经常还得弄个 <a href="http://www.mingw.org" target="_blank">MSYS</a> 跑脚本, 烦死.</li>
<li>PPTP<br />
Windows 自带客户端, 并且支持 IPv6 (Vista 以后的版本), 客户端的问题就不用考虑了. 不过服务端有些悲剧, 邮件列表上面说那个已经不知道有多 old 的 <a href="http://www.poptop.org" target="_blank">poptop</a> 对 IPv6 的 GRE 数据处理上有问题. 因为对 GRE 不熟悉, 所以也没去搞这个东西.</li>
<li>L2TP<br />
同样是 Windows 自带客户端, 同样也支持 IPv6. 服务端是 <a href="http://www.xelerance.com/software/xl2tpd/" target="_blank">xl2tpd</a>. 测试了一下, 服务端不支持 IPv6. 不过整个 L2TP 协议用 udp 传输, 感觉 udp 协议的东西 hack 起来还是比较简单的.</li>
</ol>
<p>于是准备动手乱搞下 xl2tpd. 一开始写了个类似 port proxy 的东西, 在服务端监听 v6 的端口 (虽然 v6 和 v4 的端口是公用的 -,-), 然后把数据包转发给监听在 v4 端口的 xl2tpd. 不过后来觉得处理多连接的时候真麻烦 (莫非就是因为这个原因 Windows 自带的 Portproxy 只支持 tcp 连接?), 于是直接对 xl2tpd 动手了. 为了偷懒, 改的方法也很暴力: 直接用 sed 把几个常见的函数和结构改成 v6 的版本, 然后稍微修改些别的地方直到编译通过 :P . 这里把自己修改的东西整理成一个 patch, 需要的童鞋可以<a href="/?attachment_id=13" target="_blank">点这里</a>下载. 同样是我比较懒的缘故, patch 过的版本直接忽略了配置文件里面的几个选项, 像listen addr, lac range. 另外做client的时候, 如果server地址含有冒号, 要在最后补上端口号(:1701).</p>
<p><img class="size-full wp-image-11 alignleft" title="L2TP Windows Client" src="/wp-content/uploads/2009/09/vpnstat.png" alt="L2TP Windows Client" width="377" height="456" /></p>
<p>虽然是山寨的东西, 不过用了几周之后感觉还不错 <img src='http://blog.lifetoy.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . 贴一份截图供围观.</p>
<p>在上面提到的之外, 还有其他更为简单 (但是山寨) 的方案. 事实上, 除了上面 (1) (2) 两种是基于 TAP 的, 其他的都是基于 PPP 的. 从我个人的感觉来看, 相对于 TAP, PPP 包括了一套相对完整的协议, 并且在各个操作系统上面都有较好的实现, 同时扩展性也不差, 使用起来也更为方便. 如果想完全自己山寨的话, 也可以之后用 netcat 搞定: 用 netcat 在两台机器间建立一个 tcp 或者 udp 的通道, 然后把 ppp 数据全部重定向到通道里面去. 这个在 Linux 下面实现还是相当容易的, 通过 pppd 的 pty 参数或者重定向默认 pppd 的 stdin 都可以. 当然, 上面提到过的自己写一个端口转发的工具也是可以的.</p>
<p>不过在实际情况中还有一些麻烦的东西需要考虑. 首先虽然 tcp 更为通用 (我这里的通用是指, tcp 协议更能适应国内各种奇怪的网络限制, 譬如穿透代理服务器, 或者是 SSL 隧道), 但是无疑它的效率不如 udp. 稳定的, 面向连接的协议在这种情况下会付出的更多: 更长的 packet header, 以及用不到的维持连接和确认状态的包 (像 tcp 中各种 ack 包). 另外, MTU/MRU 的问题也非常烦人, 像 netcat 就不用说了, 遇到这种问题基本残废, 改就算用专门的 VPN 软件, 设置的时候也要小心. 改小了感觉性能不佳, 改大了又可能会出各种问题. 我第一次配置 VPN 的时候, 就遇到过这类问题: http 网页都能正常访问, 但是 https 连接就不正常, 后来改了 MRU 之后才解决 (当然用 iptables 修改 TCPMSS 也是可以的).</p>
<p>说到底搞了这么复杂, 还是 IPv6 不够普及的原因, 如果 IPv6 普及了, 估计各个 VPN 服务器/客户端都会争先恐后地添加 v6 的支持. 只是那个时候估计 IPv6 的网络就不会免费, 这个 VPN 方法也用不成了 :P .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lifetoy.org/2009/09/11/vpn-over-ipv6/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
	</channel>
</rss>
