前言
- 之前的 server 為了簡便,都是直接用 Elastic IP 直接對外連線。
- 不過 AWS 自從 2024 年 2 月 1 日起,AWS 對於所有的 Elastic IP、Public IP 會開始收費 [1],大概每個月一個 IP 收 3.6 美金,大約是 100 元出頭 (貴)。
- 晚了幾個月才知道的我,趕緊把幾台小 EC2 取消 Elastic IP (以及 Public IP),然後設法把流量轉到 IPv6 上。
- 除了對外的流量,管理用的 SSH 連線方式也有更動,因為現在不能對外,所以要透過 AWS 的新功能 EC2 Instance Connect Endpoint 來連線;
- SSH 連線方式官網示意圖:
大致的流程會是
- 首先,新增 IPv6 設定,然後把 EC2 的 public IPv4 移除 (private IP 還是可以使用 IPv4)。
- 然後新增 EC2 Instance Connect Endpoint (eice),並且新增 user 與 policy;這是用來以 SSH 登入連線管理使用。
- 最後更新 DNS,對外以 IPv6 提供服務
新增 IPv6,以及移除 EC2 的 public IPv4
新增 IPv6 的步驟
主要參考這篇 [2],還有動圖,非常清楚。
這邊列出主要的動作:
-
把預設的 (EC2 使用的) VPC 新增 IPv6 CIDR block:
VPC
->[Actions] Edit CIDRs
->Add IPv6 CIDR
-
從你的 EC2 找到對應的 Subnet ID:
Instance
->Networking
->Subnet ID
-
從你的 EC2 找到對應的 Network Interface ID:
Instance
->Networking
->Network Interface ID
->[Actions] Manage IP addresses
-> 點開eth0
->Assign new IP address
(IPv6) -
更新 Security Group,Inbound 允許 IPv6 port
22
:Security Group
->Inbound rules
->Edit inbound rules
-> 新增SSH
&Source: ::/0
-
更新 Route Table,新增 IPv6 traffic 用同一個 internet gateway:
Route Table
->Edit routes
->Add route
->Destination: ::/0
->Internet Gateway: igw-xxxxxx
移除 EC2 public IPv4 的步驟
-
新增一個 Elastic IP
Elastic IPs
->Allocate new address
-
然後把它綁定到 EC2 上
Elastic IPs
->[Actions] Associate Elastic IP address
-> 選擇對應的 EC2 -
新增一個新的 Network Interface
Network Interfaces
->Create network interface
-> 選擇對應的 Subnet ID、Security Group -
等新建立的 Network Interface 的狀態準備就緒之後,把新的 Network Interface 綁定到 EC2 上
Network Interfaces
->[Action] Attach network interface
-> 選擇對應的 EC2 -
最後,把剛才綁定的 Elastic IP 移除
Elastic IPs
->[Actions] Disassociate Elastic IP address
->[Actions] Release Elastic IP address
最後,回到 EC2 的 Instance
畫面,應該可以看到:
- Public IPv4 address 是空的
- Elastic IP addresses 也是空的
- IPv6 address 有值
設定 local ssh 連線 (不使用網頁 console 連線)
我習慣用 iTerm2 連線,所以這邊會設定 local ssh 連線。
如果可以接受只使用網頁 console 連線,設定 EC2 Instance Connect Endpoint 就可以了。
新增 EC2 Instance Connect Endpoint (eice)
主要參考 AWS 文件 [7]。
簡記步驟:
- 去
VPC
->Endpoints
->Create Endpoint
-> 選擇EC2 Instance Connect Endpoint
-> 選擇對應的 VPC、Subnet、Security Group
新增 user 與 policy
我新增了一個 IAM user ec2-connect
;
你可以自己另外命名,下面的內容會用 ${iam_user_name}
來代表這個 user 字串。
目前會用到的變數說明
${region}
: ec2 的 region,例如我放在東京ap-northeast-1
${account_id}
: 你自己帳號的 id;可以在 aws 畫面的右上角點開自己的帳號名稱,然後複製 id${iam_user_name}
: 我們剛才新增的 user name${pem_file}
:你的私鑰 pem file 名稱
然後經過各種試錯以及文件,新增了以下 policy 套用在此 user 上:
|
|
Note
- 如果你需要更細緻的權限控管,可以自己調整
Resource
、或是新增Condition
等
下載 AWS CLI、設定 profile
記得下載 v2 最新版本
並且設定好 config, profile。
cat ~/.aws/config
:
|
|
(記得自己替換變數哦)
在 ~/.aws/credential
設定 aws access credential:
|
|
- 記得權限要是
600
測試連線
根據文件 [3],需要透過 aws ec2-instance-connect open-tunnel
來連線。
先安裝 awscli
;偷懶用 brew 比較快。
|
|
- 你可以參考官方安裝文件 [8]
我把我的 host alias 稱為 prod
(你可以自己調整)
所以,在 ~/.ssh/config
裡面加入以下內容:
|
|
Note
- 我預設安裝 aws CLI 的路徑是在
/usr/local/bin/aws
,你可以自己調整路徑 %h
會被替換成HostName
的值,這裡就是${instance_id}
測試連線,終於成功!
|
|
如果有任何錯誤,可以打開 verbose
模式 debug:
|
|
例如我一開始 policy 有少給 ec2:DescribeInstances
,會出現以下錯誤:
|
|
(有調整排版、替換我的 account id)
如果沒有開 verbose
模式,可能只會看到最後兩行的錯誤訊息:
|
|
測試 DNS
新建 nginx container
用 docker 來建立一個 nginx container,方便快速測試 DNS
|
|
Note
- 如果你可以快速佈建服務、驗證是否有連通的話,就不用特別起 nginx 測試。
修改 route53 (或你的 DNS 服務商) record
這邊以 route53 為例,你可以去你的 DNS 服務商修改對應的 record:
- 新增一個
AAAA
record,指向你的 EC2 IPv6 address
例如
Record Name Type Value
ipv6.example.com AAAA a4bf:0361:2649:ab9b:917c:91dd:41e5:f1dc
測試連線
等幾秒鐘,可以用 dig
驗證解析結果:
|
|
生效後,可以用 curl
來測試是否有連通 nginx:
|
|
或是開瀏覽器輸入網址,應該可以看到 nginx 的歡迎畫面。
Note
- 如果你發現 DNS 有解析,但是瀏覽器點開卻顯示:
找不到 ipv6.example.com 的 DNS 位址,正在診斷問題
你可以先嘗試用手機使用行動網路測試,這有可能是你的家裡 wifi 出去之後,ISP 那邊不支援 IPv6。
可以聯繫客服關切一下。
後記
當我發現家裡 ISP 不支援 IPv6 解析時,我就知道 EC2 還是得留一個 IPv4 的 Elastic IP,
因為其他 user 可能還是會有一樣的狀況,總不能讓服務因為這個原因無法連線。
所以現在準備要去把 server 合併在一台比較划算,實在是夭壽。
REF
- https://aws.amazon.com/tw/events/taiwan/techblogs/aws-public-ipv4-address-charge/
- https://swordandsignals.com/2024/01/28/ec2-from-ipv4-to-ipv6.html
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-using-eice.html
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-with-ec2-instance-connect-endpoint.html
- https://repost.aws/questions/QUWOoCv-AJQ9ynUhKsB6HyQQ/i-need-restriction-access-for-the-specific-instance-for-the-aws-new-feature-called-secure-eic-connection
- https://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/permissions-for-ec2-instance-connect-endpoint.html
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-ec2-instance-connect-endpoints.html
- https://docs.aws.amazon.com/zh_tw/cli/latest/userguide/getting-started-install.html