关于一些网络代理实现智能流量分流的研究(PAC脚本介绍及利用)

因为工作原因,需要访问一些国外的网站(科学上网),但直接FQ并不方便,于是研究了一些代理软件,比如Nydus,Green等,

在Nydus的Proxy版本中发现了实现国内国外流量的智能分流的办法,通过搜索和分析发现其中原理是通过一个叫PAC脚本的东东来实现的。

1、什么是代理脚本(PAC)
一个PAC文件其实就是一个文本文件,最简单的格式就是包含一个叫FindProxyForURL的
JScript函数,IE通过传入两个变量来调用这个函数,一个是用户浏览的地址URL全路经,
一个是这个URL中的主机名部分(host)。这个FindProxyForURL函数有三种可能的字符串
返回值,一是"DIRECT",就是直接连接,不通过代理;二是"PROXY proxyaddr:port",
其中proxyaddr和port分别是代理的地址和代理的端口;三是"SOCKS socksaddr:port",
其中socksaddr和port分别是socks代理的地址和端口,一个自动代理文件可以是多个
选择的组合,其中用分号(;)隔开,如:
  
   function FindProxyForURL(url,host)
   {
     if (host == "www.mydomain.com")
         return "DIRECT";

return "PROXY myproxy:80;
                 PROXY myotherproxy:8080;
                 DIRECT";
   }
  
  
2、下面是代理脚本可能用到的函数和说明:
PAC Helper Functions

dnsDomainIs(host, domain)              Returns true if the host is part of the
                                       specified domain, false otherwise.

isInNet(hostname,                      Resolves the hostname and subnet IP,
                                       subnet mask) returns true if the
                                       hostname is within the subnet specified
                                       by the IP address and the subnet mask,
                                       false otherwise.

isPlainHostName(host)                  Returns true if there are no dots in the
                                       hostname, false otherwise.

isResolvable(host)                     Internet Explorer tries to resolve the
                                       hostname through DNS and returns true if
                                       successful, false otherwise.

localHostOrDomainIs                    Returns true if the host matches (host,
                                       domain) the host portion of the domain,
                                       or if the host matches the host and
                                       domain portions of the domain, false
                                       otherwise. (Executed only for URLs in
                                       the local domain.)

dnsDomainLevels(host)                  Returns the number of dots in the
                                       hostname.

dnsResolve(host)                       Returns a string containing the IP
                                       address of the specified host.

myIPAddress( )                         Returns a string containing the local
                                       machine’s IP address.

shExpMatch(url, shexp)                 Returns true if the supplied URL matches
                                       the specified shell expression, false
                                       otherwise.

dateRange(parmList)                    Returns true if the current date falls
                                       within the dates specified in parmList,
                                       false otherwise.

timeRange(parmList)                    Returns true if the current time falls
                                       within the times specified in parmList,
                                       false otherwise.

weekdayRange(parmList)                 Returns true if today is within the days
                                       of the week specified in parmList, false
                                       otherwise.

3、下面是各个函数应用的例子:
  a、isPlainHostName(host),本例演示判断是否为本地主机,如http://myservername/
  的方式访问,如果是直接连接,否则使用代理
  function FindProxyForURL(url, host)
  {
    if (isPlainHostName(host))
      return "DIRECT";
    else
      return "PROXY proxy:80";
  }
 
  b、dnsDomainIs(host, "")、localHostOrDomainIs(host, ""),本例演示判断访问主机
  是否属于某个域和某个域名,如果属于.company.com域的主机名,而域名不是
  www.company.com和home.company.com的直接连接,否则使用代理访问。
  function FindProxyForURL(url, host)
  {
    if ((isPlainHostName(host) ||
       dnsDomainIs(host, ".company.com")) &&
      !localHostOrDomainIs(host, "www.company.com") &&
      !localHostOrDomainIs(host, "home.company.com"))

return "DIRECT";
    else
      return "PROXY proxy:80";
  }
 
  c、isResolvable(host),本例演示主机名能否被dns服务器解析,如果能直接访问,否
  则就通过代理访问。
  function FindProxyForURL(url, host)
  {
    if (isResolvable(host))
      return "DIRECT";
    else
      return "PROXY proxy:80";
  }
 
  d、isInNet(host, "", ""),本例演示访问IP是否在某个子网内,如果是就直接访问,
  否则就通过代理,例子演示访问清华IP段的主页不用代理。
  function FindProxyForURL(url, host)
  {
    if (isInNet(host, "166.111.0.0", "255.255.0.0"))
      return "DIRECT";
    else
      return "PROXY proxy:80";
  }
 
