ios设备使用socks代理
在linux上運(yùn)行了socks5的代理客戶(hù)端之后,發(fā)現(xiàn)我的iphone在局域網(wǎng)的詳細(xì)信息里竟然無(wú)法設(shè)置socks代理,只有http代理,而我的代理客戶(hù)端又不支持http代理,所以找了下iphone上設(shè)置socks代理的方法,記錄如下:
HTTP Prxoy有3種模式: 關(guān)閉Off/手動(dòng)Manual/自動(dòng)Auto
用自動(dòng)配置文件,就可以支持socks代理
function FindProxyForURL(url, host) {return "SOCKS proxy_host:proxy_port"; }將上面的proxy_host和proxy_port換成socks服務(wù)器實(shí)際的IP地址和端口
然后保存為 proxy.pac
放到 http://zhiwei.li/proxy.pac
在 iPhone設(shè)備中,添加自動(dòng)配置 URL 為上面的地址,就可以使用socks代理了。
擴(kuò)展1:
局域網(wǎng)流量不要用代理
一個(gè)PAC文件包含一個(gè)JavaScript的函數(shù)”FindProxyForURL(url, host)”. 這個(gè)函數(shù)返回一個(gè)包含一個(gè)或多個(gè)訪(fǎng)問(wèn)規(guī)則的字符串。用戶(hù)代理根據(jù)這些規(guī)則適用一個(gè)特定的代理其或者直接訪(fǎng)問(wèn)。 當(dāng)一個(gè)代理服務(wù)器無(wú)法響應(yīng)的時(shí)候,多個(gè)訪(fǎng)問(wèn)規(guī)則提供了其他的后備訪(fǎng)問(wèn)方法。 瀏覽器在訪(fǎng)問(wèn)其他頁(yè)面以前,首先訪(fǎng)問(wèn)這個(gè)PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通過(guò)網(wǎng)頁(yè)的網(wǎng)絡(luò)代理自發(fā)現(xiàn)協(xié)議(Web Proxy Autodiscovery Protocol)自動(dòng)配置的。
為了完整性和最佳的兼容性,我們應(yīng)該設(shè)置網(wǎng)頁(yè)服務(wù)器(apache或者nginx,lighttpd等等)將這個(gè)pac文件的MIME類(lèi)型聲明為 application/x-ns-proxy-autoconfig 或者 application/x-javascript-config
對(duì)于現(xiàn)代瀏覽器來(lái)說(shuō),兩種mime類(lèi)型都沒(méi)有問(wèn)題, 但 application/x-ns-proxy-autoconfig 相對(duì) application/x-javascript-config 被更多的客戶(hù)端所支持, 因?yàn)樗欢x在最初的Netscape規(guī)范里
FindProxyForURL的返回值,可以是以下3種之一,或者是它們的組合
DIRECT直接連接,不使用代理PROXY host:port使用指定的http代理SOCKS host:port使用指定的SOCKS代理如果是多個(gè)組合,要用 分號(hào);拼接起來(lái)
并且,放在最左邊的優(yōu)先級(jí)最高,如果最左邊的失敗,依次往右邊嘗試
如果最左邊的代理服務(wù)器掛掉了,并且你在右邊沒(méi)有指定DIRECT選項(xiàng), 瀏覽器應(yīng)該會(huì)問(wèn)你
代理服務(wù)器掛了,能不能臨時(shí)忽略它,直接連接網(wǎng)絡(luò)?
shExpMatch(str, shexp)
第1個(gè)參數(shù)str, 待比較的任意字符串,一般是url或者h(yuǎn)ost
第2個(gè)參數(shù)shexp是shell表達(dá)式,隨意可以有*號(hào)通配符
isPlainHostName(host)
如果host是不含有”.”, 說(shuō)明是一個(gè)主機(jī)名, 就返回true;
如果有點(diǎn)號(hào),說(shuō)明是一個(gè)域名, 返回false
host是從URL中分離出來(lái)的主機(jī)名(不包括端口號(hào))
isInNet(host_or_ip, pattern, mask)
這個(gè)函數(shù)將會(huì)考察第1個(gè)參數(shù) ip地址 (如果傳入的參數(shù)是主機(jī)名,會(huì)被自動(dòng)轉(zhuǎn)換為ip地址)
看它是否在 第2個(gè)參數(shù)pattern 和 第3個(gè)參數(shù) mask 決定的子網(wǎng)絡(luò)范圍內(nèi)
例如
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))return "DIRECT";if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))return "PROXY 10.10.5.1:8080";其中myIpAddress() 返回 瀏覽器所在的主機(jī)的當(dāng)前IP地址, 很多時(shí)候這是個(gè)局域網(wǎng)地址
dnsResolve(host) 將host解析為ip地址
var resolved_ip = dnsResolve(host); 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"))return "DIRECT";這段必須用上啊dnsDomainIs(host, domain)
if (dnsDomainIs(host, ".google.com"))return "DIRECT";其中host是從URL分離出來(lái)的主機(jī)名
localHostOrDomainIs(host, hostdom)
if (localHostOrDomainIs(host, "www.google.com"))return "DIRECT";hostdom 是 域名全稱(chēng)
host 既可以是 域名,也可以是 簡(jiǎn)短主機(jī)名
如果是域名,必須完全同 hostdom 匹配
如果是主機(jī)名,必須同 hostdom的主機(jī)名 要完全匹配
isResolvable(host)
dnsResolve(host)
dnsDomainLevels(host)
dnsDomainLevels("www") 返回 0dnsDomainLevels("www.netscape.com") 返回 2調(diào)試是個(gè)大問(wèn)題
PAC是一個(gè)javascript腳本,瀏覽器在每次請(qǐng)求一個(gè)URL之前,都會(huì)運(yùn)行它.
但它和普通的js腳本有點(diǎn)不同
1)在PAC中,有個(gè)幾個(gè)特殊的函數(shù),它只能在PAC運(yùn)行,在普通的js腳本運(yùn)行會(huì)報(bào)告
“is not defined”
比如 shExpMatch
2)PAC的執(zhí)行,也不支持js的所有特性.
3)在不同的瀏覽器中,對(duì)pac腳本的執(zhí)行有著不同的實(shí)現(xiàn)方式.
可以用Firefox的錯(cuò)誤控制臺(tái)來(lái)查看錯(cuò)誤信息
IE也支持alert()
并且 pac文件可以存在于本地文件系統(tǒng)
用 file:///var/run/x.pac 這樣的路徑
而不要用 http ,方便調(diào)試
我的最終版本 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"))return "DIRECT";if (shExpMatch(url,"*twitter*") ||shExpMatch(url,"*facebook*") ||shExpMatch(url,"*blogspot*") ||shExpMatch(url,"*youtube*") ||){return "SOCKS 1.2.3.4:1080; DIRECT";} }
Chrome在Linux下沒(méi)有代理配置界面,但可以通過(guò)命令行參數(shù)配置
--proxy-server=host:port --no-proxy-server --proxy-auto-detect --proxy-pac-url=URL pac就用 --proxy-pac-url=file:///var/run/autoproxy.pac新的瀏覽器支持正則表達(dá)式
如果需要做一些較為復(fù)雜的判斷,那可直接拋棄 shExpMatch 函數(shù),而自己使用正則表達(dá)式或別的工具來(lái)進(jìn)行判斷,如: var regexpr = /[a-zA-Z]{4}.microsoft.com/;if(regexpr.test(host))return "PROXY w3proxy:8080; DIRECT";
調(diào)試,使用alert,在IE上沒(méi)問(wèn)題 function isMatchProxy(url, pattern) {try {return new RegExp(pattern.replace('.', '.')).test(url);} catch (e) {return false;} }function FindProxyForURL(url, host) {debugPAC ="PAC Debug Informationn";debugPAC +="-----------------------------------n";debugPAC +="Machine IP: " + myIpAddress() + "n";debugPAC +="Hostname: " + host + "n";if (isResolvable(host)) {resolvableHost = "True"} else {resolvableHost = "False"};debugPAC += "Host Resolvable: " + resolvableHost + "n";debugPAC += "Hostname IP: " + dnsResolve(host) + "n";if (isPlainHostName(host)) {plainHost = "True"} else {plainHost = "False"};debugPAC += "Plain Hostname: " + plainHost + "n";debugPAC += "Domain Levels: " + dnsDomainLevels(host) + "n";debugPAC += "URL: " + url + "n";alert(debugPAC);var Proxy = 'SOCKS 1.2.3.4:9625; DIRECT';var list = ['t.co','twitter.com','twimg.com','posterous.com','tinypic.com','twitpic.com','bitly.com','yfrog.com','youtube.com','facebook.com','appspot.com','dropbox.com','flickr.com','youtube.com','ytimg.com','plus.google.com','ggpht.com','talkgadget.google.com','picasaweb.google.com','googleusercontent.com','hzmangel.info','slideshare.net','code.google.com','golang.org','vimeo.com','wordpress.com','dxtl.net','123cha.com'];for(var i=0, l=list.length; i<l; i++) {if (isMatchProxy(url, list[i])) {alert("Match");return Proxy;}}alert("direct");return 'DIRECT'; }
在PAC中,Firefox和Internet Explore都支持alert語(yǔ)句,IE的表現(xiàn)同普通js一樣
Firefox是在 ”瀏覽器控制臺(tái)”(Ctrl+Shift+J快捷鍵調(diào)出來(lái)) JS標(biāo)簽 里顯示出來(lái) [21:32:29.568] PAC-alert: PAC Debug Information———————————–Machine IP: 192.168.1.99Hostname: zhiwei.liHost Resolvable: TrueHostname IP: 199.188.204.95Plain Hostname: FalseDomain Levels: 1URL: http://zhiwei.li/
正則表達(dá)式的另外一個(gè)例子 由于.pac 文件支持整個(gè) JavaScript 語(yǔ)言,可以使用正則表達(dá)式對(duì)象,并測(cè)試方法來(lái)測(cè)試對(duì)照正則表達(dá)式的字符串。下面的代碼示例演示如何使用.pac 文件中的正則表達(dá)式對(duì)象: function FindProxyForURL(url, host) {// For instance, if the server has 4 alphabetic characters,// such as "MSDN", route it through a specific proxy:var regexpr = /[a-zA-Z]{4}.microsoft.com/;if(regexpr.test(host))return "PROXY w3proxy:8080; DIRECT";// Or else connect directly:return "DIRECT"; }
http://technet.microsoft.com/en-us/library/dd361950.aspx (微軟給的例子)
驗(yàn)證工具
https://code.google.com/p/pacparser/ (支持Python和C)
http://www.jslint.com/ (驗(yàn)證你的js語(yǔ)法)
Debian Jessie中的IceWeasel 24.1.0 對(duì) PAC的支持有問(wèn)題,
Windows版本的Firefox 26.0就能很好的支持
解決方法,安裝 擴(kuò)炸 foxyproxy
xul-ext-foxyproxy-standard 或者從mozilla addons下載
SOCKS SOCKS4 SOCKS5的問(wèn)題
“SOCKS host:port”
有的瀏覽器使用SOCKS4協(xié)議,也支持DNS 解析 (IceWeasel 的代理管理,就是這個(gè)做法, 但是SOCKS4實(shí)際上是不支持 DNS解析的,socks5服務(wù)看到協(xié)議版本是4, dns請(qǐng)求是未知的,就會(huì)直接關(guān)掉連接
所以, 你在 firefox里選中socks4協(xié)議,就不要 讓 extensions.foxyproxy.socks_remote_dns 這個(gè)選項(xiàng)為true
但是,如果不做遠(yuǎn)程dns的話(huà),偉/大的-城_墻 會(huì)污染DNS)
有的瀏覽器使用SOCKS4協(xié)議,但不支持 DNS解析
有的瀏覽器直接使用SOCKS5協(xié)議,當(dāng)然就支持 DNS解析了 (foxyProxy擴(kuò)展,看到 SOCKS,就直接用SOCKS5了,相當(dāng)聰明)
“SOCKS5 host:port” 明確說(shuō)明要用 SOCKS5 代理
據(jù)說(shuō) Safari (OSX, iOS)只認(rèn)識(shí)SOCKS,雖然它默認(rèn)也是使用SOCKS5協(xié)議
這種寫(xiě)法可以兼容絕大數(shù)瀏覽器
對(duì)于不認(rèn)識(shí)的SOCKS5,丟掉,認(rèn)識(shí)的SOCKS直接用
轉(zhuǎn)載來(lái)源:http://zhiwei.li/text/2015/08/16/用代理自動(dòng)配置文件pac給iphone和ipad設(shè)備添加socks代理/
總結(jié)
以上是生活随笔為你收集整理的ios设备使用socks代理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IOS多线程同步问题
- 下一篇: 自然语言处理笔记11-哈工大 关毅