net_MACアドレスとは

07MACアドレスとは

MACアドレスとは、「Media Access Control Address」の略で、ネットワークに接続されたデバイスが持つ固有の識別番号のことを指します。 このアドレスは、デバイスのネットワークインターフェースカード(NIC)に工場出荷時に割り当てられ、通常は変更されることはありません。MACアドレスは通常、16進数を用いた形式で表され、「00:1A:2B:3C:4D:5E」のように6つのグループに分けられます。これらはコロン(:)またはハイフン(-)で区切られます。MACアドレスの最初の3つのグループ(例では「00:1A:2B」)によりデバイスの製造者を識別できます。残りの3つのグループ(例では「3C:4D:5E」)は製造者が割り当てる固有の番号で、同じ製造者から出された異なるデバイスを識別します。

IPアドレスとMACアドレスの違い

ネットワーク上でのデータの送受信において、各デバイスにはIPアドレスとMACアドレスが割り当てられますが、これらのアドレスは異なる目的で使用されます。IPアドレスはデータパケットが最終的に到達すべき場所を指し示し、MACアドレスはデータがネットワーク上で移動する際に通過する各デバイス、すなわち各乗り換え駅を示します。これにより、データはネットワーク内を効率的かつ正確に移動し、正しいデバイスに届けられます。IPアドレスとMACアドレスは、互いに補完しあいながらネットワーク上でのデータの正確な送受信を可能にします。これらの違いを理解するために、新宿駅から新大阪駅への列車移動を例にして説明します。

IPアドレスの役割

IPアドレスは、列車移動の開始地点である新宿から、最終目的地である新大阪までの全体のルートを指し示します。このアドレスは、データパケットが最終的に到達すべきデバイスの位置、つまりデータが届けられるべき「郵便住所」のようなものです。たとえ途中で乗り換えが必要であっても、IPアドレスは終点の新大阪駅までの切符として機能します。

MACアドレスの役割

一方、MACアドレスは、新宿から新大阪への旅の中で、データパケットが通過する必要がある具体的な目的地、つまり乗り換え駅を示します。例えば、新宿から東京、そして東京から新大阪へと進む場合で説明すると

  • 新宿から東京への移動: この区間でデータパケットが向かうべき次の目的地は東京駅です。東京駅のMACアドレスが指定され、新宿駅のネットワークデバイスはこのアドレスに基づいてデータパケットを東京へと送ります。
  • 東京から新大阪への移動: 東京駅に到着したデータパケットは次に新大阪へと進みます。この区間での目的地は新大阪駅で、新大阪駅のMACアドレスが次の目的地として設定されます。

IPアドレスとMACアドレスの実践的な運用を知ろう

前節では、MACアドレスとIPアドレスの基本的な説明と、その違いについて詳しく説明しました。本節では、実際のネットワーク間での通信を通じて、これらのアドレスがどのように運用されているかを観察し、理解を深めます。

ネットワーク構成

今回は北海道、東京、大阪、福岡にそれぞれ仮想ネットワークを構成し、各地点にIPアドレスを振り分けています。各地点のネットワークは以下のように設定されています.

地点インターフェースIPアドレス
北海道hokkaido-tokyo172.0.2.1/24
東京tokyo-hokkaido172.0.2.254/24
東京tokyo-osaka174.0.2.1/24
大阪osaka-tokyo174.0.2.254/24
大阪osaka-fukuoka176.0.2.1/24
福岡fukuoka-osaka176.0.2.254/24

各地点はルーターとして機能し、次の地点へのデータパケットを適切に転送します。ルーターはネットワーク間のトラフィックを管理し、パケットの経路を決定する重要な役割を担っています。

通信シナリオの設定

北海道にあるデバイスから福岡のデバイスへデータパケットを送信します。このプロセスを監視するため、通信疎通を確認する際に使用する**ping** コマンドでデータパケットを送信し、通信をトレースする際に使用する**tcpdump** コマンドでパケットの中身を確認します。pingコマンド、tcpdumpコマンドについては本節以降に説明しますので、今はMACアドレスとIPアドレスの運用の違いについて着目してください。ネットワーク構成は以下の通りです。

// todo 図がとても分かりにくい

IPアドレスとMACアドレスの運用の違い(確認用)

IPアドレスは、ネットワーク上でデバイスを識別するための論理アドレスです。データが北海道から福岡に送信される際、パケットの送信元および宛先IPアドレスは一貫して北海道(172.0.2.1)と福岡(176.0.2.254)のままです。

一方、MACアドレスは、データリンク層での通信に使用される物理アドレスです。各ネットワークセグメントごとにデータが次のルーターに転送される際、MACアドレスはそのルーターのインターフェースに応じて変更されます。これにより、データがネットワークを通じて正確に伝達されます。では、これらの現象を実際に確認していきましょう.

