我们的应用程序取决于各种功能的客户端IP地址。我们更新了基础架构,并改变了我们对应用程序负载平衡的方式。由于更改,报告给应用程序的CGI.REMOTE_ADDR是静态负载均衡器IP而不是客户端IP。为了解决这个问题,LB支持人员说要为LB和IIS添加规则。 LB现在配置为使用客户端ip发送标头[http_x_forwarded_for]。
IIS中的重写规则如下所示:
<rule name="REMOTE_ADDR rewrite" enabled="true" patternSyntax="ECMAScript">
<match url="^((?!GetImage).)*$" />
<serverVariables>
<set name="REMOTE_ADDR" value="{HTTP_X_FORWARDED_FOR}" />
</serverVariables>
<action type="Rewrite" url="{R:0}" appendQueryString="true" logRewrittenUrl="false" />
</rule>
<rule name="REMOTE_ADDR blank URL rewrite" enabled="true">
<match url="^$" />
<serverVariables>
<set name="REMOTE_ADDR" value="{HTTP_X_FORWARDED_FOR}" />
</serverVariables>
<action type="Rewrite" url="default.cfm" />
</rule>
第一条规则适用于除GetImage页面之外的任何页面。第二个是没有页面。
在大多数情况下,这是正常的。我们没有必要对应用程序进行任何调整,因为CGI.REMOTE_ADDR是正确的。
但我们被告知,在某些情况下,LB可能会传递多个IP地址并仅使用列表中的第一个IP地址。这导致了一个问题。
在某些情况下,CGI.REMOTE_ADDR就像这样'100.200.200.200,123,123,123,123'。
使用该字符串在IIS中测试RegEx,显示组{R:0}为100.200.200.200,123,123,123,123。
问题是是否可以编写规则以便{R:0}是列表中第一个匹配的IP地址?
答案 0 :(得分:1)
在我发布之后意识到我正在以错误的方式攻击它(或者问......)。 URL规则正则表达式匹配URL以应用规则。所有匹配的URL都会将http_x_forwarded_for标头值映射到REMOTE_ADDR服务器变量中。这个变量的值可能是无效的问题。
要解决此问题,需要添加新的OUTBOUND规则。在此规则中,您可以将REMOTE_ADDR指定为INPUT并与正则表达式进行匹配以重写它。通过添加规则,正则表达式匹配变量中找到的第一个IP地址,然后用后面的跟踪重写变量,我就能解决问题。
<outboundRules>
<rule name="Format IP Address">
<match serverVariable="REMOTE_ADDR" pattern="^([0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3})(.)*$" />
<action type="Rewrite" value="{R;1}" />
</rule>
</outboundRules>