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で自動作成された対応表も含めた対応表は、次のコマンドで確認できます。
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パラメータ一覧にあります。
タイプ番号 | 種類 | 内容 |
1 | Destination Unreachable | (エラー)宛先アドレスに到達できなかった。 |
2 | Packet Too Big | (エラー)パケットサイズが大きすぎた。送り出し側で調整が必要。 |
3 | Time Exceeded | (エラー)中継ルータ数が多すぎたか、または分割されたパケットを再構築できなかった。 |
4 | Parameter Problem | (エラー)IPv6ヘッダエラーが検出された。 |
128 | Echo Request | pingの送信。 |
129 | Echo Reply | pingの受信。 |
133 | Router Solicitation | ルータへのRouter Advertisementの即時発行リクエスト。 |
134 | Router Advertisement | ルータ情報。ルータはこの情報を定期的に送信する。リクエストされたときも送信する。 |
135 | Neighbor Solicitation | IPv6アドレスとMACアドレスへの対応付けリクエスト。 |
136 | Neighbor Advertisement | IPv6アドレスと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のポート番号
登録ポート番号のうち、
よく使われるポート番号は攻撃の的になりやすいと考えられます。
よく使われるポート番号の一部を示しておきます。
TCP | 21 | FTP | ファイルの取得 |
TCP | 22 | ssh | 暗号化リモートアクセス |
TCP | 23 | telnet | リモートアクセス |
TCP | 25 | SMTP | メール送信 |
UDP | 53 | DNS | ホスト名の解決 |
UDP | 67 | DHCP | IPアドレスの割り当てサーバ |
UDP | 68 | DHCP | IPアドレスの自動取得 |
TCP | 80 | HTTP | Webコンテンツの取得 |
TCP | 110 | POP3 | メール受信 |
TCP | 123 | NTP | 時刻取得 |
UDP | 137 | NetBIOS | Windowsネットワーク Name |
UDP | 138 | NetBIOS | Windowsネットワーク Data |
TCP | 139 | NetBIOS | Windowsネットワーク Session |
TCP | 443 | HTTPS | 暗号化通信を使ったWebコンテンツの取得 |
TCP | 445 | SMB | Windowsファイルの共有 |
TCP | 465 | SMTPS | 暗号化通信を使ったメール送信 |
TCP | 995 | POP3S | 暗号化通信を使ったメール受信 |
TCP | 1433 | MSSQL | SQLサーバ |
TCP | 3389 | RDP | Windowsリモートデスクトップ |