Подтвердить что ты не робот

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

Мне интересно, если это лучший способ сопоставить строку, которая начинается с частного IP-адреса (Perge-regex):

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

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

4b9b3361

Ответ 1

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

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.

Ответ 2

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

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

Ответ 3

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

РЕГЭКСП ДЛЯ КЛАССА СЕТЕЙ:

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

РЕГЭКСП ДЛЯ СЕТЕЙ КЛАССА B:

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

РЕГЭКСП ДЛЯ СЕТЕЙ КЛАССА C:

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

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

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

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

Ответ 4

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

^127\.0 

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

Ответ 5

Это на тот случай, если вы решите пойти с моим комментарием, предложив вам не использовать регулярные выражения. Untested (но, вероятно, работает или, по крайней мере, близко), в 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 regexp не означает, что вы знаете Perl, поэтому в ключевой строке есть "grep", который просто перебирает каждый диапазон адресов. Вы берете свой IP-адрес, побитовое, а также сетевую маску и сравниваете с сетевым адресом. Если он равен, его часть этой частной сети.

Ответ 6

Если вы ищете конфигурацию по умолчанию для прокси-сервера system.net и прокси-сервера, которая использует прокси для внешних, но использует прямые подключения для внутренних хостов (может быть с поддержкой 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>

Ответ 7

вот что я использую в 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"

Ответ 8

     //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\.)/;

Ответ 9

FWIW этот шаблон был более 10% быстрее, используя pattern.matcher:

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