域名代理访问,初次接触的人常会简单理解为把域名解析指向代理服务器IP就完成配置。实际操作没有这么简单,DNS解析只是第一步,请求转发逻辑才是核心。域名代理访问分为两种完全独立场景,一类是借助代理访问外部域名,另一类是让外部用户通过代理访问自己名下域名。前者叫做正向代理,后者为反向代理,原理和部署方式差异很大。
先说正向代理。浏览器配置代理服务器地址,之后所有网站访问请求都会发送至代理。代理服务器提取请求内的目标域名,代替客户端发起访问,再将返回内容原样传回。HTTP网站处理简单,代理可以读取完整请求头与URL,直接转发请求。HTTPS场景会复杂很多,传输内容加密,代理无法读取页面内容,但可以捕获CONNECT请求携带的目标域名与端口。正向代理处理HTTPS流量,一般搭建TCP隧道,原样转发加密流量,不解析传输内容。部署正向代理常用软件包含Squid、3proxy;原生Nginx不支持正向代理,需要安装第三方模块处理CONNECT请求。Squid配置相对简洁,配置http_port、acl访问控制以及http_access策略,就能够为本机或者局域网提供代理服务。

反向代理属于另一套逻辑。域名解析记录指向代理服务器IP,用户访问域名,请求抵达代理服务器,代理根据域名或者路径,分发流量到后端真实源站。用户全程感知不到源站存在,会认为代理服务器就是目标网站。Nginx是搭建反向代理最常用工具。基础配置仅需要几行代码,创建server块,监听80端口,server_name填写域名,location配置proxy_pass指向后端地址。关键配置是传递Host请求头,添加proxy_set_header Host $host,否则后端服务器收到Host信息异常,返回报错页面。后端业务需要获取访客真实IP,额外配置proxy_set_header X-Real-IP $remote_addr。HTTPS反向代理有两种实现方式,可以在代理服务器部署SSL证书,代理完成加解密,后端使用明文HTTP通信;或者使用Nginx stream模块四层透传,证书部署在后端服务器,代理仅转发TCP数据流,这种模式代理无法解析HTTP层信息,不能基于路径做转发和缓存。
DNS层面的代理访问也值得了解。部分服务商要求域名CNAME记录指向服务商地址,边缘节点根据域名回源获取内容。CDN就是大规模反向代理集群,用户访问的IP是就近CDN节点,节点再向源站拉取资源。这个场景下DNS解析返回CDN节点IP,不是源站IP,用户无感知。内网穿透工具frp、ngrok原理类似,本地运行客户端,连接公网服务器,公网服务器分配域名或者端口,外部用户访问域名,流量经由公网服务器转发到本地设备。域名在这里作为稳定访问入口,流量转发依靠隧道完成。
透明代理和上面几类代理不一样。客户端不用做任何代理设置,网关或者路由器将80、443端口流量重定向至代理服务器。用户以为直连目标网站,流量在网关处被拦截转发。这类方案多用于企业出口网络,实现上网行为审计、页面缓存加速。一般依靠iptables或者策略路由把流量转发至代理端口,代理后续按照正向代理逻辑处理流量。
还有一种简易方式修改hosts文件。直接把域名绑定指定IP,本机访问域名不再查询DNS。这个修改仅对当前电脑生效,其他用户访问依旧走常规解析流程。hosts修改不算标准代理,属于本地解析覆盖,多用于开发调试临时测试。
搭建简易域名反向代理,整体思路如下:采购具备公网IP的服务器,安装Nginx,域名解析指向这台服务器,Nginx新增server配置块,server_name填写域名,location内proxy_pass配置源站地址。重启Nginx服务,访问域名,流量经过代理转发到源站。证书部署、缓存策略、访问限流、日志统计都可以在这套基础架构上叠加。正向代理部署思路相反,客户端填写代理地址,服务器运行Squid或者3proxy,重点做好身份认证与访问控制,避免外部人员滥用代理端口。