web-dev-qa-db-ja.com

正規表現のプライベートIPアドレス識別子

これがプライベートIPアドレス(Perlスタイルの正規表現)で始まる文字列に一致する最善の方法であるかどうか疑問に思っています。

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

どうもありがとう!

31
caseyamcl

私はあなたがこれらの範囲を一致させたいと思っています:

 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などを受け入れます。

53
Mark Byers

これは、Markの正解と同じですが、IPv6プライベートアドレスが含まれるようになりました。

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

私はこれを生成しました

クラスAネットワークのREGEXP:

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

クラスBネットワークのREGEXP:

(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ネットワークのREGEXP:

(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]。)。*"

10
user3177026

これは、あなたが私のコメントに行くことにした場合のために、正規表現を使用しないことを示唆しています。テストされていない(ただし、おそらく動作するか、少なくとも近い)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 からダウンロードします。

編集:Perl正規表現を要求してもPerlを知っているとは限らないので、重要なのは、各プライベートアドレス範囲をループする「grep」があることです。 IPをビット単位で取得し、ネットマスクを使用して、ネットワークアドレスと比較します。等しい場合、そのプライベートネットワークの一部。

3
derobert

右に見えます。個人的に、私は最初のものを次のように変更します:

^127\.0 

これを使用すると、(^127\.0\.0\.1)で始まり、127.0.0.1で始まり、127.0.0.2*127.0.2.*127.0.*などを見逃す可能性があります。

3
KM.

System.net defaultProxyおよび外部のプロキシを使用するが内部ホストの直接接続を使用するプロキシbypasslist構成を探している場合(一部の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>
1
Mhano

これが私が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
Josh Worley
     //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