これがプライベートIPアドレス(Perlスタイルの正規表現)で始まる文字列に一致する最善の方法であるかどうか疑問に思っています。
(^127\.0\.0\.1)|(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-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
などを受け入れます。
これは、Markの正解と同じですが、IPv6プライベートアドレスが含まれるようになりました。
/(^127\.)|(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/
私はこれを生成しました
クラス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]。)。*"
これは、あなたが私のコメントに行くことにした場合のために、正規表現を使用しないことを示唆しています。テストされていない(ただし、おそらく動作するか、少なくとも近い)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をビット単位で取得し、ネットマスクを使用して、ネットワークアドレスと比較します。等しい場合、そのプライベートネットワークの一部。
右に見えます。個人的に、私は最初のものを次のように変更します:
^127\.0
これを使用すると、(^127\.0\.0\.1)
で始まり、127.0.0.1
で始まり、127.0.0.2*
、127.0.2.*
、127.0.*
などを見逃す可能性があります。
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>
これが私が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"
//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\.)/;