🪐
IPv6 onlyなEC2にssh接続後、手元のNAT64を使ってIPv4ホストに接続
概要
AWSのIPv4アドレスに課金されるようになり、EC2をpublic IPv4なしで立てることが多くなりました
ほとんど困らないのですが、たまにIPv4ホストと通信する必要が出てきます
そんな時に手元のNAT64を経由して疎通させることもできるよというメモ
構成はこんな感じ
tun0から手元のjoolを経由してIPv4サイトと接続します
前提と注意事項
- ローカルPCもEC2もLinux
- IPv4との疎通はssh接続中だけ(セットアップ等の作業時だけ必要になる想定)
- DNS64はAWS側のDNSキャッシュサーバーで行います[2]
- IPv4との疎通は今回の方法以外にもあります
- 例えばpublicのNAT64サービスを使う[3]、PROXYサーバーを経由させる等
事前設定
joolの起動
ここら辺の永続化についてはこちら
apt install jool-dkms jool-tools
modprobe jool
jool instance add for-ec2 --netfilter --pool6 64:ff9b::/96
jool instance display
EC2側の/etc/ssh/sshd_configに以下を追加
PermitTunnel yes
VPCのサブネット設定でDNS64を有効にします
AAAAレコードが返って来るならDNS64が有効になっています
dig v4.ipv6test.app. aaaa
接続
経路はWireguardでもなんでも良いんですが、今回はsshでtun0デバイスを作成します
そのためclient側もserver側もrootを使用
ssh -o "Tunnel point-to-point" root@ec2-server
接続後にipとルーティングを設定
ip address add fd00::2/8 dev tun0
ip link set tun0 up
ip route add 64:ff9b::/96 via fd00::1
ローカル側でも設定
ip address add fd00::1/8 dev tun0
ip link set tun0 up
毎回打つのが面倒なら
~/.ssh/configにこんな感じで書いておくと良いです
Host ec2-server
User root
HostName 2001:db8:3333:4444:5555:6666:7777:8888
PermitLocalCommand yes
Tunnel point-to-point
RemoteCommand ip a add fd00::2/8 dev tun0;ip link set tun0 up;ip r add 64:ff9b::/96 via fd00::1;bash
LocalCommand ip a add fd00::1/8 dev tun0;ip link set tun0 up
RequestTTY force
確認
IPが返ってくればOK
curl v4.ipv6test.app
Discussion