e、shExpMatch(host, ""),本例演示根据主机域名来改变连接类型,本地主机、*.edu、
  *.com分别用不同的连接方式。
  function FindProxyForURL(url, host)
  {
    if (isPlainHostName(host))
      return "DIRECT";
    else if (shExpMatch(host, "*.com"))
      return "PROXY comproxy:80";
    else if (shExpMatch(host, "*.edu"))
      return "PROXY eduproxy:80";
    else
      return "PROXY proxy:80";
  }
 
f、url.substring(),本例演示根据不同的协议来选择不同的代理,http、https、ftp、
  gopher分别使用不同的代理。
  function FindProxyForURL(url, host)
  {
      if (url.substring(0, 5) == "http:") {
        return "PROXY proxy:80";
      }
      else if (url.substring(0, 4) == "ftp:") {
        return "PROXY fproxy:80";
      }
      else if (url.substring(0, 7) == "gopher:") {
        return "PROXY gproxy";
      }
      else if (url.substring(0, 6) == "https:") {
        return "PROXY secproxy:8080";
      }
      else {
        return "DIRECT";
      }
  }
 
  g、dnsResolve(host),本例演示判断访问主机是否某个IP,如果是就使用代理,否则直
  接连接。
  unction FindProxyForURL(url, host)
  {
      if (dnsResolve(host) == "XXX.XXX.XXX.XXX") {
        return "PROXY secproxy:8080";
      }
      else {
        return "PROXY proxy:80";
      }
  }
 
  h、myIpAddress(),本例演示判断本地IP是否某个IP,如果是就使用代理,否则直接使
  用连接。
  function FindProxyForURL(url, host)
  {
      if (myIpAddress() == "XXX.XXX.XXX.XXX") {
        return "PROXY proxy:80";
      }
      else {
        return "DIRECT";
      }
  }
 
  i、dnsDomainLevels(host),本例演示访问主机的域名级数是几级,就是域名有几个点
  如果域名中有点,就通过代理访问,否则直接连接。
  function FindProxyForURL(url, host)
  {
      if (dnsDomainLevels(host) > 0) { // if number of dots in host > 0
        return "PROXY proxy:80";
      }
        return "DIRECT";
  }
 
  j、weekdayRange(),本例演示当前日期的范围来改变使用代理,如果是GMT时间周三
  到周六,使用代理连接,否则直接连接。
  function FindProxyForURL(url, host)
  {
    if(weekdayRange("WED", "SAT", "GMT"))
     return "PROXY proxy:80";
    else
     return "DIRECT";
  }
 
  k、最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。
function FindProxyForURL(url,host)
{
      return randomProxy();
}

function randomProxy()
{
     switch( Math.floor( Math.random() * 5 ) )
     {
         case 0:
             return "PROXY proxy1:80";
             break;
         case 1:
             return "PROXY proxy2:80";
             break;
         case 2:
             return "PROXY proxy3:80";
             break;
         case 3:
             return "PROXY proxy4:80";
             break;
         case 4:
             return "PROXY proxy5:80";
             break;
     }   
}

利用上面的函数和例子说明,大家就可以写出比较复杂有效的自动代理脚本。

当完成PAC的编写以后,在某个HTTP服务器上挂上pac的文件,比如对外提供如:http://127.0.0.1:8080/test.pac这样的地址。

再设置系统的代理设置为脚本地址,填上如上地址就可以了。轻松分流。国内国外两不误。

附上MAC系统的设置截图(windows在internet设置里面):

不但这些商业软件会有类似的实现,而且在著名的ShadowProxy中也有Pac的利用(因为一些原因,GitHub上已经找不到源码了, Nydus的代理版就是类似的一个商业化版本,目前还可以用)

除此了PAC这种方法以外,我还看到有一些VPN也提供了分流的方式,不过目前还不知道具体原理。以后再研究吧。

时间: 2024-08-03 19:08:15

关于一些网络代理实现智能流量分流的研究(PAC脚本介绍及利用)的相关文章

网络代理的基础知识

常见的网络代理技术有vpn代理,http代理,socket代理等.打开fireFox浏览器看见其常见网络连接配置很多,本文将逐步讲解其每项代理的意义及配置方法: 一.Socks原理介绍 1.Socket套接字介绍 Socket套接字实际上是基于TCP/IP的一组应用程序接口,应用层的程序通过调用Socket套接字来实现网络间的进程通信. 2.Socks5原理介绍 Socks5是一个代理协议,位于传输层(TCP/UDP等)与应用层之间.Socks软件包组成为如下结构: Socks库:安装于客户端.

网络分流器|智能网卡作用于服务器降低负载

