Идентификатор частного IP-адреса в регулярном выражении - PullRequest
29 голосов
/ 11 мая 2010

Мне интересно, является ли это наилучшим способом сопоставления строки, начинающейся с частного IP-адреса (регулярное выражение в стиле Perl):

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

Большое спасибо!

Ответы [ 9 ]

51 голосов
/ 12 мая 2010

Я предполагаю, что вы хотите соответствовать этим диапазонам:

127.  0.0.0 – 127.255.255.255     127.0.0.0 /8
 10.  0.0.0 –  10.255.255.255      10.0.0.0 /8
172. 16.0.0 – 172. 31.255.255    172.16.0.0 /12
192.168.0.0 – 192.168.255.255   192.168.0.0 /16

Вам не хватает некоторых точек, из-за которых он может принять, например 172.169.0.0, хотя это не должно быть принято. Я исправил это ниже. Удалите новые строки, это просто для удобства чтения.

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

Также обратите внимание, что это предполагает, что IP-адреса уже были проверены - он принимает такие вещи, как 10.foobar.

17 голосов
/ 04 июля 2012

Это то же самое, что правильный ответ Марка, но теперь включает частные адреса IPv6.

/(^127\.)|(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/
10 голосов
/ 09 января 2014

Я сгенерировал это

REGEXP ДЛЯ КЛАССА СЕТЕЙ:

(10)(\.([2]([0-5][0-5]|[01234][6-9])|[1][0-9][0-9]|[1-9][0-9]|[0-9])){3}

REGEXP для сетей класса B:

(172)\.(1[6-9]|2[0-9]|3[0-1])(\.([2][0-5][0-5]|[1][0-9][0-9]|[1-9][0-9]|[0-9])){2}

REGEXP для сетей класса C:

(192)\.(168)(\.[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]){2}

Дайте мне знать, если у вас возникнут какие-либо ошибки

Если вы уверены в своем выводе (например, netstat) и вам не нужно проверять правильность IP-адреса, потому что это уже сделано, то вы можете перехватить частные ip-адреса с помощью этой формулы

grep -P "(10. | 192.168 | 172.1 [6-9]. | 172.2 [0-9]. | 172.3 [01].). *"

3 голосов
/ 12 мая 2010

Это на тот случай, если вы решите пойти с моим комментарием, предлагая не использовать регулярные выражения. Не проверено (но, вероятно, работает или, по крайней мере, близко) в Perl:

@private = (
    {network => inet_aton('127.0.0.0'),   mask => inet_aton('255.0.0.0')   },
    {network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') },
    # ...
);

$ip = inet_aton($ip_text);
if (grep $ip & $_->{mask} == $_->{network}, @private) {
    # ip address is private
} else {
    # ip address is not private
}

Обратите внимание, что @private - это просто данные, которые вы можете легко изменить. Или загрузите на лету с Cymru Bogon Reference .

edit: Мне приходит в голову, что запрос регулярного выражения Perl не означает, что вы знаете Perl, поэтому ключевая строка - это grep, который просто зацикливается на каждом частном диапазоне адресов. Вы берете свой IP, побитовый и его с сетевой маской, и сравниваете с сетевым адресом. Если равен, то это часть этой частной сети.

3 голосов
/ 12 мая 2010

выглядит правильно. Лично я бы изменил первый на:

^127\.0 

При этом: (^127\.0\.0\.1) вы ищете все, что начинается с 127.0.0.1 и пропускает 127.0.0.2*, 127.0.2.*, 127.0.* и т. Д.

1 голос
/ 02 июня 2017

вот что я использую в python:

rfc1918 = re.compile('^(10(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){3}|((172\.(1[6-9]|2[0-9]|3[01]))|192\.168)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){2})$')

Вы можете удалить якоря ^ и / или $, если хотите.

Я предпочитаю приведенное выше регулярное выражение, потому что оно отсеивает недопустимые октеты (что-либо выше 255).

пример использования:

if rfc1918.match(ip):
    print "ip is private"
1 голос
/ 13 марта 2015

Если вы ищете system.net defaultProxy и конфигурацию обходного списка прокси, которая использует прокси для внешних, но использует прямые соединения для внутренних хостов (может быть с некоторой поддержкой ipv6) ...

<system.net>
  <defaultProxy enabled="true">
    <proxy proxyaddress="http://proxycluster.privatedomain.net:8080" bypassonlocal="True"  />
    <bypasslist>
      <!-- exclude local host -->
      <add address="^(http|https)://localhost$" />
      <!-- excludes *.privatedomain.net -->
      <add address="^(http|https)://.*\.privatedomain\.net$" />
      <!-- excludes simple host names -->
      <add address="^(http|https)://[a-z][a-z0-9\-_]*$" />
      <!-- exclude private network addresses 192.168, 172.16..31 through 31, 127.* etc. -->
      <add address="^(http|https)://((((127)|(10))\.[0-9]+\.[0-9]+\.[0-9]+)|(((172\.(1[6-9]|2[0-9]|3[0-1]))|(192\.168))\.[0-9]+\.[0-9]+))$"/>
    </bypasslist>
  </defaultProxy>
  <connectionManagement>
    <add address="*" maxconnection="10" />
  </connectionManagement>
</system.net>
0 голосов
/ 01 мая 2017
     //RegEx to check for the following ranges. IPv4 only
         //172.16-31.xxx.xxx
         //10.xxx.xxx.xxx
         //169.254.xxx.xxx
         //192.168.xxx.xxx

     var regex = /(^127\.)|(^(0)?10\.)|(^172\.(0)?1[6-9]\.)|(^172\.(0)?2[0-9]\.)|(^172\.(0)?3[0-1]\.)|(^169\.254\.)|(^192\.168\.)/;
0 голосов
/ 05 января 2016

ПОЭТОМУ этот шаблон был более чем на 10% быстрее при использовании pattern.matcher:

^1((0)|(92\\.168)|(72\\.((1[6-9])|(2[0-9])|(3[0-1])))|(27))\\.
...