匹配X-Forwarded-For标头中的最后一个非私有IP地址

时间:2016-02-11 16:48:28

标签: regex varnish

我有以下难题。由于我们的服务器堆栈的布局方式: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

此外,这里是RegExr示例的link。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

使用此模式

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

Demo

答案 1 :(得分:1)

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}