it-swarm.com.de

Private IP-Adresskennung in regulärem Ausdruck

Ich frage mich, ob dies der beste Weg ist, eine Zeichenfolge abzugleichen, die mit einer privaten IP-Adresse beginnt (Regex im Perl-Stil):

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

Vielen Dank!

29
caseyamcl

Ich gehe davon aus, dass Sie diese Bereiche anpassen möchten:

 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 ______.]

Es fehlen einige Punkte, die dazu führen würden, dass 172.169.0.0 akzeptiert wird, obwohl dies nicht akzeptiert werden sollte. Ich habe es unten repariert. Entfernen Sie die neuen Zeilen, um die Lesbarkeit zu erleichtern.

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

Beachten Sie auch, dass davon ausgegangen wird, dass die IP-Adressen bereits validiert wurden. Dies akzeptiert beispielsweise 10.foobar.

51
Mark Byers

Dies stimmt mit der korrekten Antwort von Mark überein, enthält jedoch jetzt private IPv6-Adressen.

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

Ich habe das generiert

REGEXP FÜR CLASS A NETWORKS: 

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

REGEXP FÜR NETZWERKE DER KLASSE 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 FÜR NETZWERKE DER KLASSE C: 

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

Lassen Sie mich wissen, wenn Sie einen Fehler feststellen

Wenn Sie sich Ihrer Ausgabe sicher sind (z. B. netstat) und Sie die Gültigkeit der IP-Adresse nicht überprüfen müssen, da dies bereits geschehen ist, können Sie mit dieser Formel private IP-Adressen abfangen

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

9
user3177026

Dies ist der Fall, wenn Sie sich für meinen Kommentar entscheiden und vorschlagen, dass Sie keine Regexx verwenden. Ungetestet (aber wahrscheinlich funktioniert oder zumindest schließen) in 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
}

Beachten Sie nun, wie @private nur Daten sind, die Sie leicht ändern können. Oder direkt von der Cymru Bogon Reference herunterladen.

edit: Es scheint mir, dass die Frage nach einem Perl regexp nicht bedeutet, dass Sie Perl kennen, also ist die Schlüssellinie dort das 'grep', das jeden privaten Adressbereich durchläuft. Du nimmst deine IP, bitweise und es mit der Netzmaske und vergleichst mit der Netzwerkadresse. Wenn es gleich ist, ist es Teil dieses privaten Netzwerks.

3
derobert

Sieht gut aus. Persönlich würde ich den ersten ändern:

^127\.0 

Mit diesem: (^127\.0\.0\.1) suchen Sie nach etwas, das mit 127.0.0.1 beginnt und 127.0.0.2*, 127.0.2.*, 127.0.* usw. verpassen wird. 

3
KM.

Wenn Sie nach system.net defaultProxy- und Proxy-Bypasslist-Konfig suchen, die einen Proxy für externe, aber direkte Verbindungen für interne Hosts verwendet (könnte einige Unterstützung für IPv6 bieten) ...

<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

folgendes verwende ich in 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})$')

Sie können die Anker ^ und/oder $ entfernen, wenn Sie möchten.

Ich bevorzuge den obigen Regex, weil er ungültige Oktette (etwas über 255) aussortiert.

verwendungsbeispiel:

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