OSI参照モデル

層 プロトコル
アプリケーション層  
プレゼンテーション層  
セッション層  
トランスポート層 TCP, UDP, QUIC
ネットワーク層 IP, ICMP, IPSec, ARP
データリンク層 イーサネット(IEEE802.3), PPP, 無線LAN(IEEE802.11)
物理層  

TCPIPプロトコルスイート

層 プロトコル
アプリケーション層 HTTP, HTTPS, SMTP, POP, IMAP, SSH, SSL(TSL)
トランポート層 TCP, UDP, QUIC
インターネット層 IP, ICMP, IPSec, ARP
ネットワークインターフェース層 イーサネット(IEEE802.3), PPP, 無線LAN(IEEE802.11)

機器

マスタリングTCP/IP 入門編 p38

機器|役割 —|— ネットワークインターフェース(Network Interface)| コンピュータをネットワークに接続するための装着 リピーター(Repeater)|ネットワークを物理層で延長する装置 ブリッジ(Bridge/L2スイッチ)|ネットワークをデータリンク層で延長する装置 ルーター(Router/L3スイッチ)|ネットワーク層によってパケットを転送する装置 ゲートウェイ|プロトコルの変換をする装置

ネットワークインターフェイス

ネットワークと機器を接続する装置(物理的なものも仮想的なものもある)でネットワークインタフェースカードやネットワークアダプタとも呼ぶ。

ネットワークカード(Network Card)は、ネットワークへの物理的な接続を提供するためにコンピュータにインストールされるアダプタ回路基板である[1]。コンピュータネットワーク内でコンピュータ間の通信を行うために使用されるハードウェアの1つである。

一般的にはLANカード(ランカード)と呼ばれることが多いが、ネットワークアダプタ、ネットワークインタフェースカード(Network Interface Card)などとも呼ばれる。名称のとおり、LANカードについては、有線のLAN、特にイーサネットに対する物を指す場合が多い。ネットワークアダプタについても古くは同様であったが、イーサネット等以外の各種のネットワーク、例えば無線LANや3G、WiMAX等の普及により、コンピュータ(ホスト)から見た通信デバイス一般を指すようになった。NICと称する場合もあるが、これがネットワークインタフェースカード(Network Interface Card)という物理的媒体を指すのか、ネットワークインタフェースコントローラ(Network interface controller)という、非物理的な機能を指すのかは文脈から判断するほかない。

https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%AB%E3%83%BC%E3%83%89

ネットワーク・インターフェースは1台のホストに複数存在する場合がある。

$ ifconfig

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
        nd6 options=201<PERFORMNUD,DAD>
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=50b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV,CHANNEL_IO>
        ether a8:60:b6:2b:a1:81
        inet 192.168.11.46 netmask 0xffffff00 broadcast 192.168.11.255
        media: autoselect (1000baseT <full-duplex,flow-control,energy-efficient-ethernet>)
        status: active
en1: flags=8823<UP,BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 1500
        options=400<CHANNEL_IO>
        ether 98:9e:63:4b:1d:82
        media: autoselect (<unknown type>)
        status: inactive

上記はlo0はループバックアドレス127.0.0.1のネットワーク・インターフェース、en0はイーサネットのネットワーク・インターフェース(IPが振られているので実際に使用されている)、eh1はイーサネットのネットワーク・インターフェースだがIPが振られていないので未使用。

MACアドレス

ネットワークアダプタには、MAC(Media Access Control)という製造段階で決められ世界で一意の識別番号が採番されている。

データリンク層の機器

データリンク層でフレームを転送する機器の総称をブリッジと呼ぶ。 (ブリッジはOSIの第2層の機器なのでL2スイッチとも呼ぶ。)

データリンク層でフレームを転送する機器

– TPC/IP ネットワーク入門 p.100

ブリッジにはおもに以下の機器がある。

  • リピータハブ
  • スイッチングハブ
  • L2スイッチ

※ L2スイッチはMACアドレスでPCを識別する。IPアドレスは使用されない。
※ スイッチにはOSIの階層に対応して、L2スイッチ、L3スイッチなどがある。

