配置 HTTP 代理(WIN10)、SOCKS 代理(WIN10)和编写 PAC 自动配置脚本
- 文檔:
- ?? mdn - https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file
- 相關:
- ?? 使用PAC file結合ATS控制訪問 - https://www.cnblogs.com/zyxnhr/p/11000959.html
- ?? PAC 代理自動發現簡介 - https://www.cnblogs.com/zyxnhr/p/10980279.html
- Navigator Proxy Auto-Config File Format -
https://web.archive.org/web/20070602031929/http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html - PAC語法整理 - https://www.gl.sh.cn/2019/03/14/pac_yu_fa_zheng_li.html
- 詳解自動配置 PAC - https://www.barretlee.com/blog/2016/08/25/pac-file/
- ?? PAC代理語法含義與書寫規范 - https://www.bbsmax.com/A/gVdn389NzW/
文章目錄
- HTTP 代理、SOCKS 代理
- 配置:HTTP 代理(WIN10)
- 配置:SOCKS 代理(WIN10)
- PAC 代理自動配置
- 語法、函數
- dnsDomainIs
- shExpMatch
- isInNet
- myIpAddress
- isPlainHostName
- localHostOrDomainIs
- isResolvable
- dnsResolve
- dnsDomainLevels
- weekdayRange
- dateRange
- timeRange
- 通用js函數
- # alert
- # url.substring
- # Math
- 更多
- ?? 配置:nginx 配置 PAC 文件服務
- ??配置:WIN10 配置 PAC 地址
- WPAD 網絡代理自發現協議
HTTP 代理、SOCKS 代理
安全性
保障隱私和安全性是使用代理的重要目的和作用。HTTP 和 SOCKS 代理都能夠充當客戶端和服務器之間的中介,以保護您的在線活動并使其更難被追蹤。
HTTP 代理廣泛應用于電子郵件保護和網絡安全項目,因為它們能夠解析數據包并根據特定需求進行過濾。這對于網絡抓取和數據挖掘活動也很有用。
功能性
盡管 HTTP 代理只能處理 HTTP(S) 流量,但它們的配置可以根據眾多用例進行設置。由于 HTTP 代理可以讀取客戶端和 Web 服務器之間的網絡流量,它們可以發現重復的請求或緩存響應。
至于 SOCKS 代理,它們不受特定網絡協議的約束(全能代理),因此可以更靈活地使用。由于它們無法讀取網絡流量,因此它們非常適合訪問防火墻后面的連接。
(SOCKS 分 socks 4 和 socks 5 兩種類型,socks 4 只支持 TCP 協議而 socks 5 支持 TCP/UDP 協議,還支持各種身份驗證機制等協議)
性能
由于 HTTP 代理能夠過濾數據或緩存網頁,它們可以為您的抓取操作提供動力,并提高加載速度和性能。因此,這些代理允許您每秒管理更多請求。另一方面,SOCKS 代理因其速度而廣受好評,因為它們更易于應用:這使得它們非常適合在線下載、傳輸和上傳 Web 數據。
配置:HTTP 代理(WIN10)
在 Windows 系統中,通過「網絡和Internet -> 代理 --> 手動設置代理」可以找到配置處
配置:SOCKS 代理(WIN10)
由于 Windows 系統自帶的“代理服務器”配置只顯式支持 ??http ??代理,所以讓人誤以為 Windows 不支持 ??Socks?? 代理。但其實它是支持 ??Socks?? 的,只需要配置的時候正確編寫信息即可。
在 Windows 系統中,通過「網絡和Internet -> 代理 --> 手動設置代理」可以找到配置處
PAC 代理自動配置
PAC(Proxy Auto Config,代理自動配置)文件是一個 JavaScript 腳本,其核心是一個 JavaScript 函數,用來決定網頁瀏覽請求(HTTP、HTTPS,和 FTP)應當直連目標地址,還是被轉發給一個網頁代理服務器并通過代理連接。
系統讀取到 PAC 腳本,以 FindProxyForURL 方法名作為入口執行腳本,根據返回值決定代理方向。
function FindProxyForURL(url, host) {return "DIRECT"; }💡 提示
使用RAC文件的好處
- 受所有的主要操作系統和瀏覽器支持
- 無論用戶是輸入域還是輸入IP地址,都能正確的自動路由流量
- 自動代理故障轉移
- 內部流量見直接傳輸,并且可以根據需要考慮和路由該邏輯的任何和異常,一旦涉及并部署了PAC文件,任何持續的維護都是直截了當的
語法、函數
function FindProxyForURL(url, host) {return "DIRECT"; }上面函數中:
- url 字段就是我們在瀏覽器地址欄輸入的待訪問地址
URL 中類似 https:// 這樣的的路徑和查詢組件已被去除
不同瀏覽器中,可以通過設置去除- chrome(版本 52 至 73):設置 PacHttpsUrlStrippingEnabled 為 false
- Firefox:對應的選項是 network.proxy.autoconfig_url.include_path
- host 為該地址對應的 hostname
從 URL 中提取得到的主機名。這只是為了方便;它與 :// 之后到第一個 : 或 / 之前的字符串相同。端口號不包括在此參數中,必要時可以自行從 URL 中提取。
- return 語句有三種指令:
- DIRECT,表示無代理直接連接
- PROXY <host>:<port>,表示走 host:port 的 proxy 服務(http)
- SOCKS <host>:<port>,表示走 host:port 的 socks 服務
而返回的接口可以是多個代理串聯:(以 ; 分割)
function FindProxyForURL(url, host) {// 循序執行,前面的掛了用后面的return "SOCKS 192.168.1.1:10801; PROXY 192.168.1.1:10800; DIRECT"; }💡 提示:后面介紹的pac流程判斷和代理服務器上的分流的區別
后面介紹的pac流程判斷語法&函數。其功能類似代理服務器上的統一分流配置。
但不同在于,pac 流程判斷可以指定流量流向多臺服務(從而使用多臺服務器的流量規則),而代理服務器上的流量分流只遵循自己的流量規則。
所以,后面介紹的pac流程判斷適合多臺代理服務器,多中分流規則的用戶使用。
(一臺服務器,關注的是保證pac文件服務器的可用性,和配置返回值的可用性既可。)
dnsDomainIs
類似于 ==,但是對大小寫不敏感,
if (dnsDomainIs(host, "google.com") ||dnsDomainIs(host, "www.google.com")) {return "DIRECT"; }shExpMatch
Shell 正則匹配
if (shExpMatch(host, "vpn.domain.com") ||shExpMatch(url, "http://abcdomain.com/folder/*")) {return "DIRECT"; }isInNet
判斷是否在網段內容
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0")) {return "DIRECT"; }myIpAddress
返回主機的 IP
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0")) {return "PROXY 10.10.5.1:8080"; }isPlainHostName
判斷是否是本地主機。(判斷是否為諸如 barret/,server-name/ 這樣的主機名)
if (isPlainHostName(host)) {return "DIRECT"; }localHostOrDomainIs
判斷訪問主機是否屬于某個域和某個域名
function FindProxyForURL(url, host) {if ((isPlainHostName(host) ||dnsDomainIs(host, ".company.com")) &&!localHostOrDomainIs(host, "http://www.company.com/") &&!localHostOrDomainIs(host, "home.company.com"))return "DIRECT";elsereturn "PROXY proxy:80"; }isResolvable
判斷主機是否可訪問(主機名是否能被dns服務器解析)
if (isResolvable(host)) {return "PROXY proxy1.example.com:8080"; }dnsResolve
通過 DNS 查詢主機 ip
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"; }dnsDomainLevels
返回是幾級域名,比如 dnsDomainLevels 返回的結果就是 1
if (dnsDomainLevels(host) > 0) {return "PROXY proxy1.example.com:8080"; } else {return "DIRECT"; }weekdayRange
周一到周五
if (weekdayRange("MON", "FRI")) {return "PROXY proxy1.example.com:8080"; } else {return "DIRECT"; }dateRange
一月到五月
if (dateRange("JAN", "MAR")) {return "PROXY proxy1.example.com:8080"; } else {return "DIRECT"; }timeRange
八點到十八點
if (timeRange(8, 18)) {return "PROXY proxy1.example.com:8080"; } else {return "DIRECT"; }通用js函數
# alert
這個彈窗警報信息函數可以用來配合瀏覽器的控制臺進行調試
resolved_host = dnsResolve(host); alert(resolved_host);# url.substring
截取協議字符串
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";} }# Math
Math.floor(Math.random()*5)更多
官方文檔 - https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file#predefined_functions_and_environment
?? 配置:nginx 配置 PAC 文件服務
記錄如何用 nginx 部署 pac 腳本,供 win 使用。
root@OpenWrt_D2550:~# cat /www/pac/pac.txt function FindProxyForURL(url, host) {// 內網if(isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")) {return "DIRECT";}return "SOCKS 192.168.1.1:10801; PROXY 192.168.1.1:10800; DIRECT"; }root@OpenWrt_D2550:~# cat /etc/nginx/nginx.conf http {#access_log off;log_format openwrt'$request_method $scheme://$host$request_uri => $status'' (${body_bytes_sent}B in ${request_time}s) <- $http_referer';access_log /var/log/nginx/access_log.log openwrt;error_log /var/log/nginx/error_log.log info;include mime.types;#錯誤頁面# error_page 500 502 503 504 /50x.html;# pacserver {listen 80;listen [::]:80;server_name pac.pac; # 通過域名挾持訪問location / {proxy_pass http://192.168.1.1:8099/;}}server {# Module ngx_http_core_modulelisten 8099;server_name 192.168.*;# 限制內網訪問include restrict_locally;# Module ngx_http_charset_modulecharset utf-8;# 靜態資源優化sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;# 禁止緩存add_header Cache-Control no-store;add_header Cache-Control no-cache;location / {# pac 文件指定類型:# application/x-ns-proxy-autoconfig# application/x-javascript-configtypes { } default_type application/x-ns-proxy-autoconfig;# return 200 '{status:200}';root /www/pac;}}}?? 注意
PAC 文件被訪問時,返回的文件類型(Content-Type)應該為: application/x-ns-proxy-autoconfig 或者 application/x-javascript-config
當然,如果你不寫,一般瀏覽器也能夠自動辨別
? 問題:設置那種文件類型更好?
沒有什么理由偏愛一種 MIME 類型多一些,如果有的話,假設 application/x-ns-proxy-autoconfig 相對 application/x-javascript-config 被更多的客戶端所支持是可以理解的。
因為它被定義在最初的 Netscape 規范里面,后者是最近才開始被使用
??配置:WIN10 配置 PAC 地址
在 Windows 系統中,通過「網絡和Internet -> 代理 --> 自動設置代理」可以找到配置處,下放的地址欄填寫 PAC 文件的 URI。(這個 URI 可以是本地資源路徑(file:///),也可以是網絡資源路徑(http://))
💡 提示
通過修改 host 或者 域名挾持技術可以讓將任何域名賦予 pac 文件服務器,簡化配置。
WPAD 網絡代理自發現協議
PAC 文件中的 URL 可能是手工配置的,也可能是通過網絡代理自發現協議自動配置的。
網絡代理自動發現協議(Web Proxy Auto-Discovery -WPAD)是一種幫助 Web 瀏覽器使用 DNS 或 DHCP 自動檢測 PAC 文件位置的技術。
說白了,就是: 通過 DHCP 和 DNS 的查詢來搜索 PAC 文件的位置
更多:https://www.cnblogs.com/zyxnhr/p/10980279.html
總結
以上是生活随笔為你收集整理的配置 HTTP 代理(WIN10)、SOCKS 代理(WIN10)和编写 PAC 自动配置脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-07-19普中科技STM-32
- 下一篇: 新年新气象,牛年更牛,开始新的征程