「TCPは6」「HTTPSは443」。どちらも通信を表す数字ですが、同じ種類の番号ではありません。ここを混ぜると、ACLやWiresharkの条件を書いたときに迷います。
IPプロトコル番号は、IPヘッダーで次に続くプロトコルを示す番号です。ポート番号は、TCPやUDPの中で通信の送り先を区別する番号。どのヘッダーに入っているかから見ていくと、ICMPやESPにポートがない理由もつながります。
IPの中に、次のプロトコルを示す欄がある
IPv4ヘッダーのProtocol欄には、TCPなら6、UDPなら17、ICMPなら1という値が入ります。受信側は、その値を見てIPパケットの中身をどのプロトコルとして扱うか判断します。
IPv6ではNext Headerという欄です。拡張ヘッダーがある場合は、それぞれが次のヘッダーを指すため、最初の欄が必ずTCPやUDPを示すとは限りません。
| バージョン | フィールド名 | サイズ | 役割 |
|---|---|---|---|
| IPv4 | Protocol | 8ビット | ペイロードに入っている上位プロトコルを示す |
| IPv6 | Next Header | 8ビット | 次に続くヘッダー(拡張ヘッダーまたは上位プロトコル)を示す |
| 番号 | キーワード | プロトコル | どこで出てくるか |
|---|---|---|---|
| 1 | ICMP | Internet Control Message | ping、traceroute、Path MTU Discovery |
| 2 | IGMP | Internet Group Management | マルチキャストの参加・離脱 |
| 4 | IPv4 | IPv4 encapsulation | IPv4 over IPv4トンネル |
| 6 | TCP | Transmission Control | HTTP/HTTPS、SSH、SMTPなど大半の業務通信 |
| 17 | UDP | User Datagram | DNS、DHCP、SNMP、Syslog、NTP |
| 41 | IPv6 | IPv6 encapsulation | 6in4トンネル |
| 47 | GRE | Generic Routing Encapsulation | 拠点間トンネル、DMVPN |
| 50 | ESP | Encap Security Payload | IPsec VPNの暗号化データ |
| 51 | AH | Authentication Header | IPsecの認証のみの構成 |
| 58 | IPv6-ICMP | ICMP for IPv6 | IPv6のping、近隣探索(NDP) |
| 88 | EIGRP | EIGRP | Ciscoのルーティングプロトコル |
| 89 | OSPFIGP | OSPFIGP | OSPFの隣接確立とLSA交換 |
| 103 | PIM | Protocol Independent Multicast | マルチキャストの経路制御 |
| 112 | VRRP | Virtual Router Redundancy Protocol | デフォルトゲートウェイの冗長化 |
| 115 | L2TP | Layer Two Tunneling Protocol | リモートアクセスVPN |
| 132 | SCTP | Stream Control Transmission Protocol | 通信事業者系のシグナリング |
番号はIANAの登録表で確認できます。表をすべて暗記するより、実際に扱う通信について、プロトコル名と番号を対応させると使いやすくなります。
TCPの6と、HTTPSの443は別の欄
TCPでHTTPSサーバーへ接続する例では、IPのProtocolが6、TCPの宛先ポートが443です。「TCPの通信か」を選び、その中で「宛先ポートが443か」を選ぶ二段階になります。
IPプロトコル番号は8ビット、TCP/UDPのポート番号は16ビットです。桁数だけでなく、入っている場所と用途が違います。
| IPプロトコル番号 | ポート番号 | |
|---|---|---|
| どのヘッダーにあるか | IPヘッダー | TCPヘッダー/UDPヘッダー |
| ビット数 | 8ビット(0〜255) | 16ビット(0〜65535) |
| 何を識別するか | 上位プロトコルの種類 | そのホスト上のアプリケーション |
| 持たないものがあるか | すべてのIPパケットが持つ | ICMPやOSPFなどは持たない |
| 例 | TCP=6、UDP=17、GRE=47 | HTTPS=TCP/443またはUDP/443、SSH=TCP/22、DNS=UDP/TCP 53 |
443というポートだけを書いても、TCPかUDPかは決まりません。QUICなどを使う通信ではUDP443もあります。要件にはプロトコルとポートを両方書きます。
クライアントの送信元ポートは、通常、接続ごとに選ばれる一時ポートです。宛先のサービス用ポートと同じものだと思わないようにします。
ICMPやESPは、TCP/UDPのポートを持たない
ICMP、GRE、直接送るESPなどにはTCP/UDPヘッダーがないため、そのポート番号もありません。ICMPのpingなら、IPプロトコルとICMPのタイプなどで条件を考えます。
IPsecは外側から見える形式に注意します。ESPをそのまま運ぶならIPv4のProtocolは50です。NAT-TでUDPへ包む構成なら、外側はUDPで、通常4500のポートを使います。
| 通信の例 | 外側のIP Protocol | ポート | FW/ACLで見る対象 |
|---|---|---|---|
| ESPを直接転送 | 50 | なし | ESPと送受信IP |
| ESPをNAT-Tでカプセル化 | 17(UDP) | 通常UDP/4500 | 外側のUDPと送受信IP |
| GRE | 47 | なし | GREと送受信IP |
外側の装置からは、包まれた内側の通信をそのまま見られるとは限りません。どの位置のACLやFWで判断するかを決め、その場所で見えるヘッダーを確認します。
「IPsecだから必ずProtocol50だけ」と固定せず、IKEに必要な通信、データの形式、対象装置の処理を合わせて確認してください。
ACLでは、プロトコルを選んでから条件を足す
Ciscoの拡張ACLでは、permit tcpなどのプロトコル指定のあとに、送信元・宛先やポートを書きます。ESPならespのキーワードや、対応する番号50で指定できます。
要件表に「TCP/443」「ESP/50」のように書いてあれば、数字がポートかIPプロトコル番号かを区別しやすくなります。曖昧な「443許可」を、そのまま設定へ写さないようにします。
! キーワードで指定
Router(config)# ip access-list extended VPN-IN
Router(config-ext-nacl)# permit esp host 172.28.53.10 host 172.28.42.20
Router(config-ext-nacl)# permit udp host 172.28.53.10 host 172.28.42.20 eq 500
Router(config-ext-nacl)# permit gre host 172.28.53.10 host 172.28.42.20
! 番号で指定(キーワードのないプロトコル)
Router(config-ext-nacl)# permit 112 any 224.0.0.18
Router(config-ext-nacl)# permit tcp any host 172.28.42.30 eq 443
- ポート番号だけで書く:「443」とだけ記すとTCP/443とUDP/443を区別できません。QUICを使う場合などは、実際のプロトコルと方向を別行で確認します。
- IPsecを一律にESP/50とする:直接ESPかNAT-TのUDP/4500かで、外側から見えるヘッダーが異なります。パケットキャプチャと対象装置の設定で方式を確かめます。
- 往路だけ許可する:FWがステートフルか、戻り通信が同じ経路を通るかを確認します。非対称経路では、片側の許可設定だけで成立しないことがあります。
設定例は説明用のIPです。適用するインターフェースと方向、NATやトンネルの前後も合わせて確認します。同じ通信でも、観測する場所によって外側の条件が変わるためです。
送信元IP、宛先IP、プロトコル、必要なら送信元・宛先ポートを分けた表を作ると、ACLと試験の条件をそろえられます。
Wiresharkも、調べたいヘッダーで絞る
IPv4のGREならip.proto == 47、ESPならip.proto == 50で絞れます。TCPの443ならtcp.port == 443ですが、これは送信元・宛先のどちらかのポートが443という条件です。
サーバーへ向かう要求だけならtcp.dstport、返信だけならtcp.srcportなど、向きに合わせた欄を使います。ポートのフィルターだけでは、GREやESPは拾えません。
| やりたいこと | 表示フィルター |
|---|---|
| GREだけ見る | ip.proto == 47 |
| ESPだけ見る | ip.proto == 50 |
| TCP以外を見る | ip.proto != 6 |
| IPv6の直後に続くヘッダーで絞る | ipv6.nxt == 58 |
| HTTPSを見る | tcp.port == 443 |
IPv6のipv6.nxtは直後のヘッダーを見ます。拡張ヘッダーがあるときは、目的のプロトコルまで展開して確認します。
まず対象パケットのIP欄と内側の欄を一つずつ開くと、番号の位置を確認できます。そのあとフィルターにすれば、見えない理由を判断しやすくなります。
番号を覚える前に、入っている場所を説明する
IPプロトコル番号は次のプロトコル、TCP/UDPのポート番号はその中の通信を識別します。ICMPなど、TCP/UDPを使わない通信に同じポートの考え方を当てはめません。
通信一本について、外側のIP、その内側のプロトコル、必要なポートを並べてみてください。ヘッダーの重なりと、ACLがどの欄を見ているかがつながります。
数字だけのメモから、プロトコル名・番号・方向を持つ要件表へ直すと、設定レビューでも取り違えを減らせます。
動画・筆者の投稿で補足する
文章と図で流れをつかんだら、関連する動画も参考にしてください。画面の表示や操作は、機種・ソフトウェアの版によって異なる場合があります。