ネットワーク層の機器

ネットワーク層でパケットを転送する機器にルーターやL3スイッチがある。

  • ルータ
  • L3スイッチ

L2スイッチとL3スイッチ

種類 内容
L2スイッチ 各ポートにつながっているホストのMACアドレスを記憶して送信相手のみに信号を流す。
L3スイッチ インターネット層まで扱うことができる。VLAN(Virtual LAN)を構築できる。

ホストとルーターとノード

名称 内容
ホスト ネットワーク上でIPが付与されて経路制御を行わない機器
ルーター ネットワーク上でIPが付与されて経路制御を行なう機器
ノード ホストとルーター合わせたもの

プロトコル

イーサネット

  • 物理層・データリンク層のプロトコル
  • フレーム単位

ARP

  • インターネット層のプロトコル
  • ARP(Address Resolution Protocol)
  • IPアドレスからMACアドレスを取得する

IP

  • インターネット層のプロトコル
  • パケット単位
  • IPヘッダのプロトコル番号フィールドにトランスポート層のプロトコル番号(IANAプロトコル番号 例:TCP 6、UDP 17など)が格納されている

ref.

ICMP

  • インターネット層のプロトコル
  • ICMP(Internet Control Message Protocol)はネットワーク層の通信確認やエラー制御に使用
  • パケット単位
  • ICMPはTCP/UDPとは独立に存在
  • ICMPタイプ
    • 0:エコー応答
    • 3:到達不能
    • 8:エコー要求