网络分流器|智能网卡|服务器降负载戎腾网络分流器|智能网卡主要用于降低分析服务器的负载,降低服务器的负载有以下三种技术途径: (1) 提高报文到达服务器多核中每个核的性能及流量分配的均衡能力: (2) 通过多种过滤机制在网卡上衰减无关流量: (3) 在执行应用层分析时,通过将会话层还原(俗称拼包)过程下移(Offload)到智能网卡上,通过智能网卡与CPU的并行计算提高整体应用层分析性能.戎腾的智能网卡包括基于定制硬件的PCAP和基于多核平台的SMA两类.前者用于报文过滤与捕获,同时解决10G

网络分流器|智能网卡|服务器降负载

网络分流器|智能网卡|服务器降负载戎腾网络分流器|智能网卡主要用于降低分析服务器的负载,降低服务器的负载有以下三种技术途径:(1) 提高报文到达服务器多核中每个核的性能及流量分配的均衡能力:(2) 通过多种过滤机制在网卡上衰减无关流量:(3) 在执行应用层分析时,通过将会话层还原(俗称拼包)过程下移(Offload)到智能网卡上,通过智能网卡与CPU的并行计算提高整体应用层分析性能.戎腾的智能网卡包括基于定制硬件的PCAP和基于多核平台的SMA两类.前者用于报文过滤与捕获,同时解决10G POS

世界杯百T级CDN智能流量调度系统的实战分享

摘要: 在刚刚落幕的重庆云栖上,阿里云高级技术专家仔晟为现场观众带来议题<百T级CDN智能流量调度系统的实战分享>,重点介绍了在世界杯直播业务场景之下,阿里云CDN的产品架构.技术方案与客户实践. 在刚刚落幕的重庆云栖上,阿里云高级技术专家曾福华为现场观众带来议题<百T级CDN智能流量调度系统的实战分享>,重点介绍了在世界杯直播业务场景之下,阿里云CDN的产品架构.技术方案与客户实践. 曾福华老师的分享从CDN系统相关介绍.智能调度产品.世界杯场景优化三个方面展开. CDN系统相关

Android模拟器设置网络代理方法

在服务器上启动模拟器的时候加了--http-proxy,但是不起作用.所以搜了下面的方法 四种方法: 一:将网络连接代理设置写入配置数据库 (适合启动模拟器无界面) 1.通过命令行或者通过双击emulatoer可执行文件,打开模拟器 2.在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)) 3.执行 ls -l /data/data/com.android.pr

Docker网络代理设置

背景 在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理.我们通常会将网络代理直接配置在/etc/environment./etc/profile之类的配置文件中,这对于大部分操作都是可行的.然而,docker命令却使用不了这些代理.比如docker pull时需要从外网下载镜像,就会出现如下错误: $ docker pull hello-world Unable to find image 'hello-world:latest' locally Pulling reposito

Proxy SwitchySharp chrome网络代理【转】

Proxy SwitchySharp chrome网络代理插件概述 SwitchySharp 是 Google Chrome 浏览器上的一个代理管理扩展程序,是一款可以自己设置谷歌浏览器使用方式的chrome谷歌浏览器插件,插件是针对谷歌浏览器而开发的一款代理设置插件,基于"Proxy Switchy!"和 "SwitchyPlus"开发,能够帮助用户轻松快捷的管理和切换多个代理设置,用户可以自定义切换规则,自由畅游互联网的海洋.另外proxy switchysha

《UNIX/Linux网络日志分析与流量监控》新书发布

本书从UNIX/Linux系统的原始日志(Raw Log)采集与分析讲起,逐步深入到日志审计与计算机取证环节.书中提供了多个案例,每个案例都以一种生动的记事手法讲述了网络遭到入侵之后,管理人员开展系统取证和恢复的过程,案例分析手法带有故事情节,使读者身临其境地检验自己的应急响应和计算机取证能力. 本书使用的案例都是作者从系统维护和取证工作中总结.筛选出来的,这些内容对提高网络维护水平和事件分析能力有重要的参考价值.如果你关注网络安全,那么书中的案例一定会引起你的共鸣.本书适合有一定经验的UNIX

《Unix/Linux网络日志分析与流量监控》获2015年度最受读者喜爱的IT图书奖

<Unix/Linux网络日志分析与流量监控>获2015年度最受读者喜爱的IT图书奖.刊登在<中华读书报>( 2015年01月28日 19 版) 我的2015年新作刊登在<中华读书报>( 2015年01月28日 19 版) 原文下载:http://epaper.gmw.cn/zhdsb/images/2015-01/28/19/2015012819_pdf.pdf 这3本原创Linux图书,全部收录于中国科学院图书馆.国图以及211.985高校图书馆,广获读者好评,在当