ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

AWS CLI:ネットワークACLの作成・表示・削除コマンド

<更新履歴>
2021/09/12
・ネットワークACL内のルール(イン・アウト)を適当に選定し過ぎていたため、もう少し実務に沿って選定し直しました。
・ネットワークACL内のルールでコマンドが間違っていたので修正。(From=**, To=** ←Toの前に無駄な空白があったので削除 )
2021/09/26
・ポートごとのルール追加でコピペに使えるチートシートを作成。


検証環境や前提について

  • 検証日: 2021/03/29
  • PC環境:

    • Windows10 Pro Ver1909
      • AWS CLI Ver2.1.3
        • profile default: 読み取り専用
        • profile aws_RW: 書き込み権限あり
      • PowerShell Ver7.0.3
  • 本コマンドはPowerShellで検証しています。

  • 作成や削除をする場合「--profile aws_RW」オプションを付与します。
  • 表示の場合は「profile default」のためprofileオプションを使用しません。
  • コマンド内のパラメータやIDは検証で作成したものをそのまま使用しています。自身の環境に書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。


目次


1. ネットワークACLの作成

1.1. 作成するネットワークACLの構成

1.1.1 ネットワークACL

|項目|CLIオプション|設定値|
|:-----|:-----|:-----|
|VPC ID|--vpc-id|vpc-XXXXXXXXXXXXXXXX
|タグ(Name)|--tag-specifications|Key: Name, Value: Test-Ncl1a
|タグ(System)|--tag-specifications|Key: System, Value: Test

1.1.2 ネットワークACLのルール

<font color="Blue">インバウンド(ingress)</font>

|ルール番号|タイプ|プロトコル|ポート範囲|送信元|許可/拒否
|:-----|:-----|:-----|
|100|telnet(23)|TCP(6)|23|10.1.0.0/16|Deny
|110|RDP(3389)|TCP(6)|3389|10.1.0.0/16|Allow
|120|SSH(22)|TCP(6)|22|10.1.0.0/16|Allow
|130|HTTP(80)|TCP(6)|80|10.1.0.0/16|Allow
|140|HTTP(443)|TCP(6)|443|10.1.0.0/16|Allow
|150|すべてのICMP-IPv4|ICMP(1)|すべて|0.0.0.0/0|Allow
|190|カスタムTCP|TCP(6)|32768-65535|0.0.0.0/0|Allow
|*|すべてのトラフィック|すべて|すべて|0.0.0.0/0|Deny

