如何在IIS上实现类似Azure Application Gateway的代理方案
IIS 透明代理(类Azure Application Gateway能力)实现方案
你需要实现的是无篡改透传代理,区别于常规会改写响应、丢失请求体、仅支持GET的反向代理,全程保留原始请求结构、POST请求体、对外统一展示代理侧URL/IP,和Azure Application Gateway的转发逻辑一致,可通过IIS原生组件组合实现,无需额外第三方工具。
前置组件安装
先在IIS服务器上安装两个官方原生模块:
- URL Rewrite 模块
- Application Request Routing(ARR)模块
安装完成后进入IIS管理器的服务器级ARR配置页,开启代理功能,同时取消勾选「反向代理重写响应主机头」「重写响应内链接地址」两个默认选项,关闭ARR自带的自动改写逻辑,避免响应内容被篡改。
核心规则配置
所有配置在对外提供代理服务的站点下生效,不要做全局配置避免影响其他站点,直接修改站点根目录下的web.config文件即可,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="FullTransparentProxy" stopProcessing="true"> <!-- 匹配所有请求路径 --> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <!-- 按需排除IIS本地默认路径,可自行增减 --> <add input="{PATH_INFO}" pattern="^/iisstart\.htm$" negate="true" /> </conditions> <serverVariables> <!-- 透传原始Host头,不替换为后端服务地址 --> <set name="HTTP_HOST" value="{HTTP_HOST}" /> <!-- 透传原始客户端IP,不需要可删除 --> <set name="HTTP_X_FORWARDED_FOR" value="{REMOTE_ADDR}" /> </serverVariables> <!-- 转发到目标后端服务,保留完整路径和查询参数 --> <action type="Rewrite" url="http://替换为你的目标服务地址/{R:1}" appendQueryString="true" logRewrittenUrl="false" /> </rule> </rules> </rewrite> <!-- 放行所有HTTP方法,放开请求体大小限制 --> <security> <requestFiltering> <verbs allowUnlisted="true"> <add verb="GET" allowed="true" /> <add verb="POST" allowed="true" /> <add verb="PUT" allowed="true" /> <add verb="DELETE" allowed="true" /> <add verb="PATCH" allowed="true" /> <add verb="OPTIONS" allowed="true" /> <add verb="HEAD" allowed="true" /> </verbs> <!-- 按需调整最大请求体大小,单位为字节,当前配置为4GB --> <requestLimits maxAllowedContentLength="4294967295" /> </requestFiltering> </security> <!-- 关闭IIS默认请求验证,避免POST请求体被拦截、改写 --> <httpRuntime requestValidationMode="2.0" maxRequestLength="2147483647" /> </system.webServer> </configuration>
必做的校验调整
- 回到ARR全局代理设置页,关闭「请求缓冲」「响应缓冲」选项,设置缓冲区大小为0,让请求、响应直接透传,不做IIS侧的缓存解析,避免大文件、二进制POST请求体被篡改。
- 确认ARR设置里的「保留原始客户端证书」「透传所有请求头」选项处于开启状态,不要过滤任何自定义请求头。
- 验证标准:
- 发送任意格式POST请求(JSON、表单、二进制流),后端收到的请求体和原始发送内容完全一致,无字段丢失、编码修改问题
- 所有响应内容、响应头中仅出现IIS代理的对外域名/IP,不会泄露后端目标服务地址
- 所有HTTP方法(PUT/DELETE/PATCH等)均可正常转发,不会返回405方法不允许错误
- 客户端抓包确认所有连接的对端IP均为IIS服务器地址,不会直接和后端目标服务建立连接
该配置和常规反向代理的核心差异:关闭了所有IIS默认的自动改写逻辑,不对请求、响应做任何内容层面的修改,仅做流量转发,完全匹配你提到的Azure Application Gateway的无篡改转发能力。
内容的提问来源于stack exchange,提问作者Marco Slanzi
相关产品推荐
相关产品推荐

