AWS: NAT Instance3

前回まででAWSのネットワーク設定を行ったのでEC2インスタンスの作成と設定を行う。

EC2インスタンスはAmazon Linux 2022を使用し、NAT InstanceのForward設定はnftablesで行う。

2022年の10月時点ではまだ正式リリースされていないのでAMIからAmazon Linux 2022のインスタンスを起動させる。今回はお値段重視でarm系のイメージでNAT Instanceを作成する。

Amazon Linux 2022を選択
サブネットはpublicなものを選び、パブリックIPの自動割り当てを有効にする。セキュリティグループはNAT Instance用に作成しておいたものを選択する
NAT Instanceなら8GBもストレージがあれば一旦は十分

続いてPrivateなサブネットに配置するインスタンスを作成する。

privateなサブネットを選択する。パブリックIPは割り当てない。セキュリティグループはPrivateなインスタンス用に作成したものを適用する
今回は何もしないので8GBで十分

続いてNAT InstanceのNICで転送ができるようにソース/宛先チェックを無効化する。

ソース/宛先チェックの無効化を行う
停止を選択して保存する

NAT Instanceにログインして転送(nat overload/nat マスカレード)の設定を行う。

まずはEC2インスタンスコネクトから接続を行う。

内部設定を行うために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を経由するようにルートテーブルを作成する。

ターゲット(NextHOP)はNAT-Instance(EC2Instance)を選択する

Publicなセグメントのルートテーブルはインターネットゲートウェイに通信が流れるようにしておく。

Publicなセグメントのルートテーブルはigwを使用する

PrivateなセグメントのルートテーブルはNAT Instanceに通信が流れるようにしておく。サブネットに紐づけるルートテーブルは先ほど作成したものに変更する必要があるので注意。

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鍵は削除しておいたほうが良いだろう。