web-dev-qa-db-ja.com

IPv4およびIPv6ホストとネットワークの保管

MySQLデータベースにIPv4/v6アドレスとネットワーク(CIDR表記)を保存する必要があります。残念ながら、Mysqlを使用するように制限されています。

したがって、私は inet type of PostgreSql。 に相当するものを探しています:

inetタイプは、IPv4またはIPv6ホストアドレス、およびオプションでそのサブネットをすべて1つのフィールドに保持します。サブネットは、ホストアドレス(「ネットマスク」)に存在するネットワークアドレスビットの数で表されます。ネットマスクが32でアドレスがIPv4の場合、値はサブネットではなく単一のホストを示します。 IPv6では、アドレス長は128ビットなので、128ビットは一意のホストアドレスを指定します。

このタイプの入力フォーマットは、address/yです。addressはIPv4またはIPv6アドレスで、yはネットマスクのビット数です。/yの部分がない場合、ネットマスクはIPv4の場合は32、IPv6の場合は128になるため、値は単一のホストのみを表します。表示では、ネットマスクが単一のホストを指定している場合、/ yの部分は抑制されます。

Mysql 5.6の以下の関数を認識しています INET_ATON()、INET_NTOA()、INET6_ATON()、INET6_NTOA() 。しかし、Mysql 5.5を使用しています... つまり、INET6_xxxxを忘れてください

次の質問 " Storing IP address "も知っていますが、ネットワークCIDR表記は扱いません。

Mysql 5.5でinet型に相当するものをどのように実装しますか?

  • 3列:ネットワーク(2xBIGINT)、CIDR(TINYINT)?
  • ストリング ? (@Phil)
5
Yohann

まず、MySQLにはinetタイプのPostgreSqlに相当するものはまだありません。

あらゆる種類のIPアドレスを格納するには、stringタイプを使用するだけです。それらをすべて特定の形式で必要とする場合は、DBに挿入する前に変換してください。

それらを使用して計算を行う必要がある場合、前述のように、INET_ATON()およびINET_NTOA()は、使用する必要のある関数です。

1
rubo77

Rubo77に基づいて構築...アドレスブロックがCIDR表記で格納されている場合、ブロックの最初と最後のIPアドレスを決定することが望ましい場合があります。

cIDRブロックが「10.20.30.40/24」であると仮定します

mysql test> set @cidr:='10.20.30.40/24';
Query OK, 0 rows affected (0.00 sec)

mysql test> select @cidr;
+----------------+
| @cidr          |
+----------------+
| 10.20.30.40/24 |
+----------------+
1 row in set (0.00 sec)

99%の確率で、cidr表記のアドレスはアドレスブロックの最初のアドレスです。時々、人々は間違いを犯します(私が意図的にここでやったように)、それで私たちは安全のために最初のアドレスを見つけることができます...

select inet_ntoa( (@shifted_network_number :=
                   inet_aton(substring_index(@cidr,'/',1)) >> (@Host_bits:=(32-substring_index(@cidr,'/',-1))))
                                                           << @Host_bits) as starting_ip;
+-------------+
| starting_ip |
+-------------+
| 10.20.30.0  |
+-------------+
1 row in set (0.00 sec)

終了アドレス...

select inet_ntoa( ((@shifted_network_number :=
                 inet_aton(substring_index(@cidr,'/',1)) >> (@Host_bits:=(32-substring_index(@cidr,'/',-1)))) + 1
                                                         << @Host_bits) - 1) as starting_ip;
+--------------+
| starting_ip  |
+--------------+
| 10.20.30.255 |
+--------------+
1 row in set (0.00 sec)

アドレス範囲...

select concat( inet_ntoa( (@shifted_network_number :=
                       inet_aton(substring_index(@cidr,'/',1)) >> (@Host_bits:=(32-substring_index(@cidr,'/',-1))))
                                                               << @Host_bits)
              , ' - '
              , inet_ntoa( (((@shifted_network_number + 1) << @Host_bits) - 1))) as IP_Range;
+---------------------------+
| IP_Range                  |
+---------------------------+
| 10.20.30.0 - 10.20.30.255 |
+---------------------------+
1 row in set (0.01 sec)
0
RMathis