关于pac文件对本机IPv6地址解析的方法

Posted by admin on March 9, 2010

更新:2010-03-23 22:42:59

更新说明:测试不够充分,刚才又发现了几个之前没注意的问题,补充更新之。

更新1:Firefox 3.6的myIpAddress()函数对于有IPv6协议栈的主机的支持还是有问题,经过在Windows XP SP3+Firefox 3.6上测试,发现返回的是::1!

临时解决方法:about:config中,手工编辑设置项:network.dns.disableIPv6为true

chrome的最新代码分支已经解决了这个bug!

更新2:在Firefox中调试pac文件的技巧!

直接alert(msg),然后在“错误控制台”里可以看到msg

更新3:IE支持一系列新的pac扩展函数,主要针对的就是IPv6的支持!见参考资源4.

更新4:Ubuntu 9.04+Firefox 3.6组合下,myIpAddress()函数返回的地址居然是127.0.1.1! 好在Chrome 5解析依然可以返回正确的本机IP地址。

更新5:在Ubuntu下修复Firefox的解析bug可以采用修改hosts文件的方法,具体来说,添加本机的默认路由IP地址所对应主机名(bash下可以使用hostname命令查看当前主机名)的记录。

如:

118.zzz.xxx.167    your-computer-name

自从买了主机以来,一直使用pac文件来实现智能的代理上网,支持的智能代理功能包括:

  1. 根据本机IP地址是教育网还是公网选择正确的默认代理地址,达到在教育网访问免费IP地址站点时直连,在公网访问教育网地址时使用学校的代理或VPN
  2. 根据目的网址是否被河蟹选择正确的代理地址

刚开始的时候一直有一个bug没有解决,那就是在学校使用的时候无法正确的识别本机IP地址,使用ADSL时就没有问题。通过一段时间的摸索之后,发现了问题所在!

IPv6!

由于教育网已经普及了IPv6地址,因此Firefox在解释执行myIpAddress()函数时返回的IP地址是IPv6的地址!而我之前在pac脚本里一直使用的是这段代码来判断本机IP地址的:

isInNet(myIpAddress(),"59.64.0.0","255.255.0.0")

上述代码在纯IPv4环境中是没有问题的,但关键问题是在有IPv6地址的主机上,myIpAddress()返回的地址格式是IPv6格式的!因此,isInNet函数就会解析失败了。

通过Google和自己的动手实践,现在改用以下代码来检测本机IP地址

if (shExpMatch(myIpAddress(), "*:59.64.*") || isInNet(myIpAddress(),"59.64.0.0","255.255.0.0") )

通过一段时间的测试来看,在以下平台和浏览器上测试通过上述代码:

  1. Windows XP:  Firefox 3.6/IE 8/Chrome 5
  2. Ubuntu: Firefox 3.6/Chrome 5

附几段有用的pac代码片段

var resolved_ip = dnsResolve(host);

if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
		isInNet(resolved_ip, "172.16.0.0",  "255.240.0.0") ||
		isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
		isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
{
	return "DIRECT";
}
DEFAULT = "PROXY proxy.bupt.edu.cn:8080";

if(/\.cnki\.net/i.test(url))  return "DIRECT";
if(/\.ieee\.org/i.test(url)) return "DIRECT";
if(/\.sciencedirect\.com/i.test(url)) return "DIRECT";
if(/\.edu\.cn/i.test(url)) return "DIRECT";
if(/\.springerlink\.com/i.test(url)) return "DIRECT";

参考资源

  1. proxy.pac myIpAddress() returns incorrect format?
  2. Autoconfigure Scripts for Proxy Settings – Apr. 22, 2004
  3. http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt
  4. http://blogs.msdn.com/wndp/archive/2006/07/18/IPV6-WPAD-for-WinHttp-and-WinInet.aspx