NLBリスナールールの新機能「IpAddressType」でIPv4/IPv6を振り分けてみた
はじめに
NLBリスナールールの SourceIpConfig に IpAddressType フィールドが追加されました。AWS CLI v2.35.24のChangeLogで案内されています。
2.35.24
- api-change:
elbv2: This release adds support for theIpAddressTypefield onSourceIpConfig, enabling Network Load Balancer listener rules to match traffic based on whether the source IP is IPv4 or IPv6.
ALBの source-ip 条件はCIDRで送信元を指定します。一方デュアルスタックNLBでは IpAddressType でIPv4かIPv6かを条件に指定できます。本機能はデュアルスタックNLB専用です。
検証構成
Internet(デュアルスタッククライアント)
│
▼
NLB (dualstack, TCP:80)
├─ ルール: source-ip / IpAddressType=ipv6 → TG-IPv6 (ALB:8080)
└─ デフォルトアクション → TG-Default (ALB:8081)
│ │
└──────────────────┬─────────────────────┘
▼
ALB (internal, dualstack)
├─ リスナー :8080 → fixed-response "IPv6 rule matched!"
└─ リスナー :8081 → fixed-response "Default rule - IPv4"
NLBのリスナールールは forward アクションのみ対応しているため、バックエンドのALBでポート別に fixed-response を返す構成としました。
リソース作成とルール設定
デュアルスタックのinternet-facing NLB(TCP:80リスナー)と、バックエンドのinternal ALBを作成しました。ALBはポート8080/8081で fixed-response を返します。それぞれをターゲットグループに登録し、NLBリスナーのデフォルトアクションにTG-Defaultを設定しました。
IPv6送信元を条件とするルールを作成します。
aws elbv2 create-rule \
--listener-arn <NLB_LISTENER_ARN> \
--priority 10 \
--conditions '[{"Field":"source-ip","SourceIpConfig":{"IpAddressType":"ipv6"}}]' \
--actions '[{"Type":"forward","TargetGroupArn":"<TG_IPV6_ARN>"}]'
動作確認
ルール作成後、デュアルスタック環境のクライアントからIPv6とIPv4でそれぞれアクセスしました。
$ curl -6 http://<NLB_DNS_NAME>
IPv6 rule matched!
$ curl -4 http://<NLB_DNS_NAME>
Default rule - IPv4
IPv6アクセスは IpAddressType=ipv6 のルールに一致してTG-IPv6へ転送されました。それぞれ3回実行し、すべて同じ応答を確認しています。
| アクセス | 代表応答 | 3回の結果 |
|---|---|---|
IPv6(curl -6) |
IPv6 rule matched! |
3/3で IPv6 rule matched! |
IPv4(curl -4) |
Default rule - IPv4 |
3/3で Default rule - IPv4 |
| ルール削除後のIPv6 | Default rule - IPv4 |
90秒後は3/3で Default rule - IPv4(今回の検証では伝播に約60〜90秒) |
ALB での IpAddressType 対応確認
ALBのリスナーに対して同じ IpAddressType=ipv6 条件でルールを作成できるか試してみました。
An error occurred (ValidationError) when calling the CreateRule operation:
IpAddressType is not supported for application load balancer
ValidationError により拒否されました。IpAddressType によるIPバージョン判定はNLB専用の機能です。
まとめ
IpAddressType=ipv6 の追加ルール1つとデフォルトアクションを組み合わせれば、CIDRを列挙せずにIPv4/IPv6の振り分けを実現できます。これまでIPバージョンごとに異なる転送先を使うために、IPv4用とIPv6用でNLBや接続先を分けていた構成では、1つのデュアルスタックNLBへ集約できる可能性があります。







