配置 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
- 下一篇: 新年新气象,牛年更牛,开始新的征程