基礎
ネットワークの基礎について整理しています。
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)という、非物理的な機能を指すのかは文脈から判断するほかない。
ネットワーク・インターフェースは 1 台のホストに複数存在する場合があります。
# Mac
ifconfig
# Ubutnu
ip a
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
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(ダイナミックポート、プライベートポート)