【问题标题】:Matching last non-private IP address in an X-Forwarded-For header匹配 X-Forwarded-For 标头中的最后一个非私有 IP 地址
【发布时间】:2016-05-22 13:51:31
【问题描述】:

我有以下难题。由于我们的服务器堆栈的布局方式:ELB -> Varnish -> Apache,我需要 Varnish 从 X-Forwarded-For 标头中提取最右边的非私有 IP 地址(由 ELB 正确设置并且可以信任)。

我已经在使用以下正则表达式来获取字符串中的最后一个 IP 地址。我的问题是试图弄清楚如何过滤私有 IP 地址。

((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(?!.*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))

这是我一直在测试的私有 IP 过滤器。

(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)

请注意,我使用的是正则表达式 VMOD,它允许我访问反向引用。

看看下面的例子,它应该能说明我想要完成的事情:

92.58.12.100, 10.0.120.5                  -> 92.58.12.100
172.24.10.15, 127.0.0.1, 95.58.12.100     -> 95.58.12.100
92.58.12.100                              -> 92.58.12.100

另外,这是一个 link 到 RegExr 示例。任何帮助将不胜感激。

【问题讨论】:

    标签: regex varnish


    【解决方案1】:

    使用这种模式

    .*\b(?!10|127)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
    

    Demo

    【讨论】:

    • 更准确地说,对于清漆:set req.http.X-Real-IP = regsub(req.http.X-Forwarded-For, ".*\b(?!10|127)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*", "\1");
    【解决方案2】:

    alpha bravo 的答案指向正确的方向,但缺少对私有 IP 地址空间的正确解析(例如,它在要排除的前缀后缺少一个点,它将匹配以 10 开头的任何地址作为私有地址,包括101...* 不是)。

    IPv4 私有地址空间是:

    10.0.0.0 to 10.255.255.255
    172.16.0.0 to 172.31.255.255
    192.168.0.0 to 192.168.255.255
    

    修改 alpha bravo 的答案以包含这些地址(以及以 127.* 开头的特殊地址)产生以下正则表达式:

    .*\b(?!127\.|10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.|192\.168\.)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
    

    【讨论】:

      猜你喜欢
      • 2022-06-12
      • 2021-06-08
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2021-02-25
      • 2019-03-09
      相关资源
      最近更新 更多