注意事項
IPv6初心者のため、記載内容に理解不足・誤りがある可能性があります。
目的
IPv6はIPv4と異なり、インターネットに直接ルーティング可能なアドレスがアサインされるようです。
とはいえ、特殊な環境要件においてIPv6でもNATしたいという場合の方法を考えました。
概要
- 環境はAmazonLiunx2を利用。
- AmazonLiunx2のIPフォワーディングを有効にし、パケットの中継ができるようにする。
- IPv4ではiptables、IPv6ではip6tablesを利用して変換設定を行う。
環境概要
パブリックサブネット側にNAT用のEC2インスタンスを配置し、プライベートサブネットに配置されたEC2とインターネット間の通信を中継するケースを想定。
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