🪐

IPv6 onlyなEC2にssh接続後、手元のNAT64を使ってIPv4ホストに接続

2024/03/24に公開

概要

AWSのIPv4アドレスに課金されるようになり、EC2をpublic IPv4なしで立てることが多くなりました
ほとんど困らないのですが、たまにIPv4ホストと通信する必要が出てきます
そんな時に手元のNAT64を経由して疎通させることもできるよというメモ

構成はこんな感じ
tun0から手元のjoolを経由してIPv4サイトと接続します

route

前提と注意事項

  • ローカルPCもEC2もLinux
  • IPv4との疎通はssh接続中だけ(セットアップ等の作業時だけ必要になる想定)
  • DNS64はAWS側のDNSキャッシュサーバーで行います[2]
  • IPv4との疎通は今回の方法以外にもあります

事前設定

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を有効にします

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
脚注
  1. NATゲートウェイは有料です ↩︎

  2. こちらは無料 ↩︎

  3. 自分が送る通信内容が暗号化されているとか、信頼できるサービスならありかもしれない ↩︎

Discussion