iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
IT Operation

從前後端踏上 AWS 雲端架構勇者之路系列 第 11 篇

Security Group:連進來、連出去,我跳進來啦,我又跳出去啦~

  • 分享至 

  • xImage
  •  

昨天我們把路由表跟 IGW 的關係串起來了,知道 Subnet 使用哪張表,以及資料要往哪裡送

不過有路可以走,外面的人就能連到你的網站了嗎?昨天有提到,還得看安全規則有沒有允許

所以今天來繼續分享圖裡橘色的 Security Group(安全群組),後面就簡稱 SG。它會管理主機連進來、連出去的流量,允許哪些連線通過

昨天的網路全貌圖,今天接著看橘色箭頭標示的 Security Group

對照這張圖,前面藍色的 VPC、Subnet 是主機所在的網路,紫色的路由表、IGW 則處理資料往哪裡走

那橘色的 SG 呢?例如你希望大家都能打開網站,但遠端登入主機這件事,只想開給自己,就可以透過 SG 設定

今天先來看連線方向怎麼分,下一篇再接著分享,要怎麼設定來源跟 Port,讓不同的連線有不同的限制~

什麼叫連進來、連出去?

這裡會看到兩個英文,Inbound 是連進來,Outbound 是連出去

不過要先講清楚,是對哪台主機來說?

舉例來說,你用瀏覽器打開網站,對網站主機來說,就是有人連進來。但網站上的後端程式如果需要查資料,還得另外去連資料庫,這時對網站主機來說,就是連出去

下面用 Web 代表網站主機,DB 代表資料庫主機,web-sg、db-sg 則是它們各自使用的 SG 名稱

圖上還有 Port,可以先想成「要連主機上的哪個服務」。HTTPS 網站常用 TCP 443,PostgreSQL 資料庫預設用 TCP 5432

瀏覽器連到 Web 是 Web 的 Inbound;Web 連到 DB,是 Web 的 Outbound,也是 DB 的 Inbound

所以這裡其實有兩段分開建立的連線,瀏覽器先找網站,再由網站上的後端程式去找資料庫

那 SG 也是掛在 Subnet 上嗎?

昨天講路由表時,是 Subnet 去關聯一張表,那 SG 也是一樣嗎?

這裡不太一樣,以 EC2 來說,SG 是關聯在主機的網路介面,也就是主機收跟送網路資料的地方,附上(官方說明)

所以我們平常講「這台主機用了哪個 SG」,就是在講這個關係

即使兩台主機都放在同一個 Subnet,也可以各用不同的 SG,例如網站主機允許大家連進來,資料庫主機只允許網站主機連進來

一個 SG 也可以給多台主機共用,同一個網路介面還可以使用多個 SG。如果用了多個,允許的規則會合併一起看,所以多掛一個 SG,不代表限制就會變多(AWS 規則說明)~

同一條連線,怎麼又是 Inbound,又是 Outbound?

回到剛剛的圖,瀏覽器連到 Web 的 TCP 443,對 Web 來說是連進來,所以看的是 Web 的 Inbound 規則

那接下來 Web 去連 DB 的 TCP 5432 呢?

對 Web 來說,它是主動去找別人,所以是 Outbound。但對 DB 來說,是 Web 連進來找它,所以又變成 Inbound

這裡幫大家整理一下:

Web → DB 這段連線 對應的規則
對 Web 來說,是連出去 Web 的 Outbound
對 DB 來說,是連進來 DB 的 Inbound

所以如果你要讓 Web 連資料庫,就得看 Web 的 Outbound,以及 DB 的 Inbound。資料庫服務開在 DB 上,要接收 TCP 5432 連線的是 DB

那「連出去」是不是代表要去 Internet?也不一定哩,Web 跟 DB 就算都在同一個 VPC,對 Web 來說一樣是連出去

再換個例子,如果 Web 要呼叫外面的 HTTPS API,一樣會用到 TCP 443,但這次是 Web 主動連出去,所以要看 Outbound

你會發現,同樣是 443,瀏覽器來找 Web,跟 Web 去找外面的 API,方向剛好相反

所以我會建議,看到 Port 先別急著開,先確認一下「誰要連誰」,會比較不容易改錯地方~

那 Port 到底是什麼?