ping コマンドによるパケット送信

北海道のデバイスから福岡のデバイスへICMPエコーリクエストを送信した際の実行結果です。 これにより、データパケットが指定されたIPアドレスに正確に到達するかを確認します。

$ ip netns exec hokkaido ping 176.0.2.254 -c 3
PING 176.0.2.254 (176.0.2.254) 56(84) bytes of data.
64 bytes from 176.0.2.254: icmp_seq=1 ttl=62 time=0.075 ms
64 bytes from 176.0.2.254: icmp_seq=2 ttl=62 time=0.177 ms
64 bytes from 176.0.2.254: icmp_seq=3 ttl=62 time=0.175 ms

--- 176.0.2.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2035ms
rtt min/avg/max/mdev = 0.075/0.142/0.177/0.047 ms

この結果から、全てのエコーリクエストが成功し、パケットロスがないことが確認できます。IPアドレスは通信全体を通して一貫しており、正確なルーティングが行われています。

【コラム】pingコマンドとは

pingコマンドは、ネットワーク上のデバイスとの通信が正常に行われているか
どうかを確認するためのコマンドです。
pingコマンドは、指定した宛先にICMP(Internet Control Message Protocol)エコーリクエストを送信し、相手からの応答(エコーリプライ)を待ちます。
通信がうまくいくと、通信相手からのパケットが返ってきます。
通信がうまくいかない場合、パケットが返ってこず、エラーメッセージが表示されます。このプロセスにより、ネットワーク接続の状態やパケットの往復時間(ラウンドトリップタイム)を確認することができます。先ほどのPingコマンドの実行例では,パケットの往復時間が表示されたログが出力されていることや
「0% packet loss」の表示があることから,指定した通信相手との通信が正常に行われていることが確認できます

tcpdump コマンドによるパケットトレース

北海道から東京間と大阪から福岡間、それぞれパケットの通り道を指定して tcpdumpコマンドを用いてパケットの中身を確認していきます.pingコマンドの実行前に、TCPDUMPコマンドを使って各リンクのパケットをキャプチャしました。

東京〜北海道間でのパケットの中身

root@b9f15438cc2c:/# ip netns exec tokyo tcpdump -i tokyo-hokkaido -e
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tokyo-hokkaido, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:04:25.930081 5a:5f:2e:fb:8b:7a (oui Unknown) > e6:48:4d:c2:49:18 (oui Unknown), ethertype IPv4 (0x0800), length 98: 172.0.2.1 > 176.0.2.254: ICMP echo request, id 50518, seq 1, length 64
13:04:25.930143 e6:48:4d:c2:49:18 (oui Unknown) > 5a:5f:2e:fb:8b:7a (oui Unknown), ethertype IPv4 (0x0800), length 98: 176.0.2.254 > 172.0.2.1: ICMP echo reply, id 50518, seq 1, length 64
13:04:26.952915 5a:5f:2e:fb:8b:7a (oui Unknown) > e6:48:4d:c2:49:18 (oui Unknown), ethertype IPv4 (0x0800), length 98: 172.0.2.1 > 176.0.2.254: ICMP echo request, id 50518, seq 2, length 64
13:04:26.953069 e6:48:4d:c2:49:18 (oui Unknown) > 5a:5f:2e:fb:8b:7a (oui Unknown), ethertype IPv4 (0x0800), length 98: 176.0.2.254 > 172.0.2.1: ICMP echo reply, id 50518, seq 2, length 64
13:04:27.974180 5a:5f:2e:fb:8b:7a (oui Unknown) > e6:48:4d:c2:49:18 (oui Unknown), ethertype IPv4 (0x0800), length 98: 172.0.2.1 > 176.0.2.254: ICMP echo request, id 50518, seq 3, length 64
13:04:27.974329 e6:48:4d:c2:49:18 (oui Unknown) > 5a:5f:2e:fb:8b:7a (oui Unknown), ethertype IPv4 (0x0800), length 98: 176.0.2.254 > 172.0.2.1: ICMP echo reply, id 50518, seq 3, length 64

フィールド説明
送信元IPアドレス172.0.2.1パケットを送信したデバイスのIPアドレス
送信先IPアドレス176.0.2.254パケットの宛先デバイスのIPアドレス
送信元MACアドレス5a:5f:2e:fb:8b:7aパケットを送信したネットワークインターフェースのMACアドレス
送信先MACアドレスe6:48:4d:c2:49:18パケットの宛先ネットワークインターフェースのMACアドレス

大阪〜福岡間でのパケットの中身

