ios设备使用socks代理
在linux上運行了socks5的代理客戶端之后,發現我的iphone在局域網的詳細信息里竟然無法設置socks代理,只有http代理,而我的代理客戶端又不支持http代理,所以找了下iphone上設置socks代理的方法,記錄如下:
HTTP Prxoy有3種模式: 關閉Off/手動Manual/自動Auto
用自動配置文件,就可以支持socks代理
function FindProxyForURL(url, host) {return "SOCKS proxy_host:proxy_port"; }將上面的proxy_host和proxy_port換成socks服務器實際的IP地址和端口
然后保存為 proxy.pac
放到 http://zhiwei.li/proxy.pac
在 iPhone設備中,添加自動配置 URL 為上面的地址,就可以使用socks代理了。
擴展1:
局域網流量不要用代理
一個PAC文件包含一個JavaScript的函數”FindProxyForURL(url, host)”. 這個函數返回一個包含一個或多個訪問規則的字符串。用戶代理根據這些規則適用一個特定的代理其或者直接訪問。 當一個代理服務器無法響應的時候,多個訪問規則提供了其他的后備訪問方法。 瀏覽器在訪問其他頁面以前,首先訪問這個PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通過網頁的網絡代理自發現協議(Web Proxy Autodiscovery Protocol)自動配置的。
為了完整性和最佳的兼容性,我們應該設置網頁服務器(apache或者nginx,lighttpd等等)將這個pac文件的MIME類型聲明為 application/x-ns-proxy-autoconfig 或者 application/x-javascript-config
對于現代瀏覽器來說,兩種mime類型都沒有問題, 但 application/x-ns-proxy-autoconfig 相對 application/x-javascript-config 被更多的客戶端所支持, 因為它被定義在最初的Netscape規范里
FindProxyForURL的返回值,可以是以下3種之一,或者是它們的組合
DIRECT直接連接,不使用代理PROXY host:port使用指定的http代理SOCKS host:port使用指定的SOCKS代理如果是多個組合,要用 分號;拼接起來
并且,放在最左邊的優先級最高,如果最左邊的失敗,依次往右邊嘗試
如果最左邊的代理服務器掛掉了,并且你在右邊沒有指定DIRECT選項, 瀏覽器應該會問你
代理服務器掛了,能不能臨時忽略它,直接連接網絡?
shExpMatch(str, shexp)
第1個參數str, 待比較的任意字符串,一般是url或者host
第2個參數shexp是shell表達式,隨意可以有*號通配符
isPlainHostName(host)
如果host是不含有”.”, 說明是一個主機名, 就返回true;
如果有點號,說明是一個域名, 返回false
host是從URL中分離出來的主機名(不包括端口號)
isInNet(host_or_ip, pattern, mask)
這個函數將會考察第1個參數 ip地址 (如果傳入的參數是主機名,會被自動轉換為ip地址)
看它是否在 第2個參數pattern 和 第3個參數 mask 決定的子網絡范圍內
例如
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() 返回 瀏覽器所在的主機的當前IP地址, 很多時候這是個局域網地址
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分離出來的主機名
localHostOrDomainIs(host, hostdom)
if (localHostOrDomainIs(host, "www.google.com"))return "DIRECT";hostdom 是 域名全稱
host 既可以是 域名,也可以是 簡短主機名
如果是域名,必須完全同 hostdom 匹配
如果是主機名,必須同 hostdom的主機名 要完全匹配
isResolvable(host)
dnsResolve(host)
dnsDomainLevels(host)
dnsDomainLevels("www") 返回 0dnsDomainLevels("www.netscape.com") 返回 2調試是個大問題
PAC是一個javascript腳本,瀏覽器在每次請求一個URL之前,都會運行它.
但它和普通的js腳本有點不同
1)在PAC中,有個幾個特殊的函數,它只能在PAC運行,在普通的js腳本運行會報告
“is not defined”
比如 shExpMatch
2)PAC的執行,也不支持js的所有特性.
3)在不同的瀏覽器中,對pac腳本的執行有著不同的實現方式.
可以用Firefox的錯誤控制臺來查看錯誤信息
IE也支持alert()
并且 pac文件可以存在于本地文件系統
用 file:///var/run/x.pac 這樣的路徑
而不要用 http ,方便調試
我的最終版本 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下沒有代理配置界面,但可以通過命令行參數配置
--proxy-server=host:port --no-proxy-server --proxy-auto-detect --proxy-pac-url=URL pac就用 --proxy-pac-url=file:///var/run/autoproxy.pac新的瀏覽器支持正則表達式
如果需要做一些較為復雜的判斷,那可直接拋棄 shExpMatch 函數,而自己使用正則表達式或別的工具來進行判斷,如: var regexpr = /[a-zA-Z]{4}.microsoft.com/;if(regexpr.test(host))return "PROXY w3proxy:8080; DIRECT";
調試,使用alert,在IE上沒問題 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語句,IE的表現同普通js一樣
Firefox是在 ”瀏覽器控制臺”(Ctrl+Shift+J快捷鍵調出來) JS標簽 里顯示出來 [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/
正則表達式的另外一個例子 由于.pac 文件支持整個 JavaScript 語言,可以使用正則表達式對象,并測試方法來測試對照正則表達式的字符串。下面的代碼示例演示如何使用.pac 文件中的正則表達式對象: 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 (微軟給的例子)
驗證工具
https://code.google.com/p/pacparser/ (支持Python和C)
http://www.jslint.com/ (驗證你的js語法)
Debian Jessie中的IceWeasel 24.1.0 對 PAC的支持有問題,
Windows版本的Firefox 26.0就能很好的支持
解決方法,安裝 擴炸 foxyproxy
xul-ext-foxyproxy-standard 或者從mozilla addons下載
SOCKS SOCKS4 SOCKS5的問題
“SOCKS host:port”
有的瀏覽器使用SOCKS4協議,也支持DNS 解析 (IceWeasel 的代理管理,就是這個做法, 但是SOCKS4實際上是不支持 DNS解析的,socks5服務看到協議版本是4, dns請求是未知的,就會直接關掉連接
所以, 你在 firefox里選中socks4協議,就不要 讓 extensions.foxyproxy.socks_remote_dns 這個選項為true
但是,如果不做遠程dns的話,偉/大的-城_墻 會污染DNS)
有的瀏覽器使用SOCKS4協議,但不支持 DNS解析
有的瀏覽器直接使用SOCKS5協議,當然就支持 DNS解析了 (foxyProxy擴展,看到 SOCKS,就直接用SOCKS5了,相當聰明)
“SOCKS5 host:port” 明確說明要用 SOCKS5 代理
據說 Safari (OSX, iOS)只認識SOCKS,雖然它默認也是使用SOCKS5協議
這種寫法可以兼容絕大數瀏覽器
對于不認識的SOCKS5,丟掉,認識的SOCKS直接用
轉載來源:http://zhiwei.li/text/2015/08/16/用代理自動配置文件pac給iphone和ipad設備添加socks代理/
總結
以上是生活随笔為你收集整理的ios设备使用socks代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS多线程同步问题
- 下一篇: 自然语言处理笔记11-哈工大 关毅