海外用windows听网易云音乐

前提

原本是想用mac的方法,Proxifier直接通过正向代理,添加一个国内ip的proxy server达到听网易云音乐的目的。但是,Proxifier的win版一直安装不成功,安装过程中说一个网络相关的文件需要修改。

  • 点修改之后,安装成功却导致网易邮箱大师无法使用。
  • 点不修改之后,安装也成功,但是无法使用软件本身报错说缺少winsock
  • 一番重启安装卸载折腾后,放弃Proxifier这个软件。
改用修改host的方法:

windows系统下:在C:\Windows\System32\drivers\etc路径下找到host,笔记本打开,添加反向代理host:

# 网易云音乐服务器反代 
(由 [yizhiheng](https://github.com/yizhiheng) 赞助提供; 服务器位于多伦多)
138.197.154.53 music.163.com
# 归属地查询服务器反代
138.197.154.53 ip.ws.126.net
# HTTPS DNS 服务器屏蔽
0.0.0.0 music.httpdns.c.163.com
# m10 服务器
125.39.1.27 m10.music.126.net
以上反代来源: https://jixun.moe/2017/02/24/oversea-netease-cloud-music-by-hosts/

PAC和反向代理

PAC的原理和配置说明

PAC文件实际上是一个Script, 通过PAC我们可以让系统根据情况判断使用哪一个Proxy来访问目标网址, 这样做的好处:

  1. 分散Proxy的流量,避免Proxy Server负载过高
  2. 针对个别条件设定, 加快浏览速度
  3. 设定请求顺序, 自动依次尝试多个Proxy途径


    PAC原理

PAC文件是纯文本, 格式和JavaScript一样, 不能包含任何HTML标签, 一定要定义的是Function FindProxyForURL

function FindProxyForURL(url, host) {
  ...
}

如果使用了PAC, 则浏览器在接受我们要求的网址后会去执行
ret = FindProxyForURL(url, host). 其中,
url是所要求网址的完整路径,
host是对方的计算机名称(就是在://和/之中的部份).
return值ret是Proxy的组态. 它的格式有下列三种:
DIRECT: 直接联机而不透过Proxy
PROXY host:port: 使用指定的Proxy
SOCKS host:port: 使用指定的Socks代理
比如说当浏览器得到的是Proxy aa.bb.cc:3128; Proxy bb.cc.dd:3128; DIRECT的话,那浏览器会先尝试aa.bb.cc:3128, 如果无法使用, 再尝试bb.cc.dd:3128, 还是不行的话, 就直接联机.

PAC中的预设函数

在PAC中,除了可以使用一般JavaScript的Function外, 它还定义了一些预设的函数

isPlainHostName(host)
host 由网址取得的主机名称.
此 Function 会判断 host 是否为不包含网域 (Domain). 如果不包含则 return true, 如果包含则 return false.

dnsDomainIs(host, domain)
host 由网址取得的主机名称.
domain 指定的网域.
此 Function 会判断 host 是否属于网域 domain. 如果是则 return true, 否则return false.

localHostOrDomainIs(host, hostdom)
host 由网址取得的主机名称.
hostdom 完整的网域名称.
此 Function 会判断 host 是否为 hostdom,或 host 是否为 hostdom 的主机名称. 如果是则 return true, 否则 return false.

isResolvable(host)
host 由网址取得的主机名称.
此 Function 会尝试透过 DNS 去解析 host,如果解析成功则 return true, 否则return false.

isInNet(host, pattern, mask)
host主机名称,可以是 Domain Name 或 IP. 如果是 Domain Name,则会透过 DNS 查出 IP.
pattern IP.
mask对应于pattern的遮盖.
此 Function 会 host 是否在指定的 IP 范围内,如果是则 return true, 否则 return false.

dnsResolve(host)
host 要透过 DNS 解晰的主机名称.
此 Function 会透过 DNS 去解析 host,return 值即为解析之结果.

myIpAddress()
此 Function 会 return 浏览器所在计算机之 IP 地址.

dnsDomainLevels(host)
host 由网址取得的主机名称.
此 Function 会 return host 的 Domain 层数(点的数目).

shExpMatch(str, shexp)
str 要进行比对的字符串.
shexp 比对的条件.
此 Function 会比对 str 是否符合 shexp 的表示式(此表示式为 shell expression 而非 regular expressions). 如果是则 return true, 否则 return false.

weekdayRange(), dateRange(), timeRange()
这三个函数的功用都是检查线在时间是否在指定范围内,可以设定分时段使用代理服务.
根据不同时间选择不同代理

例如:
周一到周五

if (weekdayRange("MON", "FRI")) {
  return "PROXY proxy1.example.com:8080";
} else {
  return "DIRECT";
}

一月到五月

if (dateRange("JAN", "MAR"))  {
  return "PROXY proxy1.example.com:8080";  
} else {
  return "DIRECT";
}

八点到十八点

if (timeRange(8, 18)) {
  return "PROXY proxy1.example.com:8080";
} else {
  return "DIRECT";  
}
  • 例子1
var domains = {
    "google.com": 1,
    "facebook.com": 1,
    "bing.com":1
};
 
var proxy = "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT;";
 
var direct = 'DIRECT;';
 
function FindProxyForURL(url, host) {
    var lastPos;
    do {
        if (domains.hasOwnProperty(host)) {//判断domains中是否有host这个属性,可以参考http://blog.csdn.net/tenfyguo/article/details/6171666理解
            return proxy; //走代理
        }
        lastPos = host.indexOf('.') + 1; //如果要检索的字符串值没有出现,则该方法返回 -1
        host = host.slice(lastPos); //slice(lastPos)表示从lastPos到末尾的所有字符
    } while (lastPos >= 1);
    return direct;
}
  • 例子2
function FindProxyForURL(url, host)
{
    url  = url.toLowerCase();
    host = host.toLowerCase();

    if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0")
      || isInNet(dnsResolve(host), "172.16.0.0",  "255.240.0.0")
      || isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")
      || isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0")
    ) {//DNS解析出来的ip在内网网段内,直连
      return "DIRECT";
    }

    if (shExpMatch(url,"*twitter*")
      || shExpMatch(url,"*google*")
      || shExpMatch(url,"*facebook*")
      || shExpMatch(url,"*blogspot*")
      || shExpMatch(url,"*youtube*")
      || shExpMatch(url,"*gstatic*")
      || shExpMatch(url,"*ytimg*")
      || shExpMatch(url,"*ggpht*")
      || shExpMatch(url,"*github*")
    ) {//正则匹配到某些网站就走proxy
       return "SOCKS 192.168.1.1:3128";
    }
    return 'DIRECT';
}
  • 例子3
function FindProxyForURL(url, host) {
if (shExpMatch(url,"*.google.com/*")) {
return “PROXY 192.168.1.1:3128”;
}
if (shExpMatch(url, "*.wikipedia.com:*/*")) {
return "SOCKS5 lilinux.net:1080";
}
if (isInNet(host, "10.0.0.0", "255.0.0.0")){
return "DIRECT";
}
return "DIRECT; PROXY 192.168.1.1:3128; SOCKS5 lilinux.net:1080";
}

这个PAC文件中引入了两个新的函数,但从字面意思上,我们也可以猜出代码的大概意思:

当url是*.google.com/* 时,自动使用PROXY代理;
当url是*.wikipedia.cm/*时,自动使用SOCKS5代理;
当host是10.0.0.0 /255.0.0.0的子网内时,自动直连;
如果都不匹配,则依次按DIRECT、PROXY、SOCKS5的次序尝试。
shExpMatch函数用来匹配url或者host,匹配的方式和DOS的通配符相似。例如前面用到的*.google.com/*可以匹配任意包含.google.com/的字符串。

Chrome/Chromium 的扩展Switchy!创建的pac文件还自定义了一个函数,可以用来匹配正则表达式,不过个人认为在url匹配上通常不需要使用强大的正则表达式。

isInNet函数用来返回请求的host是否在指定的域内。值得注意的是,isInNet的第二个参数必须是 IP,不能是主机名。因此需要把主机名转换成IP。比如”isInNet(host, dnsResolve(www.google.com), “255.255.255.0”)”讲到这里,应该可以解决你的问题了吧。

PAC 示例文件

https://github.com/n0wa11/gfw_whitelist/blob/master/examples/whitelist_socks5_7070.pac
https://github.com/n0wa11/gfw_whitelist/blob/master/examples/whitelist_http_8081.pac
https://github.com/n0wa11/gfw_whitelist/blob/master/whitelist.pac
https://pac.itzmx.com/abc.pac
https://github.com/breakwa11/gfw_whitelist/blob/master/proxy.pac

来源:
http://www.cnblogs.com/milton/p/6263596.html
http://www.truevue.org/p/519
https://blog.huzhifeng.com/2017/07/16/PAC/

反向代理的原理和配置说明

https://jixun.moe/2017/01/01/ymusic-hosts-fix/)。

反代的原理是搭建一个Nginxf服务器
  • 163-uwp.json
{"code":200,"uwp":1}
  • ipquery.txt
// 文件需存为 GBK 格式
var lo="广东省", lc="广州市";
var localAddress={city:"广州市", province:"广东省"}
  • proxy-163.conf
# /etc/nginx/conf.d/proxy-163.conf

# Cahce缓存路径
proxy_cache_path  /var/cache/nginx  levels=1:2    keys_zone=STATIC:10m inactive=24h  max_size=1g;

server {
    listen       80;
    listen       [::]:80;
    server_name  music.163.com;

    location /weapi/feedback/weblog {
        add_header Set-Cookie "os=uwp; path=/";
        error_page 405 = $uri;
        alias /usr/share/nginx/html/163-uwp.json;
    }
    
    location / {
        proxy_redirect off;
        proxy_pass http://music.163.com/;
        # Hint: http://bgp.he.net/AS45102#_prefixes
        # 这个 IP 已经失效,随便找一个 IP 来代替。
        proxy_set_header X-Real-IP 110.76.23.1;
        proxy_cache            STATIC;//静态的
        proxy_cache_valid      200  1d; //200状态缓存1天
        proxy_cache_use_stale  error timeout invalid_header update http_500 http_502 http_503 http_504; 
//proxy_cache_use_stale中的updating参数告知NGINX在客户端请求的项目的更新正在原服务器中下载时发送旧内容,而不是向服务器转发重复的请求。第一个请求陈旧文件的用户不得不等待文件在原服务器中更新完毕。陈旧的文件会返回给随后的请求直到更新后的文件被全部下载。
    }
}

server {
    listen       80;
    listen       [::]:80;
    server_name  ip.ws.126.net;

    location /ipquery {
        alias /usr/share/nginx/html/163/ipquery.txt;
    }
}
  • cache首行设置参数:
    proxy_cache_path指的是存放cache的位置,如果没有此文件夹,重启nginx会报错
    keys_zone=STATIC:200m 表示这个zone名称为STATIC,分配的内存大小为200MB
    inactive=24h表示这个zone中的缓存文件如果在1天内都没有被访问,那么文件会被cache manager进程删除掉
    max_size=1g 表示最大缓存大小为1G
    对于指定的域名加上cache

  • proxy_set_header X-Real-IP
    其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:request.getAttribute("X-real-ip")

来源
https://segmentfault.com/a/1190000002797601
location写法:https://segmentfault.com/a/1190000002797606
proxy_set_header X-Real-IP解释: http://gong1208.iteye.com/blog/1559835
缓存cache时间解释:http://blog.51yip.com/apachenginx/1018.html
缓存cache路径解释:https://www.jianshu.com/p/2a14d69987a4
proxy_cache_use_stale解释:https://linux.cn/article-5945-1.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容