【小ネタ】VPCセキュリティグループに「プロトコル=ここ」のルールを設定する方法

マネジメントコンソールでセキュリティグループを設定する時にほっこりする内容を見つけたので共有します。カスタムICMPルールについて理解できるようになります

コンバンハ、千葉(幸)です。

小ネタというよりは、ネタです。

マネジメントコンソールをいじっていて見つけてしまったので、どうしても書きたくなって書きました。

目次

まずは見てみる

以下をご覧ください。

「ここ」ですね。どこかほっこりしますね。

ここ とは何

英語表示に切り替えてみると、Here I Amの訳であることが分かります。

カスタムICMPルールの設定をする時に登場します。

ということで、この記事の本旨はカスタムICMPルールの設定についてのあれこれです。

ICMPのおさらい

そもそもICMPとは何かをおさらいしておきましょう。以下のサイトを参考にさせていただきました。

https://www.infraexpert.com/study/tcpip4.html

  • TCP/IPにおけるインターネット層で使用されるプロトコル
    • 分類上はIPやIPsecと同じ層
    • 実質的にはIPの上位プロトコルとして動作する
    • IPパケットによって運ばれるデータ部分にICMPメッセージが位置する
  • ICMPを利用したプログラムとしてはpingやtracerouteが有名
  • ICMPメッセージは以下により構成される
    • タイプ
    • コード
    • チェックサム
    • データ
  • ICMPタイプにより、ICMPメッセージは以下のいずれかに大別される
    • 問い合わせ(Query)
    • エラー通知(Error)
  • ICMPタイプによって、ICMPコードが存在しなかったり、複数存在したりする

ここではICMPタイプICMPコードが重要な概念です。

ICMPの情報をきちんと調べたいときは

以下にIANAが公開しているサイトがあり、RFPが確認できるようになっています。

Internet Control Message Protocol (ICMP) Parameters

我らがHere I AMを探してみると、正確にはI-Am-Hereだったようです。ICMPタイプの番号は34であることが分かります。Deprecated(非推奨、廃止予定)であることも分かってしまいました。

せっかくなのでRFC6918で確認してみます。

https://tools.ietf.org/html/rfc6918#page-4

2.10. IPv6 I-Am-Here (Type 34)

This message type was originally specified in [SIMPSON-DISCOV] for the purpose of identification of adjacent IPv6 nodes. It was never widely deployed or implemented.

最後の一文が悲しいですね。

カスタムICMPルール(IPv4)の設定

ICMPについて確認できたところで、改めてマネジメントコンソール上でのカスタムICMPルールの設定の仕方を確認しましょう。

マネジメントコンソール上の表示ではそれぞれ「プロトコル(Protocol)」「ポート範囲(Port Range)」となっていますが、実際は「ICMPタイプ」「ICMPコード」を選択する枠です。「Provides an additional section for ICMP」という注釈が確認できます。

ICMPコードが存在するICMPタイプを選択した場合のみ、ICMPコードをプルダウンから選択できるようになっています。(存在しない場合は、自動的に「該当なし(N/A)」となる)

例えば上記の例はICMPタイプ5の「Redirect」を選択し、ICMPコード0〜3のいずれか(もしくはALL)を選択している画面です。ちなみにICMPタイプ5の内訳は以下のようになっています。

マネジメントコンソール上でICMPタイプやICMPのコードの番号を確認することはできないので、予めお目当ての文言をおさえておく必要があります。RFCに記載されている文言と微妙に表現が異なるので、そこも適宜読み替えが必要です。

AWSドキュメントで以下のような表現を見たときに、「タイプとかコードとかいれる場所あったっけ?」と理解が追いつかなかったのですが、これでようやく合点が行きました。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-path-mtu

ICMPコード など とは

上述の画像で、「ポート範囲(Port Range)」に「ICMPコード など」というコメントを入れていました。「など」ということは他に何か設定できるのか?という気になりますが、特に何も設定できません。強いて言えば、無意味な数値を設定できます。

いろいろいじっていたらプルダウンからの選択ではなく数値を入力できるようになったのですが、それが無意味なものだと気づくまでに時間がかかりました。

CLIで設定するときは

ちなみにCLIで設定する時は、なんとICMPタイプとICMPコードをそれぞれfromポートとtoポートに指定します。

https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html

[EC2-VPC] To add a rule for ICMP traffic

This example uses the ip-permissions parameter to add an inbound rule that allows the ICMP message Destination Unreachable: Fragmentation Needed and Don't Fragment was Set (Type 3, Code 4) from anywhere.

上記の要件でセキュリティグループのルールを設定したい時のコマンド例が以下です。

aws ec2 authorize-security-group-ingress --group-id sg-123abc12 --ip-permissions IpProtocol=icmp,FromPort=3,ToPort=4,IpRanges='[{CidrIp=0.0.0.0/0}]'

ちょっとテクニカルですね。ICMPタイプやICMPコードを「ALL」や「N/A」で設定したい場合は、-1を指定します。テクニカルですね。

カスタムICMPルール(IPv6)の設定

せっかくなのでIPv6の方の設定も見ていきます。

タイプで「カスタム ICMP ルール - IPv6」を選択した時点で、自動的に「プロトコル(Protocol)」「ポート範囲(Port Range)」が入力され、変更ができなくなっています。

すべての ICMP ルール - IPv6」と何が違うのかと思って試してみたところ、重複エラーが出たので、実質的に同じようです。

The same permission must not appear multiple times

CLIリファレンスを見ても、タイプやコードを指定することは出来なさそうです。

aws ec2 authorize-security-group-ingress --group-id sg-1234567890abcdef0 --ip-permissions IpProtocol=icmpv6,Ipv6Ranges='[{CidrIpv6=::/0}]'

AWSドキュメントではICMPタイプを指定して穴を開けろと書いてあるように見えなくもないですが、深く考えないことにします。

ICMPv6に関する情報は、以下から確認できます。

Internet Control Message Protocol version 6 (ICMPv6) Parameters

終わりに

正直これまで関わってきた案件で、カスタムICMPルールを使用したことはありませんでした。開けるとしてもすべてのICMPルールとするか、pingが通るように開ける、程度です。設定上はいろいろ細かく指定できることが分かりました。

ただでさえDeprecatedなタイプを通常の要件において設定することはないと思うので、「ここ」を発見できた時は嬉しくなりました。意味もなく検証環境のセキュリティグループに軒並み追加しました。

マネジメントコンソール上の表記はしばしば変更がかかるので、いつまで「ここ」が見られるかは分かりません。興味がある方はすぐに設定しましょう。(自己責任でお願いします!)

こちらからは以上です。