aws ec2 切换到ipv6

ipv6 出来已经很久了,工作中也处理过很多次ipv6的task,但是从来没想过把自己的ec2切换到ipv4,昨天再邮件回收站里面看到了一个邮件,aws 的ipv4 2024.2.1 要收费了,这就不能忽略了😄,刚好今天有空就把他切换成了ipv6,过程有点折腾。 本文不仅适用ec2,其他linux 主机应该也支持。

image-20231212145049883

为ec2 添加一个ipv6 地址

我的ec2 的dns 解析在Cloudflare,所以主要是参考这篇博客。Amazon 的 20 亿 IPv4 税费 — 以及如何避免支付这笔费用

以及将 VPC 从 IPv4 迁移到 IPv6

需要注意的是将 VPC 从 IPv4 迁移到 IPv6。这个demo中vpc是有一个公有子网以及一个私有子网,如果您像我一样只有一个公有子网,那这部分就不需要设置了。

image-20231212145739848

不得不说,aws 的文档写的真好,这一点,需要多多学习。

设置完成的结果应该是这样的。同时有ipv4 与ipv6 地址。在安全组中也为ipv6添加相同的规则。

image-20231212150653820

应用支持

我的ec2 上只跑了一个nginx + docker,平时用ssh登录。所以需要为Nginx 与sshd 添加 ipv6支持。

Nginx

对于您的 HTTP 服务器块(监听端口 80 的那个),添加一行 listen [::]:80;。这使得 Nginx 同时监听 IPv4 和 IPv6 的 HTTP 流量。修改后的服务器块应该像这样:

1
2
3
4
5
6
server {
listen 80;
listen [::]:80;
server_name hexo.hxzhouh.com;
return 301 https://$host$request_uri;
}

对于每个 HTTPS 服务器块(监听端口 443 的那些),在每个块中添加 listen [::]:443 ssl;。这将使得 Nginx 监听 IPv6 上的 HTTPS 流量。例如,对于第一个 HTTPS 服务器块,你需要做如下修改:

1
2
3
4
5
6
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name hexo.hxzhouh.com;
# 其余配置...
}

对每个 HTTPS server 块进行这样的修改。然后测试一下 Nginx -t 如果没问题就重新加载Nginx配置 systemctl reload nginx

sshd

再sshd_config 修改,删除对AddressFamily any的注释(即删除前面的#),为 ssh 等应用程序开启 IPv6 监听。

1
2
3
4
5
6
7
vim /etc/ssh/sshd_config 

#Port 22
AddressFamily any
AddressFamily inet
#ListenAddress 0.0.0.0
#ListenAddress ::

然后重启 sshd sudo systemctl reload sshd ,执行netstat -tupln命令,若出现以下报文,表示查 ssh 已成功监听 IPv6。

image-20231212152302361

这样应用层就修改好了。

dns 设置

最后,在Cloudflare 里面设置 一下dns,把以前的ipv4 的A记录全部改成AAAA 的ipv6 就可以了。

image-20231212151550030

大功告成,测试一下如果没问题的话,就可以把ipv4地址删了。省的扣钱。

更新: 正在运行的实例无法删除ipv4地址,只能通过AMI 重建,折腾呀,但是aws 不再给我发邮件了。✌️

How to remove IPv4 public IP address from ec2 instances before February 2024? (IPv6)