AWS にて、Ubuntu のインスタンスを立てているが、apt update、apt upgrade や npm install が上手く動かないという現象が発生。
これらのコマンドを実行する時、内部的に HTTPS 通信(場合によっては HTTP?)が行われているようで、適切なアウトバウンド設定がされていないと通信エラーが発生するようです。
当初、IPv4 のポート443 のみを空けていたのですが、ログを見る限り IPv6 でのアクセスが失敗しているような形跡があったので、IPv6 用の穴も空けてみました。
取り急ぎ、以下のアウトバウンドルールを設定して対処してみました。
- HTTP(ポート80)- IPv4 のアウトバウンドを許可
- HTTPS(ポート443)- IPv4 のアウトバウンドを許可
- HTTP(ポート80)- IPv6 のアウトバウンドを許可
- HTTPS(ポート443)- IPv6 のアウトバウンドを許可
無事、apt update が実行できました。
とはいえ、上記の設定は十分過ぎる気がするので、必要最小限の設定はどの程度なのだろう。と思い、実験してみました。
こんな感じのインスタンスで実験しています。
- OS : Ubuntu Server 24.04 LTS
- Architecture : 64-bit (x86)
- Instance type : t2.nano
※このインスタンスは現在、破棄しています。
以下、apt update 実行時の内容です。
実験: apt update
1. すべてのアウトバウンドを許可しない
当然、通信エラー。
2. HTTP(ポート80)- IPv4 のアウトバウンドを許可
成功
3. HTTPS(ポート443)- IPv4 のアウトバウンドを許可
エラー
4. HTTP(ポート80)- IPv6 のアウトバウンドを許可
エラー
5. HTTPS(ポート443)- IPv6 のアウトバウンドを許可
エラー
結論1
apt update を実行する上では、HTTP(ポート80)の IPv4 を許可しておけば良さそう。
IPv4・IPv6 の優先順位を変える場合
以下の方法で、どちらを優先するかを指定する事ができるようです。
/etc/sysctl.conf
IPv6 の有効・無効をカーネルレベルで設定する。
有効にするには、以下の記述を追加する。
また、コンフィグの設定が無い場合、IPv6 は有効となる。
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
/etc/gai.conf
以下の設定を追加。(コメントアウトを解除)
precedence ::/0 40
右の「40」という数字は優先順位を表していて(数字が低い方が優先順位が高い)、IPv4 によるアクセスよりも数字が低くなるように設定する。
何も設定しない場合、IPv6 は有効となる。
IPv6 の有効確認
EC2 の「ネットワーキング」タブにて、「IPV6 アドレス」の項目から確認できる。
また、「ip -6 addr」コマンドでも確認できる。
(出力例)
ubuntu@ip-172-31-1-101:~$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enX0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 state UP qlen 1000
inet6 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::4d0:f7ff:fe76:9c4f/64 scope link
valid_lft forever preferred_lft forever
「scope global」がある場合、IPv6 は有効。
結論2
IPv4・IPv6 のどちらが優先されるかは、システムやネットワーク構成に依る部分も大きそうなので、状況に応じて、どちらの穴を空けるかは決める。
IPv6 補足
「getent ahosts」を使えば、対象のホストにて IPv6 が対応しているかを確認できる。
apt update にて使用するホスト「http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu」を対象にチェックする場合、以下のように入力。
getent ahosts ap-northeast-1.ec2.archive.ubuntu.com
有効の場合、IPv6 形式のアドレスが出てきます。
実験: npm (JavaScript)
プログラミング言語のパッケージマネージャーだと、どんな結果になるのだろうか。
と思い、実験してみました。
1. すべてのアウトバウンドを許可しない
当然、通信エラー。
ですが、明確なエラーメッセージが返って来るのではなく、ずっとウェイト状態となるみたいです。
6時間ほど放置しても、この状態のままでした。
2. HTTP(ポート80)- IPv4 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
3. HTTPS(ポート443)- IPv4 のアウトバウンドを許可
成功
4. HTTP(ポート80)- IPv6 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
5. HTTPS(ポート443)- IPv6 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
実験: composer (PHP)
ちなみに、composer は1度コマンドが成功するとキャッシュに残り、次回インストールはそこから参照するので、アウトバウンドを完全に遮断しても composer install が成功します。
なので、実行前には「composer clear-cach」にて、キャッシュをクリアする必要があります。
1. すべてのアウトバウンドを許可しない
当然エラー。
2. HTTP(ポート80)- IPv4 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
3. HTTPS(ポート443)- IPv4 のアウトバウンドを許可
成功
4. HTTP(ポート80)- IPv6 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
5. HTTPS(ポート443)- IPv6 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
実験: NuGet (C#)
こちらも1度コマンドが成功するとキャッシュに残り、アウトバウンドを完全に遮断しても dotnet add package が成功します。
実行前には「dotnet nuget locals all –clear」にて、キャッシュをクリアする必要があります。
1. すべてのアウトバウンドを許可しない
当然エラー。
2. HTTP(ポート80)- IPv4 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
3. HTTPS(ポート443)- IPv4 のアウトバウンドを許可
OK
4. HTTP(ポート80)- IPv6 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
5. HTTPS(ポート443)- IPv6 のアウトバウンドを許可
エラー。同一内容のため添付画像は割愛。
結論3
パッケージマネジャーを使う場合、HTTPS(ポート443)の IPv4 を許可しておけば良さそう。
また、パッケージマネージャーによっては、丁寧にエラーを返すものもあったり、通信待機状態になったまま何もレスポンスが無い状態になったりと、反応は色々あるので、通信エラーを疑う場合は、一旦アウトバウンドを全部シャットアウトする等で、固有の動きを見ておくと良いかもしれません。
コメント