- ルール番号「*」は暗黙のDenyで、Defaultで作成されている。
- インバウンドリターン IPv4の「32768-65535|」トラフィックを許可します(一時ポート)。
    - [一時ポートは用途によって変わるためこちらを参照。](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-network-acls.html#nacl-ephemeral-ports) 

<font color="Blue">アウトバウンド(egress)</font>

|ルール番号|タイプ|プロトコル|ポート範囲|送信先|許可/拒否
|:-----|:-----|:-----|
|100|すべてのトラフィック|すべて|すべて|0.0.0.0/0|Allow
|*|すべてのトラフィック|すべて|すべて|0.0.0.0/0|Deny

- ルール番号「*」は暗黙のDenyで、Defaultで作成されている。
- アウトバウンド側は全許可としています。

1.1.3 パラメータの参考

+ ルール番号[--rule-number <value>]
    *  1 ~ 32766 を使用可能。
    * シーケンス番号、重複不可。
    * 連番で振ってしまうと、ルールの割り込みができなくなるため、10か100刻みで設定する。

+ タイプ
    * コマンドオプションは無く、プロトコルとポート範囲から判断してAWS GUIへ表示される。

+ プロトコル[--protocol <value>]
    * 下記の数字 or 英小文字を<value>に代入する。英大文字は不可。
        * -1 : all
        * 1 : icmp
        * 6 : tcp
        * 17 : udp
        * 58 : icmpv6 ※英小文字での指定が不可だった。

+ ポート範囲[--port-range <value>]
    - TCPかUDPを使用する場合に指定が必要。
    - From=23,To=23
    - From=1000,To=2000


1.2. ネットワークACLの作成コマンド

AWS CLI v2 リファレンスガイド: create-network-acl

aws ec2 create-network-acl `
    --profile aws_RW `
    --vpc-id vpc-XXXXXXXXXXXXXXXX `
    --tag-specifications "ResourceType=network-acl, `
        Tags=[{Key=Name,Value=Test-Ncl1a}, `
              {Key=System,Value=Test}]"


1.3. ネットワークACLにルールを追加するコマンド

AWS CLI v2 リファレンスガイド: create-network-acl-entry

ルールを追加するネットワークACLのIDを調べる。

aws ec2 describe-network-acls `
    --filters "Name=tag:Name,Values=Test-Ncl1a" `
    --query "NetworkAcls[].NetworkAclId" `
    --output text

> acl-010ff3497087b018c


ルール追加コマンドは、入力時やExcelの一覧からコマンドを作るときに途中改行が無い方が楽だったので横長のコマンドにします。

1.3.1 インバウンド(ingress) ルールの追加

aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --ingress --rule-number 100 --protocol tcp --port-range "From=23,To=23" --cidr-block 10.1.0.0/16 --rule-action Deny
aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --ingress --rule-number 110 --protocol tcp --port-range "From=3389,To=3389" --cidr-block 10.1.0.0/16 --rule-action Allow
aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --ingress --rule-number 120 --protocol tcp --port-range "From=22,To=22" --cidr-block 10.1.0.0/16 --rule-action Allow
aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --ingress --rule-number 130 --protocol tcp --port-range "From=80,To=80" --cidr-block 10.1.0.0/16 --rule-action Allow
aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --ingress --rule-number 140 --protocol tcp --port-range "From=443,To=443" --cidr-block 10.1.0.0/16 --rule-action Allow
aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --ingress --rule-number 150 --protocol icmp --icmp-type-code "Code=-1,Type=-1" --cidr-block 0.0.0.0/0 --rule-action Allow
aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --ingress --rule-number 190 --protocol tcp --port-range "From=32768,To=65535" --cidr-block 0.0.0.0/0 --rule-action allow

1.3.2 アウトバウンド(egress) ルールの追加

aws ec2 create-network-acl-entry --profile aws_RW --network-acl-id acl-010ff3497087b018c --egress --rule-number 100 --protocol all --cidr-block 0.0.0.0/0 --rule-action Allow


1.4. ネットワークACLとサブネットを関連付ける

AWS CLI v2 リファレンスガイド: replace-network-acl-association


・・・かなり面倒な手順なので、GUIでやった方が楽です(汗


  • a, 関連付けたいサブネットの「Subnet-ID」を調べる。
aws ec2 describe-subnets `
    --filters "Name=tag:Name,Values=Test-Sub1a" `
    --query "Subnets[].SubnetId" `
    --output text

> subnet-07e3fb23e9e5135eb
  • b, 「a」で調べたSubnet-IDを使って、サブネットと関連付けられているネットワークACLの「NetworkAclAssociation-ID」を調べる。
aws ec2 describe-network-acls `
    --filters "Name=association.subnet-id,Values=subnet-07e3fb23e9e5135eb" `
    --query  "NetworkAcls[].Associations[].NetworkAclAssociationId" `
    --output text

> aclassoc-5b5e8d28
  • c, サブネットと関連付けたいネットワークACLの「NetworkAcl-ID」を調べる。
aws ec2 describe-network-acls `
    --filters "Name=tag:Name,Values=Test-Ncl1a" `
    --query "NetworkAcls[].NetworkAclId" `
    --output text

> acl-010ff3497087b018c
  • d, 「b」のNetworkAclAssociation-ID、「c」のNetworkAcl-IDを使って、サブネットとネットワークACLを関連付ける。
aws ec2 replace-network-acl-association `
    --profile aws_RW `
    --association-id aclassoc-5b5e8d28 `
    --network-acl-id acl-010ff3497087b018c


1.5. ネットワークACL表示コマンド

AWS CLI v2 リファレンスガイド: describe-network-acls

# すべてのネットワークACLを表示する
aws ec2 describe-network-acls

# テキストで表示するとルールが見やすい
aws ec2 describe-network-acls --output text

# 特定ネットワークACL ID のネットワークACLのみを表示する
aws ec2 describe-network-acls --network-acl-ids acl-010ff3497087b018c

# Nameタグ==Test-Ncl1a のネットワークACLのみを表示する
aws ec2 describe-network-acls --filters "Name=tag:Name,Values=Test-Ncl1a"

# 特定VPCのネットワークACLのみを表示する
aws ec2 describe-network-acls --filters "Name=vpc-id,Values=vpc-XXXXXXXXXXXXXXXX"


1.6. ネットワークACL削除コマンド

AWS CLI v2 リファレンスガイド: delete-network-acl

削除するネットワークACLのIDを調べる。

aws ec2 describe-network-acls `
    --filters "Name=tag:Name,Values=Test-Ncl1a" `
    --query "NetworkAcls[].NetworkAclId" `
    --output text

> acl-010ff3497087b018c

ネットワークACLを削除するコマンド。
※削除前にネットワークACLを未使用状態にする必要があります(サブネットとの関連付け解除)。

aws ec2 delete-network-acl `
    --profile aws_RW `
    --network-acl-id acl-010ff3497087b018c


1.7. ネットワークACLのルールを削除するコマンド

AWS CLI v2 リファレンスガイド: delete-network-acl-entry

aws ec2 delete-network-acl-entry `
    --profile aws_RW `
    --network-acl-id acl-010ff3497087b018c `
    --ingress `
    --rule-number <削除対象ルールの番号 例) 100 >
  • アウトバウンド(egress)
aws ec2 delete-network-acl-entry `
    --profile aws_RW `
    --network-acl-id acl-010ff3497087b018c `
    --egress `
    --rule-number <削除対象ルールの番号 例) 666>


1.8 チートシート

1.8.1 ルールの追加

# コピペ利用時、以下の置換ポイントを実環境の情報に修正してください。
## 「--profile ★」、profileを使ってなければ丸っと削除
## 「--network-acl-id acl-XXXXXXXXXXXX」
## 「--rule-number ★」、★を「1 ~ 32766」の整数にする。10か100刻みにすると良い。
## 「--cidr-block 10.0.0.0/16」
## 「--rule-action Allow」、許可なら「Allow」、拒否なら「Deny」。
## 「--ingress」、インバウンドなら「--ingress」、アウトバウンドなら「--egress」

# SSH(22)
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=22,To=22" --cidr-block 10.0.0.0/16 --rule-action Allow

# Telnet(23)
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=23,To=23" --cidr-block 10.0.0.0/16 --rule-action Allow

# DNS TCP(53)
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=53,To=53" --cidr-block 10.0.0.0/16 --rule-action Allow

# DNS UDP(53)
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol udp --port-range "From=53,To=53" --cidr-block 10.0.0.0/16 --rule-action Allow

# HTTP(80)
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=80,To=80" --cidr-block 10.0.0.0/16 --rule-action Allow

# HTTP(443)
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=443,To=443" --cidr-block 10.0.0.0/16 --rule-action Allow

# RDP(3389)
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=3389,To=3389" --cidr-block 10.0.0.0/16 --rule-action Allow

# TCP(32768-65535) ※ポート範囲変更は「"From=32768,To=65535"」部分を書き換え
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=32768,To=65535" --cidr-block 10.0.0.0/16 --rule-action allow

# すべてのTCP
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol tcp --port-range "From=0,To=65535" --cidr-block 10.0.0.0/16 --rule-action Allow

# すべてのUDP
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol udp --port-range "From=0,To=65535" --cidr-block 10.0.0.0/16 --rule-action Allow

# すべてのトラフィック
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol all --cidr-block 10.0.0.0/16 --rule-action Allow

# ICMP IPv4
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol icmp --icmp-type-code "Code=-1,Type=-1" --cidr-block 10.0.0.0/16 --rule-action Allow

# ICMP IPv6
aws ec2 create-network-acl-entry --profile--network-acl-id acl-XXXXXXXXXXXX --ingress --rule-number--protocol 58 --icmp-type-code "Code=-1,Type=-1" --ipv6-cidr-block ::/0 --rule-action Allow