IPv4/v6のしくみ

いちごパック > サーバ > IPv4/v6のしくみ

IPとは

インターネットやLANといったネットワークでは、 主にインターネットプロトコル(IP)と呼ばれる方法を利用して通信しています。 IPの通信データは、IPパケットと呼ばれる単位でやりとりされています。
IPパケットにはバージョン4(IPv4)とバージョン6(IPv6)があります。 このページでは、IPv4、IPv6の2つについて説明します。

イーサネット

多くのPCやサーバはルータを介してインターネット接続を行います。 つまり、PCやサーバ自身はルータとのネットワーク通信を行っています。 この通信で使う通信方法がイーサネットです。 IPの説明に入る前に、まずローカルネットワーク用の通信方法であるイーサネットについて説明します。
イーサネットでは、通信相手を識別するためにMACアドレスと呼ばれる48bitの数値を利用します。 イーサネットの通信はパケット単位で行われ、各パケットは次の情報を含みます。
  • 送信元MACアドレス (48bit)
  • 宛先MACアドレス (48bit)

  • イーサネットパケットが宛先に届く保証はなく、途中で捨てられることもあります。 パケットのサイズが大きすぎると、イーサネットはそのパケットを送ることができません。

    IPv4パケット

    IPもイーサネットと同様、パケット単位の通信です。IPのパケットはイーサネットのデータとして送受信されます。 IPv4では、イーサネットでは、通信相手を識別するためにIPアドレスと呼ばれる32bitの数値を利用します。
    IPv4のIPパケットは、以下の情報を含む多くのフィールドで構成されています。
  • IPデータの分割情報
  • プロトコル番号 (8bit) 1:ICMP, 6:TCP, 17:UDP
  • 送信元IPv4アドレス (32bit)
  • 宛先IPv4アドレス (32bit)

  • インターネット通信では、IPパケットのプロトコルとして、ICMP、TCP、UDPがよく使われます。
    IPパケットが宛先に届く保証はなく、途中で捨てられることもあります。 パケットのサイズが大きすぎる場合、途中でパケット分割されて送られます。

    ICMPv4

    ICMPv4は、 pingと呼ばれる相手の生存確認や、IPパケットを利用した通信のエラー通知に利用するものです。
    ICMPによる通知は、故意に通信エラーを起こしてその反応をみるなど、攻撃に利用される可能性があります。 IPv4の場合、クライアントPCやwebサーバであれば、ICMPを破棄してもそれほど問題ないでしょう。

    IPv4とMACアドレス

    IPv4で使われる32bitのIPアドレスは、イーサネットで使われるMACアドレスとは関係ありません。 そのため、IPアドレスとMACアドレスの対応表が必要になります。 この対応表は、次のいずれかの方法により準備できます。
  • 自動的に対応表を作成させる。手軽ですが、偽の表を送り付けられる可能性はあります。
  • 予め対応表を準備しておく。安全性は高いですが、手間がかかります。

  • どちらも一長一短です。 サーバとして運用する場合は、対応表を準備しておくことが望ましいでしょう。
    自動的に対応表を作成する場合は、 イーサネット対応ソフトウェアの標準的な機能であるARPを使います。 ARPは、イーサネットで次の2種類のパケットを送受信するものです。 ARP自体はIPアドレス以外も扱えるように設計されていますが、IPv4以外ではあまり使われていないようです。 ARPリクエストを送ると、そのIPアドレスを持つPCやサーバからMACアドレスつきでリプライが返ってきます。
  • パケットの種類 (情報取得リクエスト、情報リプライ)
  • 送信元MACアドレス、送信元IPアドレス
  • (リクエスト時) MACアドレスを知りたい宛先IPアドレス
  • (リプライ時) 宛先MACアドレス、宛先IPアドレス
  • ARPリクエストの時点では宛先がわかりませんので、このパケットはローカルネットワーク全体に送られます。
    手作業で追加する方法はOSごとに違います。例えばLinuxであれば次のようにします。 長いため改行を入れてありますが、このコマンドを1行で入力します。
    % sudo ip neighbour add ***.***.***.***
        lladdr **:**:**:**:**:** dev eth0 nud permanent
    
    ARPで自動作成された対応表も含めた対応表は、次のコマンドで確認できます。
    % sudo ip neighbour show
    

    IPv6パケット

    IPv6はIPv4と同様に、パケット単位の通信です。 アドレスが32bitではなく、128bitの数値である点がIPv4とは異なります。 このアドレスをIPv6アドレスと呼ぶことにします。
    IPv6のIPパケットは、以下の情報を含みます。
  • プロトコル番号 (8bit) 1:ICMP, 6:TCP, 17:UDP
  • 送信元IPv6アドレス (128bit)
  • 宛先IPv6アドレス (128bit)

  • IPv6では、パケット分割は送信側のみが行います。途中で分割されることはありません。

    ICMPv6

    IPv6にもICMPがあり、ICMPv6と呼ばれています。 IPv4と同様、pingと呼ばれる相手の生存確認や、IPパケットを利用した通信のエラー通知に利用されます。 また、IPv6だけの機能として、ルータ情報の取得や後述のMACアドレス対応表作成にも利用されます。
    ICMPv6も攻撃に利用される可能性がある点ではICMPv4と同じですが、 ICMPv4と違い、ICMPv6のパケットをすべて破棄すると通信に重大な支障が出ますので注意が必要です。
    ICMPv6の主なタイプは次の通りです。 完全なリストはIANAのICMPv6パラメータ一覧にあります。
    タイプ番号種類内容
    1Destination Unreachable(エラー)宛先アドレスに到達できなかった。
    2Packet Too Big(エラー)パケットサイズが大きすぎた。送り出し側で調整が必要。
    3Time Exceeded(エラー)中継ルータ数が多すぎたか、または分割されたパケットを再構築できなかった。
    4Parameter Problem(エラー)IPv6ヘッダエラーが検出された。
    128Echo Requestpingの送信。
    129Echo Replypingの受信。
    133Router SolicitationルータへのRouter Advertisementの即時発行リクエスト。
    134Router Advertisementルータ情報。ルータはこの情報を定期的に送信する。リクエストされたときも送信する。
    135Neighbor SolicitationIPv6アドレスとMACアドレスへの対応付けリクエスト。
    136Neighbor AdvertisementIPv6アドレスとMACアドレスへの対応付け情報。

    IPv6とMACアドレス

    IPv6のパケットもIPv4と同様、イーサネット上ではデータとして送受信されます。 したがって、IPv6でもIPv6アドレスとMACアドレスの対応表が必要になります。
    IPv4では、イーサネットの機能であるARPにより対応表を自動的に作成していました。 IPv6では、ICMPv6を使って対応表を自動的に作成します。 対応表の作成にはNeighbor Discovery Protocol (NDP)と呼ばれるプロトコルが使われます。
    IPv6アドレスとMACアドレスとの対応を得るために使われるICMPv6パケットは、次の2種類です。
  • MACアドレス問い合わせ (Neighbor Solicitation: 135)
  • MACアドレス返答 (Neighbor Advertisement: 136)
  • Neighbor Solicitationの時点では宛先がわかりませんので、このパケットは特殊なマルチキャストアドレスに送られます。

    TCP/IP

    IPヘッダでTCPが指定された場合、IPデータはTCPヘッダとTCPデータを持ちます。 TCPヘッダは次の情報を含みます。
  • 送信元ポート番号 (16bit)
  • 宛先ポート番号 (16bit)
  • ACKフラグ
  • RSTフラグ
  • SYNフラグ
  • FINフラグ

  • TCPには接続という概念があり、SYNは接続するときに、FINは接続を終了させるときに、それぞれ使われます。 ACKはTCPのパケットを正しく受け取ったことを通知するために使われ、 RSTは異常な接続状態が検出された場合にその状態をリセットする場合に使われます。
    TCPの接続時には、クライアントがSYNを送る、サーバがSYN+ACKを送る、クライアントがACKを送る、の3回の通信が行われます。 最初にSYNを送らないIPパケットは、攻撃を意図していると考えてよいでしょう。
    TCPのポート番号は、通信内容を識別するための番号です。 サーバで使うためのポート番号は組織的に管理されています。 これらの番号はwell knownポート番号や登録ポート番号ととして知られ、よく使われてます。 管理されたポート番号ではなく、別のポート番号を使ってもOKです。

    UDP/IP

    IPヘッダでUDPが指定された場合には、UDPヘッダとUDPデータを持ちます。 UDPには接続という概念はありません。UDPヘッダには以下の情報が含まれます。
  • 送信元ポート番号 (16bit)
  • 宛先ポート番号 (16bit)

  • UDPのポート番号もTCPと同様に、通信内容を識別するための番号です。 UDPにもwell knownポート番号や登録ポート番号があります。 また、TCPと同様、別のポート番号を使ってもOKです。

    TCP、UDPのポート番号

    登録ポート番号のうち、 よく使われるポート番号は攻撃の的になりやすいと考えられます。
    よく使われるポート番号の一部を示しておきます。
    TCP21FTPファイルの取得
    TCP22ssh暗号化リモートアクセス
    TCP23telnetリモートアクセス
    TCP25SMTPメール送信
    UDP53DNSホスト名の解決
    UDP67DHCPIPアドレスの割り当てサーバ
    UDP68DHCPIPアドレスの自動取得
    TCP80HTTPWebコンテンツの取得
    TCP110POP3メール受信
    TCP123NTP時刻取得
    UDP137NetBIOSWindowsネットワーク Name
    UDP138NetBIOSWindowsネットワーク Data
    TCP139NetBIOSWindowsネットワーク Session
    TCP443HTTPS暗号化通信を使ったWebコンテンツの取得
    TCP445SMBWindowsファイルの共有
    TCP465SMTPS暗号化通信を使ったメール送信
    TCP995POP3S暗号化通信を使ったメール受信
    TCP1433MSSQLSQLサーバ
    TCP3389RDPWindowsリモートデスクトップ