$ sudo tcpdump -tnl -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
ping -c 3 example.org
PING example.org (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=43 time=109 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=43 time=109 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=3 ttl=43 time=109 ms

--- example.org ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 109.357/109.363/109.376/0.008 ms
$ sudo tcpdump -tnl -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

IP 10.3.0.183 > 93.184.216.34: ICMP echo request, id 1, seq 1, length 64
IP 93.184.216.34 > 10.3.0.183: ICMP echo reply, id 1, seq 1, length 64
IP 10.3.0.183 > 93.184.216.34: ICMP echo request, id 1, seq 2, length 64
IP 93.184.216.34 > 10.3.0.183: ICMP echo reply, id 1, seq 2, length 64
IP 10.3.0.183 > 93.184.216.34: ICMP echo request, id 1, seq 3, length 64
IP 93.184.216.34 > 10.3.0.183: ICMP echo reply, id 1, seq 3, length 64

TCP

  • トランスポート層のプロトコル
  • TCP(Transmission Control Protocol)はトランスポート層のコネクション型プロトコル
    • 再送制御機能を持つ
    • アウトオブオーダー(送信順と到着順が異なる)制御機能を持つ
  • セグメント単位
  • スリーウェイハンドシェイクでコネクションを確立
  • フォーウェイハンドシェイクでコネクションを切断
  • IPヘッダのIANAプロトコル番号は6
  • TCPヘッダには上位層(アプリケーション層など)の送信先ポート番号と送信元ポート番号が格納されている

スリーウェイハンドシェイクによるコネクション確立を確認

tcpdumpとcurlを使用して、HTTPSにおけるTCPのスリーウェイハンドシェイクを確認する。

tcpdumpでHTTPS通信のTCPパケットをキャプチャ開始する。
ネットワークインターフェースはeth0と仮定する。

$ sudo tcpdump -tnl -i eth0 port 443 and host 93.184.216.34
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

curlでhttps://example.orgにリクエスト送信する。

$ curl --head https://example.org

HTTP/2 200
content-encoding: gzip
accept-ranges: bytes
age: 507109
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Fri, 15 Apr 2022 23:44:07 GMT
etag: "3147526947+gzip"
expires: Fri, 22 Apr 2022 23:44:07 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (sab/56F3)
x-cache: HIT
content-length: 648

--headオプションは、レスポンスヘッダのみを表示する。

スリーウェイハンドシェイクでTCPコネクションが確立されている。

$ sudo tcpdump -tnl -i eth0 port 443 and 93.184.216.34
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

IP 10.3.0.183.33560 > 93.184.216.34.443: Flags [S], seq 3730146218, win 62727, options [mss 8961,sackOK,TS val 3536179360 ecr 0,nop,wscale 6], length 0 // ---(1)
IP 93.184.216.34.443 > 10.3.0.183.33560: Flags [S.], seq 1871064812, ack 3730146219, win 65535, options [mss 1460,sackOK,TS val 889923695 ecr 3536179360,nop,wscale 9], length 0 // ---(2)
IP 10.3.0.183.33560 > 93.184.216.34.443: Flags [.], ack 1, win 981, options [nop,nop,TS val 3536179464 ecr 889923695], length 0 // ---(3)
IP 10.3.0.183.33560 > 93.184.216.34.443: Flags [P.], seq 1:518, ack 1, win 981, options [nop,nop,TS val 3536179472 ecr 889923695], length 517
IP 93.184.216.34.443 > 10.3.0.183.33560: Flags [.], ack 518, win 131, options [nop,nop,TS val 889923807 ecr 3536179472], length 0
  • (1) SYN
  • (2) SYN/ACK
  • (3) ACK

SYN:接続開始要求、ACK:確認応答

UDP

  • トランスポート層のプロトコル
  • UDP(User Datagram Protocol)はコネクションレス型プロトコル

UDPが使用される例としてDNS(53ポート)の問い合わせ確認する。

$ sudo tcpdump -tnl -i eth0 udp and port 53
$ dig @8.8.8.8 example.org

※ digはOSのスタブリゾルバ。

$ sudo tcpdump -tnl -i eth0 udp and port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

IP 10.3.0.183.51431 > 8.8.8.8.53: 25064+ [1au] A? example.org. (52)
IP 8.8.8.8.53 > 10.3.0.183.51431: 25064$ 1/0/1 A 93.184.216.34 (56)

QUIC

  • QUIC(Quick UDP Internet Connections)はGoogleが開発したトランスポート層のプロトコル

NAT

狭義のNAT

  • NAT(Network Address Translation)はローカルIPアドレスをグローバルIPアドレスに変換
    • グローバルIPアドレスを節約する
    • 副次的にセキュリティの効果もある
  • NATはルータ・L3スイッチの機能
  • NATの分類
    • Source NAT(IPマスカレード)
    • Destination NAT
  • 現在ではNATと呼ばれても、ポート番号と組み合わせるNAPTを指すことが多い

NAPT(Network Addoress Port Translation)

ネットワーク層のIPアドレスだけではなく、トランスポート層ポート番号も書き換えることでNATを実現する。

NAPTでは、インターネットに転送するパケットのIPアドレスとポート番号を必要に応じて書きかえるとともに、記憶しておきます。

NAPTでは、この書きかえる前と書きかえた後の対応表をセッションとよんで管理します。

– TCP/IPネットワーク入門 p148

Source NAT

以下実際はNAPT。

MASQUERADE(マスカレード)は、LinuxにおけるSource NATの実装につけられた名称です。一般にIPマスカレードと呼ばれます。

– TCP/IPネットワーク入門 p153

MASQUERADE:マスカレード:変装、仮装

iptablesを使った例。

$ sudo iptables -t nat \
  -A POSTROUTING \
  -s 192.0.2.0/24 \
  -o 203.0.113.254 \
  -j MASQUERADE

Desitination NAT

以下実際はNAPT。

送信先がルータのグローバルアドレスになっているパケットを、プライベートアドレスに書きかえます – TCP/IPネットワーク入門 p153

iptablesを使った例。

$ sudo iptables -t nat \
  -A PREROUTING \
  -p tcp \
  --dport 54321 \
  -d 203.0.113.254 \
  -j DNAT \
  --to-destination 192.0.2.1

この54321を許可することをポートを開けると呼ぶことがある。

ポート番号

  • 0 〜 1023(システムポート、ウェルノウンポート)
  • 1024 〜 49151(ユーザーポート、レジスターポート)
  • 49152 〜 65535(ダイナミックポート、プライベートポート)