Identifiant d'adresse IP privée dans L'Expression régulière

Je me demande si c'est la meilleure façon de faire correspondre une chaîne qui commence par une adresse IP privée (Regex de style Perl):

(^127.0.0.1)|(^192.168)|(^10.)|(^172.1[6-9])|(^172.2[0-9])|(^172.3[0-1])

Merci beaucoup!

29
demandé sur Liath 2010-05-11 23:55:09

9 réponses

Je suppose que vous voulez faire correspondre ces plages:

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

Il vous manque quelques points qui le feraient accepter par exemple 172.169.0.0 même si cela ne devrait pas être accepté. J'ai corrigé ci-dessous. Supprimez les nouvelles lignes, c'est juste pour la lisibilité.

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

Notez également que cela suppose que les adresses IP ont déjà été validées - il accepte des choses comme 10.foobar.

50
répondu Mark Byers 2015-07-19 15:51:38

C'est la même chose que la bonne réponse par Mark, mais maintenant y compris les adresses privées IPv6.

/(^127\.)|(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/
16
répondu Edward 2015-03-15 08:00:36

J'ai généré ceci

REGEXP POUR LES RÉSEAUX DE CLASSE A:

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

REGEXP POUR LES RÉSEAUX DE CLASSE 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 POUR LES RÉSEAUX DE CLASSE C:

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

Faites-moi savoir si vous rencontrez une erreur

Si vous êtes sûr de votre sortie (par exemple netstat) et que vous n'avez pas besoin de vérifier la validité de l'adresse IP car cela est déjà fait, vous pouvez attraper des adresses IP privées avec cette formule

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

9
répondu user3177026 2018-02-02 15:33:45

C'est dans le cas où vous décidez d'aller avec mon commentaire, suggérant que vous n'utilisez pas les expressions rationnelles. Non testé (mais fonctionne probablement, ou au moins proche), en 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
}

Remarque maintenant comment @private est juste des données, que vous pouvez facilement changer. Ou téléchargez à la volée à partir de la référence Cymru Bogon .

Edit: il me semble que Demander une expression rationnelle Perl ne signifie pas que vous connaissez Perl, donc la ligne de clé est là est le 'grep', qui boucle juste sur chaque plage d'adresses privées. Vous prenez votre IP, bit à bit et avec le masque de réseau, et comparer à l'adresse réseau. Si égale, sa partie de ce réseau privé.

3
répondu derobert 2010-05-11 20:33:39

Ça a l'air bien. Personnellement, je changerais le premier en:

^127\.0 

Avec ceci: (^127\.0\.0\.1) vous cherchez tout ce qui commence par 127.0.0.1 et va manquer 127.0.0.2*, 127.0.2.*, 127.0.* etc.

3
répondu KM. 2013-08-26 22:57:54

Si vous cherchez system.net defaultProxy et proxy bypasslist config qui utilise un proxy pour externe mais utilise des connexions directes pour les hôtes internes(pourrait faire avec un support 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
répondu Mhano 2015-03-13 10:01:23

Voici ce que j'utilise en 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})$')

Vous pouvez supprimer les ancres ^ et/ou $ si vous le souhaitez.

Je préfère l'expression rationnelle ci-dessus car elle élimine les octets invalides (tout ce qui dépasse 255).

Exemple d'utilisation:

if rfc1918.match(ip):
    print "ip is private"
1
répondu Josh Worley 2017-06-02 16:45:39
     //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
répondu HellKnight Hicks 2017-05-01 15:51:53

FWIW Ce modèle était plus de 10% plus rapide en utilisant pattern.matcher:

^1((0)|(92\\.168)|(72\\.((1[6-9])|(2[0-9])|(3[0-1])))|(27))\\.
-1
répondu scott 2017-02-28 21:15:23