こんにちはますのです。
プライベートサブネットのインスタンスとVPC外に存在するAWSサービス(S3、SystemsManager、CloudWatchエージェント等々)と接続したい。ついでにyumも通るようにしたい。
yumを通すだけならVPCエンドポイントで実現できる!と思い先日設定してみました。
しかし、コストが思いのほか掛かる。
ざっと月額$50くらい。
VPC1つでこのお値段なので、複数になると予算が厳しい…。
NATゲートウェイはそれよりも高くなりそう。
OSの管理は必要になるものの、コストを取るなら答えは2つしかないですね。
- NATインスタンスを介して通信させる
- 諦めてパブリックサブネットに置く(最終手段)
今回はOS管理のことは度外視、コスト優先でNATインスタンスを介して通信してみましょう。
問題発生:AWSのNAT AMIは「サポート期間が終了」している
ここで第一の関門。OSのサポート問題です。
AWSのコミュニティAMIで用意されている「amzn-ami-vpc-nat」はAmazonLinuxをベースとして作成されている様子。つまり2020年12月31日をもって、サポート期間は終了している状態です。
重要
NAT AMI は、2020 年 12 月 31 日に標準サポートが終了した Amazon Linux の最新バージョン 2018.03 に基づいて構築されています。詳細については、ブログ記事「Amazon Linux AMI のサポート期間終了」をご参照ください。この機能は、重要なセキュリティ更新プログラムのみを受け取ります (定期的な更新はありません)。
既存の NAT AMI を使用する場合、AWS では、できるだけ早く NAT ゲートウェイに移行するか、Amazon Linux 2 で独自の NAT AMI を作成することを推奨しています。インスタンスを移行する方法については、「NAT インスタンスからの移行」をご参照ください。
更新されているNAT AMIはあるものの、中身はAmazonLinuxから更新されないようです。
AmazonLinux2でやりたい場合は自力で作ってねというお達し。世知辛い。
Amazon Linux2でNATインスタンスは自作できるか?
果たして出来るのか?と思いましたが、出来そうです。
公式ドキュメントを見つけることは出来ませんでしたが先人の皆様のお知恵を拝借。
事前確認:プライベートサブネットからyumが出来ないことを確認
【ざっくり構成】
Ⅰ. IGW<—->Ⅱ. パブリックインスタンス<—->Ⅲ. プライベートインスタンス
確認することは3つ
- Ⅱ. パブリック→Ⅲ. プライベートへSSH接続が出来ること
- Ⅲ. プライベート→Ⅱ. パブリックへping疎通が出来ること
- Ⅲ. プライベートインスタンス上でyumが通らないこと
Amazon Linux2でNATインスタンスを構築してみる
では事前確認が済んだので実際に設定してみる。
作業はパブリックサブネットに作ったインスタンスでやります。
NATインスタンスに「iptables-services」をインストールする
AmazonLinumx2でiptablesを利用するには「iptables-services」のインストールが必要となります。
$ sudo yum -y install iptables-services
iptablesの設定確認と初期化
インストール完了後に「-L」でリスト確認します。
恐らく設定は未設定状態だと思いますが、念のために「-F」で初期化します。
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
$ sudo iptables -F
IPフォワードを設定する
IPv4転送と呼ばれる機能を有効にするために「/proc/sys/net/ipv4/ip_forward」ファイルの内容を「1」にします。
sudoだとパーミッションエラーが出たのでルート昇格して作業しました。
# echo 1 > /proc/sys/net/ipv4/ip_forward
IP転送を有効にするために「/etc/sysctl.conf」に「net.ipv4.ip_forward=1」を追記します。
# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
///IP転送が有効になっているか確認する(1が返ってくればOK)
# /sbin/sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
IPマスカレード設定と設定の保存
設定値はこちらのサイトを参考に。
https://www.atmarkit.co.jp/ait/articles/0505/17/news131_2.html
- 「-t nat」:natテーブルを使用する
- 「-A POSTROUTING」:送信時にアドレスを変換する
- 「-o eth0」:出ていくインターフェイス指定(今回はifconfigでeth0と確認済)
- 「-j MASQUERADE」:IPマスカレードを行う
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
設定内容を確認します。
Chain OUTPUTに追記されている。
外に出ていく時の通信はIP変換するよ、全部の通信許可するよっていう内容。
# iptables -t nat -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
最後に設定を保存する。
これを行わないとマシンを再起動した際にもとに戻ってしまう。永続的にしたい場合は実施を忘れずに!
# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
iptablesサービスの起動/自動起動設定
$ sudo systemctl start iptables
$ sudo systemctl enable iptables
$ sudo systemctl status iptables
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
Active: active (exited) since Tue 2021-04-20 12:48:45 UTC; 8s ago
Main PID: 32615 (code=exited, status=0/SUCCESS)
EC2インスタンス:送信元/送信先チェックを停止する
- AWS管理コンソール>EC2>NATインスタンスを選択
- アクション>ネットワーキング>ソース/宛先チェックを変更をクリック
- 送信元/送信先チェック中:停止にチェックを入れる
これを忘れるとパケット転送が出来ないので忘れずに行います。
プライベートサブネット:ルートテーブルにNATインスタンスを設定
仕上げです。これが出来れば疎通出来るようになるといっても過言ではない。
- 管理コンソール>VPC>ルートテーブル>対象のプライベートインスタンスが所属しているルートテーブルを選択
- タブ:ルートを選択>ルートの編集をクリック
- 送信先:0.0.0.0/0、ターゲット:Instance→NATインスタンスを選択>ルートの保存
筆者はプライベートサブネットのCIDRはすべてのトラフィックを許可しています。
疎通が通るか確認してみる
すごい。ちゃんとyumが通るようになりました。
もう少し細かく制御したほうが良いところもありそうですが、ひとまずはアウトバウンドだけを全許可NAT変換している状態なので侵入される心配は無いのでおけと考える方針にて。
参考サイト
- NAT インスタンス
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_NAT_Instance.html - NATインスタンスをAmazonLinux2で構築する
https://www.cloudnotes.tech/entry/nat-instanse-amazonlinux2 - natテーブルを利用したLinuxルータの作成
https://www.atmarkit.co.jp/ait/articles/0505/17/news131_2.html - [初心者向け]iptablesコマンドでアクセス制限をかける/かけない方法
https://beyondjapan.com/blog/2018/06/restriction/ - 2.5. パケット転送をオンにする
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/load_balancer_administration/s1-lvs-forwarding-vsa