root@b9f15438cc2c:/# ip netns exec osaka tcpdump -i osaka-fukuoka -e
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on osaka-fukuoka, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:04:25.930106 96:44:62:72:48:64 (oui Unknown) > ae:c8:da:13:6a:f6 (oui Unknown), ethertype IPv4 (0x0800), length 98: 172.0.2.1 > 176.0.2.254: ICMP echo request, id 50518, seq 1, length 64
13:04:25.930127 ae:c8:da:13:6a:f6 (oui Unknown) > 96:44:62:72:48:64 (oui Unknown), ethertype IPv4 (0x0800), length 98: 176.0.2.254 > 172.0.2.1: ICMP echo reply, id 50518, seq 1, length 64
13:04:26.952978 96:44:62:72:48:64 (oui Unknown) > ae:c8:da:13:6a:f6 (oui Unknown), ethertype IPv4 (0x0800), length 98: 172.0.2.1 > 176.0.2.254: ICMP echo request, id 50518, seq 2, length 64
13:04:26.953030 ae:c8:da:13:6a:f6 (oui Unknown) > 96:44:62:72:48:64 (oui Unknown), ethertype IPv4 (0x0800), length 98: 176.0.2.254 > 172.0.2.1: ICMP echo reply, id 50518, seq 2, length 64
13:04:27.974241 96:44:62:72:48:64 (oui Unknown) > ae:c8:da:13:6a:f6 (oui Unknown), ethertype IPv4 (0x0800), length 98: 172.0.2.1 > 176.0.2.254: ICMP echo request, id 50518, seq 3, length 64
13:04:27.974292 ae:c8:da:13:6a:f6 (oui Unknown) > 96:44:62:72:48:64 (oui Unknown), ethertype IPv4 (0x0800), length 98: 176.0.2.254 > 172.0.2.1: ICMP echo reply, id 50518, seq 3, length 64
フィールド説明
送信元IPアドレス172.0.2.1パケットを送信したデバイスのIPアドレス
送信先IPアドレス176.0.2.254パケットの宛先デバイスのIPアドレス
送信元MACアドレス96:44:62:72:48:64パケットを送信したネットワークインターフェースのMACアドレス
送信先MACアドレスae:c8:da:13:6a:f6パケットの宛先ネットワークインターフェースのMACアドレス

まとめ

上記が、北海道から福岡にパケットを送った際に、北海道〜東京間、大阪〜福岡間のパケットをトレースした結果になります。この結果から、パケットの送信元および宛先のIPアドレスは全ての区間で一貫していることがわかります。一方、MACアドレスは各区間ごとに変わります。これにより、ネットワーク内の異なるセグメント間でデータが正確に転送されていることが確認できます。

トレースした結果の比較

区間送信元IPアドレス送信先IPアドレス送信元MACアドレス送信先MACアドレス
北海道〜東京間172.0.2.1176.0.2.2545a:5f:2e:fb:8b:7ae6:48:4d:c2:49:18
大阪〜福岡間172.0.2.1176.0.2.25496:44:62:72:48:64ae:c8:da:13:6a:f6

送信対象の特定手法

次に、前章で述べたパケットの送信プロセスにおいて、IPアドレスからMACアドレスへの変換がどのように行われるのかを具体的に見ていきましょう。この変換は、データを物理的に隣接するデバイスに正確に送信するために必要なステップです。前章で確認した通り、IPアドレスはインターネット全体での通信経路を指定するために使われますが、実際のデータの転送は、各デバイスの物理的なアドレスであるMACアドレスを基に行われます。ここでは、この重要な変換プロセスを支えるプロトコル、すなわちARP(IPv4の場合)とNDP(IPv6の場合)について詳しく解説します。

IPv4の時(ARP)

ARP(Address Resolution Protocol)は、IPアドレスからMACアドレスへの対応を解決するためにIPv4ネットワークで使用されます。具体的なプロセスは次のように進みます:

  1. 送信者は通信相手のIPアドレスを知っていますが、そのMACアドレスが分からない場合、ARPリクエストをネットワーク上にブロードキャストします。
  2. このARPリクエストは、ネットワーク上のすべてのデバイスに届き、指定されたIPアドレスを持つデバイスがARPリプライを送り返します。
  3. ARPリプライには、対象のデバイスのMACアドレスが含まれています。これにより、送信者はIPアドレスとMACアドレスの対応を知ることができ、データを正確に送信できるようになります。

実際の通信を確認してみよう(ARP)

北海道にあるデバイスから福岡のデバイスへデータパケットを送信します。ping コマンドでデータパケットを送信し、tcpdump コマンドでパケットの中身を確認します。今回は東京〜北海道間の通信をトレースして、ARPがどのような通信を行なっているか確認していきましょう.

pingコマンドの実行

