AWS: NAT Instance3
前回まででAWSのネットワーク設定を行ったのでEC2インスタンスの作成と設定を行う。
EC2インスタンスはAmazon Linux 2022を使用し、NAT InstanceのForward設定はnftablesで行う。
2022年の10月時点ではまだ正式リリースされていないのでAMIからAmazon Linux 2022のインスタンスを起動させる。今回はお値段重視でarm系のイメージでNAT Instanceを作成する。
続いてPrivateなサブネットに配置するインスタンスを作成する。
続いてNAT InstanceのNICで転送ができるようにソース/宛先チェックを無効化する。
NAT Instanceにログインして転送(nat overload/nat マスカレード)の設定を行う。
まずはEC2インスタンスコネクトから接続を行う。
ログインしてまずはKernelの転送設定を有効化する。
Updates Information Summary: available
1 Security notice(s)
1 Important Security notice(s)
__| __|_ )
_| ( / Amazon Linux 2022 AMI
___|\___|___| Preview
https://aws.amazon.com/linux/amazon-linux-2022
Last login: Sun Oct 16 06:04:01 2022 from 3.112.23.3
[ec2-user@ip-172-31-0-77 ~]$ sudo su -
[root@ip-172-31-0-77 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@ip-172-31-0-77 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
今回は転送を行うのにnftablesを使用する。ここはiptablesでもfirewalldでも慣れたものを使えばよい。
[root@ip-172-31-0-77 ~]# systemctl status iptables
Unit iptables.service could not be found.
[root@ip-172-31-0-77 ~]# systemctl status firewalld
Unit firewalld.service could not be found.
[root@ip-172-31-0-77 ~]# systemctl status nftables
Unit nftables.service could not be found.
[root@ip-172-31-0-77 ~]# dnf install nftables
Last metadata expiration check: 0:26:29 ago on Sun 16 Oct 2022 05:41:21 AM UTC.
Dependencies resolved.
=================================================================================================================================================================================================================
Package Architecture Version Repository Size
=================================================================================================================================================================================================================
Installing:
nftables aarch64 1:0.9.8-3.amzn2022.0.2 amazonlinux 350 k
Installing dependencies:
iptables-libs aarch64 1.8.7-8.amzn2022.0.2 amazonlinux 420 k
libnetfilter_conntrack aarch64 1.0.8-2.amzn2022.0.1 amazonlinux 58 k
libnfnetlink aarch64 1.0.1-19.amzn2022.0.1 amazonlinux 30 k
libnftnl aarch64 1.1.9-2.amzn2022.0.1 amazonlinux 82 k
Transaction Summary
=================================================================================================================================================================================================================
Install 5 Packages
Total download size: 940 k
Installed size: 8.7 M
Is this ok [y/N]: y
Downloading Packages:
(1/5): libnetfilter_conntrack-1.0.8-2.amzn2022.0.1.aarch64.rpm 379 kB/s | 58 kB 00:00
(2/5): libnftnl-1.1.9-2.amzn2022.0.1.aarch64.rpm 492 kB/s | 82 kB 00:00
(3/5): iptables-libs-1.8.7-8.amzn2022.0.2.aarch64.rpm 2.3 MB/s | 420 kB 00:00
(4/5): nftables-0.9.8-3.amzn2022.0.2.aarch64.rpm 4.0 MB/s | 350 kB 00:00
(5/5): libnfnetlink-1.0.1-19.amzn2022.0.1.aarch64.rpm 403 kB/s | 30 kB 00:00
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 2.9 MB/s | 940 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : libnfnetlink-1.0.1-19.amzn2022.0.1.aarch64 1/5
Installing : libnetfilter_conntrack-1.0.8-2.amzn2022.0.1.aarch64 2/5
Installing : iptables-libs-1.8.7-8.amzn2022.0.2.aarch64 3/5
Installing : libnftnl-1.1.9-2.amzn2022.0.1.aarch64 4/5
Installing : nftables-1:0.9.8-3.amzn2022.0.2.aarch64 5/5
Running scriptlet: nftables-1:0.9.8-3.amzn2022.0.2.aarch64 5/5
Verifying : libnetfilter_conntrack-1.0.8-2.amzn2022.0.1.aarch64 1/5
Verifying : iptables-libs-1.8.7-8.amzn2022.0.2.aarch64 2/5
Verifying : libnftnl-1.1.9-2.amzn2022.0.1.aarch64 3/5
Verifying : nftables-1:0.9.8-3.amzn2022.0.2.aarch64 4/5
Verifying : libnfnetlink-1.0.1-19.amzn2022.0.1.aarch64 5/5
Installed:
iptables-libs-1.8.7-8.amzn2022.0.2.aarch64 libnetfilter_conntrack-1.0.8-2.amzn2022.0.1.aarch64 libnfnetlink-1.0.1-19.amzn2022.0.1.aarch64 libnftnl-1.1.9-2.amzn2022.0.1.aarch64
nftables-1:0.9.8-3.amzn2022.0.2.aarch64
Complete!
[root@ip-172-31-0-77 ~]#
Amazon Linuxというか最近のRedhat系は/etc/sysconfig/nftables.confを読み込む設定のようなので編集する。
[root@ip-172-31-0-77 ~]# cat /etc/sysconfig/nftables.conf
#
# This file will contain your nftables rules and
# is read by the systemd service when restarting
#
# These provide an iptables like set of filters
# (uncomment to include)
flush ruleset
include "/etc/nftables/ipv4-nat.nft"
転送設定を行うインターフェースの名前を確認しておく。ens5のようだ。
[root@ip-172-31-0-77 nftables]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 06:5c:70:6d:81:41 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-003d29ac90fbc5c01
altname device-number-0
inet 172.31.0.77/24 metric 517 brd 172.31.0.255 scope global dynamic ens5
valid_lft 3560sec preferred_lft 3560sec
inet6 fe80::45c:70ff:fe6d:8141/64 scope link
valid_lft forever preferred_lft forever
/etc/nftables/ipv4-nat.nftを編集し、マスカレードNATの設定をする。
[root@ip-172-31-0-77 nftables]# cat ipv4-nat.nft
table nat {
chain prerouting { type nat hook prerouting priority -100; }
chain input { type nat hook input priority 100; }
chain output { type nat hook output priority -100; }
chain postrouting {
type nat hook postrouting priority 100;
ip saddr 172.31.1.0/24 oifname "ens5" masquerade
}
}
nftablesを起動・有効化する。
[root@ip-172-31-0-77 nftables]# systemctl start nftables
[root@ip-172-31-0-77 nftables]# systemctl enable nftables
Created symlink /etc/systemd/system/multi-user.target.wants/nftables.service → /usr/lib/systemd/system/nftables.service.
[root@ip-172-31-0-77 nftables]# nft list ruleset
table ip nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
}
chain input {
type nat hook input priority 100; policy accept;
}
chain output {
type nat hook output priority -100; policy accept;
}
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
ip saddr 172.31.1.0/24 oifname "ens5" masquerade
}
}
[root@ip-172-31-0-77 nftables]#
AWSの設定に戻り、Privateなサブネットの通信がNAT Instanceを経由するようにルートテーブルを作成する。
Publicなセグメントのルートテーブルはインターネットゲートウェイに通信が流れるようにしておく。
PrivateなセグメントのルートテーブルはNAT Instanceに通信が流れるようにしておく。サブネットに紐づけるルートテーブルは先ほど作成したものに変更する必要があるので注意。
ここまでで設定は完了になるはず。Privateなセグメントに作成しておいたEC2インスタンスにログインを行う(NAT Instanceからsshする)。インターネットとの通信確認にcurlでnictのページを見てみた。
[root@ip-172-31-0-77 .ssh]# chmod 600 ./key
[root@ip-172-31-0-77 .ssh]# ssh -i ./key [email protected]
__| __|_ )
_| ( / Amazon Linux 2022 AMI
___|\___|___| Preview
https://aws.amazon.com/linux/amazon-linux-2022
[ec2-user@ip-172-31-1-143 ~]$ curl https://www.nict.go.jp/JST/JST5.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<title>JST Clock</title>
<meta http-equiv="Refresh" content="3600">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css">
~~略~~
dnfなんかもやってみる
[root@ip-172-31-1-143 ~]# dnf search httpd
Last metadata expiration check: 0:00:22 ago on Sun 16 Oct 2022 06:30:53 AM UTC.
========================================================================================== Name Exactly Matched: httpd ==========================================================================================
httpd.aarch64 : Apache HTTP Server
========================================================================================= Name & Summary Matched: httpd =========================================================================================
generic-logos-httpd.noarch : Fedora-related icons and pictures used by httpd
httpd-core.aarch64 : httpd minimal core
libmicrohttpd-devel.aarch64 : Development files for libmicrohttpd
libmicrohttpd-doc.noarch : Documentation for libmicrohttpd
============================================================================================== Name Matched: httpd ==============================================================================================
httpd-devel.aarch64 : Development interfaces for the Apache HTTP Server
httpd-filesystem.noarch : The basic directory layout for the Apache HTTP Server
httpd-manual.noarch : Documentation for the Apache HTTP Server
httpd-tools.aarch64 : Tools for use with the Apache HTTP Server
libmicrohttpd.aarch64 : Lightweight library for embedding a webserver in applications
python3-sphinxcontrib-httpdomain.noarch : Sphinx domain for documenting HTTP APIs
[root@ip-172-31-1-143 ~]#
無事インターネットから情報を取得できていることを確認。
設定自体は時間がかかるものではないが、設定個所は多い。NAT Instanceの作成はある程度の敷居があると思う。設定しておけばhttpsを使ってSSM AgentやCloudWatchAgentも接続ができるようになるのでNAT Instanceを踏み台にしてsshをする必要はなくなる。NAT InstanceからPrivateなInstanceに接続するためのssh鍵は削除しておいたほうが良いだろう。