如果你有在自己電腦上開過前端或後端專案,可能看過 localhost:3000,後面的 3000 就是 Port

前面講的 IP,是幫你找到哪台主機;Port 則是要找這台主機上的哪個服務

例如一台主機上可以有網站服務,也可以有 SSH,讓你遠端登入主機操作。兩個服務做的事情不同,使用的 Port 也可以不同

這裡列幾個後面會看到的組合:

用途 常見的協定與 Port
HTTP 網站 TCP 80
HTTPS 網站 TCP 443
SSH 遠端登入 TCP 22
PostgreSQL 資料庫 TCP 5432

TCP 是這些連線使用的傳輸協定,這裡先記得,設定 SG 時,會一起指定協定跟 Port

表裡是常見或預設的設定,實際用哪個 Port,還是要看程式怎麼設定(AWS 規則範例)

那我在 SG 允許 TCP 443,網站就可以開了嗎?還沒哩,主機上也要有程式在 443 接收請求,這就是我們說的「監聽這個 Port」

如果程式其實開在 3000,只有在 SG 允許 443,程式也不會自己搬過去,所以兩邊要對得起來

剛建立 SG 時,預設可以做什麼?

假設你自己新建一個 SG,還沒改任何規則,會是下面這樣:

方向 初始設定
Inbound 沒有規則,不允許別人主動連進來
Outbound 有允許所有出站流量的規則

也就是說,SG 這邊預設允許主機主動連出去,但別人想主動連進來,還得另外加 Inbound 規則

前面講 IAM 政策時,有 Allow(允許)跟 Deny(拒絕),但 SG 的規則只有 Allow(允許),沒有 Deny 可以設定(官方說明可以看這裡)

所以你想限制某種連線,要去看目前有哪些規則允許了它,調整那些規則

另外這裡講的是「自己新建的 SG」。VPC 本來就有一個叫 default 的 SG,它的初始 Inbound 會允許使用同一個 default SG 的資源互連,跟自己新建的不同,這點要留意一下

沒開 Inbound,那 API 回傳的資料怎麼進來?

看到這裡,你可能會想,那我讓主機連出去呼叫 API,API 回傳資料時,不也是連進來嗎?是不是也要開 Inbound?

這裡來舉個例子,假設 Web 的 SG 沒有 Inbound 規則,Outbound 則改成只允許連到某個 API 的 TCP 443,其他網路設定都正常

Web 主動呼叫這個 API,符合 Outbound 規則,那 API 沿著同一條連線回傳的資料,可以通過 SG,不用再另外加 Inbound 規則

因為 SG 會追蹤連線,知道這是剛剛已經允許的那條連線回傳的資料,這個特性叫做 stateful(官方說明)

不過,如果 API 那台主機另外建立一條新連線,要來找 Web 呢?

那就得看 Web 的 Inbound 了,因為這次是對方主動連進來,沒有符合的允許規則,一樣會被擋住

API 那邊做的事情 Web 沒有 Inbound 規則時
沿著同一條仍被追蹤的連線,回傳剛剛請求的結果 SG 允許回應進來
另外建立一條新連線到 Web SG 不允許

所以不能想成「這個 IP 我之前有連過,以後它就都能進來」,還是要看是不是同一條連線的回應

反過來也一樣,如果別人連進來時,已經符合 Inbound 規則,主機沿著同一條連線回覆,也不用為了這個回覆另外開 Outbound

小結

最後小結一下:

重點 記住這句
SG 用在哪 以 EC2 來說,關聯在主機的網路介面,跟 Subnet 使用路由表是不同的關係
Inbound/Outbound 對這台主機來說,是別人連進來,還是自己連出去?
Port 要找主機上的哪個服務,SG 的規則也要搭配程式實際監聽的 Port
連線的回應 SG 會追蹤連線,正常回應不用再另外開反方向規則

下一篇再繼續分享來源規則,例如網站可以給大家看,但 SSH 只想開給自己,資料庫只想讓網站主機連,這些要怎麼設定?

希望這篇有讓你對 SG 跟連線方向更有概念,我們下篇見 :D


上一篇
Subnet 沒指定路由表,資料會往哪走?
下一篇
Port 明明有開,為什麼還是被 Security Group 擋住?
系列文
從前後端踏上 AWS 雲端架構勇者之路 共 12 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言