root@b9f15438cc2c:/home/shell# ip netns exec hokkaido ping 176.0.2.254 -c 3
PING 176.0.2.254 (176.0.2.254) 56(84) bytes of data.
64 bytes from 176.0.2.254: icmp_seq=1 ttl=62 time=0.195 ms
64 bytes from 176.0.2.254: icmp_seq=2 ttl=62 time=0.196 ms
64 bytes from 176.0.2.254: icmp_seq=3 ttl=62 time=0.134 ms

--- 176.0.2.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2043ms
rtt min/avg/max/mdev = 0.134/0.175/0.196/0.029 ms

東京〜北海道間のパケットの状態

phpCopy code
root@b9f15438cc2c:/# ip netns exec tokyo tcpdump -i tokyo-hokkaido -e
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tokyo-hokkaido, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:22:29.964602 5a:5f:2e:fb:8b:7a (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 172.0.2.254 tell 172.0.2.1, length 28
13:22:29.964634 e6:48:4d:c2:49:18 (oui Unknown) > 5a:5f:2e:fb:8b:7a (oui Unknown), ethertype ARP (0x0806), length 42: Reply 172.0.2.254 is-at e6:48:4d:c2:49:18 (oui Unknown), length 28

この結果から分かることは、東京から北海道に送信されたARPリクエストと、それに対するARPリプライというものが通信として発生しているようです.それぞれ説明すると

  1. ARPリクエスト: 13:22:29.964602 の行に示されるように、東京のネットワークインターフェース 5a:5f:2e:fb:8b:7a はブロードキャストアドレス(全てのノードに送信)に対して「172.0.2.254のMACアドレスを教えてください」と要求しています。
  2. ARPリプライ: 13:22:29.964634 の行で、北海道のネットワークインターフェース e6:48:4d:c2:49:18 が東京のネットワークインターフェースに対して「172.0.2.254のMACアドレスは e6:48:4d:c2:49:18 です」と返答しています。

IPv6の時(近隣探索プロトコル)

IPv6では、ARPの代わりに近隣探索プロトコル(Neighbor Discovery Protocol, NDP)が使用されます。このプロトコルは、IPv6ネットワーク内のデバイス同士がお互いの存在を確認し、IPアドレスからMACアドレスへの対応を解決するために設計されています。NDPは次のように機能します:

  1. Neighbor Solicitation(NS)メッセージの送信(Type 135):通信元ノードが通信相手のIPv6アドレスに対応するMACアドレスを知りたい場合、NSメッセージを送信します。
  2. Neighbor Advertisement(NA)メッセージの応答(Type 136):通信相手のノードは、受け取ったNSメッセージに対してNAメッセージで応答し、自身のMACアドレスを通知します。

実際の通信を確認してみよう(NDP)

ARPの時と同じ条件でパケットの中身を確認してみましょう

pingコマンドの実行

root@b9f15438cc2c:/home/shell# ip netns exec hokkaido ping6 2001:db8:0:1::2 -c 3
PING 2001:db8:0:1::2(2001:db8:0:1::2) 56 data bytes
64 bytes from 2001:db8:0:1::2: icmp_seq=1 ttl=64 time=1.55 ms
64 bytes from 2001:db8:0:1::2: icmp_seq=2 ttl=64 time=0.086 ms
64 bytes from 2001:db8:0:1::2: icmp_seq=3 ttl=64 time=0.130 ms

--- 2001:db8:0:1::2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2021ms
rtt min/avg/max/mdev = 0.086/0.587/1.546/0.678 ms

東京〜北海道間のパケットの状態

phpCopy code
root@b9f15438cc2c:/# ip netns exec tokyo tcpdump -i tokyo-hokkaido icmp6
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tokyo-hokkaido, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:25:41.820584 IP6 2001:db8:0:1::1 > ff02::1:ff00:2: ICMP6, neighbor solicitation, who has 2001:db8:0:1::2, length 32
13:25:41.821264 IP6 2001:db8:0:1::2 > 2001:db8:0:1::1: ICMP6, neighbor advertisement, tgt is 2001:db8:0:1::2, length 32

この結果から分かることは、東京から北海道に送信されたNDP近隣要請と、それに対するNDP近隣広告というものが通信として発生しているようです.それぞれ説明すると

  1. NDP近隣要請(Neighbor Solicitation): 13:25:41.820584 の行で、東京のネットワークインターフェース 2001:db8:0:1::1 はマルチキャストアドレス ff02::1:ff00:2 に対して「2001:db8:0:1::2のMACアドレスを教えてください」と要求しています。
  2. NDP近隣広告(Neighbor Advertisement): 13:25:41.821264 の行で、北海道のネットワークインターフェース 2001:db8:0:1::2 が東京のネットワークインターフェースに対して「2001:db8:0:1::2のMACアドレスはこのアドレスです」と返答しています。

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です