2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AmazonLinux2でIPv4/IPv6対応のNATインスタンス作成する

Last updated at Posted at 2022-11-26

注意事項
IPv6初心者のため、記載内容に理解不足・誤りがある可能性があります。

目的

IPv6はIPv4と異なり、インターネットに直接ルーティング可能なアドレスがアサインされるようです。
とはいえ、特殊な環境要件においてIPv6でもNATしたいという場合の方法を考えました。

概要

  • 環境はAmazonLiunx2を利用。
  • AmazonLiunx2のIPフォワーディングを有効にし、パケットの中継ができるようにする。
  • IPv4ではiptables、IPv6ではip6tablesを利用して変換設定を行う。

環境概要

パブリックサブネット側にNAT用のEC2インスタンスを配置し、プライベートサブネットに配置されたEC2とインターネット間の通信を中継するケースを想定。
diagram.drawio.png

VPC/Subnet

  • テストの環境では各subnetはipv4・ipv6のデュアルスタックとした。(ipv6のみには出来ない部分がある?)
  • IPv4はプライベートアドレスのCIDRを設定。
  • IPv6はAmazonからのアドレス払い出しを利用。

RouteTable

  • プライベートサブネットにアタッチしたルートテーブルでは、デフォルトルートをNATインスタンスのeniに向ける。
  • パブリックサブネットにアタッチしたルートテーブルでは、デフォルトルートをInternet Gatewayに向ける。

EC2

パッケージインストール・基本設定

iptablesをNATとして使用するため、サービスをインストール。

yum -y install iptables-services

iptablesの定義は一旦全て空にしておく
(ipv4:iptables , ipv6:ip6tablesを利用)

iptables -F
ip6tables -F

IP Forwardingの設定(IPv4)

echo 1 > /proc/sys/net/ipv4/ip_forward
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

IP Forwardingの設定(IPv6)

  • IPV6FORWARDINGをyesに指定。(OS起動時のスクリプトで有効になるため、下記設定後に一度OS再起動しておく。)
  • RouterAdvertisementを受け取る設定を強制(accept_ra=2)
echo IPV6FORWARDING=yes >> /etc/sysconfig/network
echo net.ipv6.conf.eth0.accept_ra=2 >> /etc/sysctl.conf

ip MASQUERADE設定

  • プライベートサブネット⇒インターネットの通信はipマスカレード(アクセス元アドレスの動的変換)を設定しておく
  • FORWARDの行はコネクション接続後の通信を通過させるためのもの。(ipv4は記載なくても問題なかったが念のため。ipv6は記載がないとうまく動作せず)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

NAT設定の例

IPv4(パブリックのEC2 8001番ポート宛通信を、プライベートのEC2 80番ポートへ中継)

iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp --dport 8001 -j DNAT --to 10.0.1.1:80 -m comment --comment "PortMapping"

IPv6(パブリックのEC2 8001番ポート宛通信を、プライベートのEC2 80番ポートへ中継)

ip6tables -t nat -A PREROUTING -d ****:****:****:****:65b0:adc4:6e38:7fd0 -p tcp --dport 8001 -j DNAT --to-destination [****:****:****:****:9e25:e543:8a42:24e9]:80 -m comment --comment "PortMapping"

iptablesの設定保存・サービス有効化

iptables設定保存

service iptables save
service ip6tables save

iptablesのサービス有効化

systemctl start iptables
systemctl start ip6tables
systemctl enable iptables
systemctl enable ip6tables

iptablesの実行状況確認

systemctl status iptables
systemctl status ip6tables

以下はデバッグ・設定のコマンドメモです。

iptablesコマンドメモ

NAT設定状況の確認

iptables -t nat -L -n
ip6tables -t nat -L -n

NAT設定状況の確認(行番号付き)

iptables -t nat -L -n --line-numbers

NAT設定を全部消す方法(MASQUERADEも消える)

iptables -t nat -F

特定の文字列を含む設定を削除する

iptables-save | grep -v "PortMapping" | iptables-restore
ip6tables-save | grep -v "PortMapping" | ip6tables-restore

デバッグ用コマンド(ipv6)

ipv6関連

ip -6 route
tcpdump icmp6 -n

ip fowardの状態確認

sysctl -a|grep forward
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?