NAT (Network Address Translation)
NAT์ ๋คํธ์ํฌ ๊ณ์ธต์ ์ฃผ์ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ค.
NAT ์์ฒด๋ ํ๊ฒฝ์ ๋ฐ๋ผ์ ์กฐ๊ธ์ฉ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์๋๋ฐ, ๊ธฐ๋ณธ์ ์ธ ์ญํ ์ ๊ฐ๋ณ ์ฅ์น๋ค์ด ์ธ๋ถ ์ธํฐ๋ท๊ณผ ์ํตํ๊ธฐ ์ํ ์ผ์ข ์ ์ค๊ณ๊ธฐ๋ค.
๊ฐ์ ์ฉ ํ๊ฒฝ์ ์๊ฐํด๋ณด์.
Public ์ธํฐ๋ท๊ณผ ์ํตํ๊ธฐ ์ํด์๋ ๋น์ฐํ Public IP๊ฐ ์์ด์ผ ํ๋ค.
ํ์ง๋ง ๊ฐ๋ณ ์ฅ์น๋ค์ ๊ณต์ ๊ธฐ๊ฐ ํ ๋นํ ๋ด๋ถ IP๋ฅผ ๊ฐ๊ณ ์์๋ฟ, Public IP๋ฅผ ๊ฐ๊ณ ์์ง ๋ชปํ๋ค. ๊ณต์ ๊ธฐ๊ฐ ํ๋์ Public IP๋ฅผ ๊ฐ๊ณ ์์ ๋ฟ์ด๋ค.
๊ทธ๋์ ๊ณต์ ๊ธฐ๊ฐ ๊ฐ๋ณ ์ฅ์น๋ค์ ์์ฒญ์ ๋ชจ์์ ์ธ๋ถ ์ธํฐ๋ท๊ณผ ์ํตํ ์ ์๊ฒ ํด์ฃผ๋ ์ผ์ข ์ ๋ฉํฐํ๋ ์ฑ ๋ ์ด์ด๊ฐ ์๊ธด ๊ฒ์ด๊ณ , ์ด๊ฒ ๋ฐ๋ก NAT์ธ ์ ์ด๋ค.
์์ธ
NAT์ ๊ธฐ๋ณธ์ ์ผ๋ก IP ๋ ๋ฒจ์์ ํจํท์ ์ฒ๋ฆฌํ๋ฏ๋ก ๋๋ฌธ์ L3 ๊ณ์ธต ๋ ์ด์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๊ณต์ ๊ธฐ๋ฅผ ์ฐ๋ ์ผ๋ฐ์ ์ธ ๊ฐ์ ์ฉ ํ๊ฒฝ์ด๋ผ๋ฉด NAT์ ์ญํ ์ ๋ผ์ฐํฐ, ์ฆ ๊ณต์ ๊ธฐ๊ฐ ์ํํ๋ค.
๊ณต์ ๊ธฐ๊ฐ ํผ์ ๋ชธ๋นตํ๋ฉด์ ์ค์ ์ธ๋ถ ์ธํฐ๋ท๊ณผ์ ํต์ ์ ๋์ ๋งก์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
๊ณต์ ๊ธฐ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋ฐ๋ผ ์ ์ฒด์ ์ธ ๋คํธ์ํฌ ์ฒ๋ฆฌ๋์ด๋ ์๋๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ๋ ๋ค ์ด ๋๋ฌธ์ด๋ค.
NAT์๋ ๋ฐฉ์์ด ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ๊ฒ์ PAT(Port Address Translation)์ด๋ค.
์ด๊ฑด ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ๋คํธ์ํฌ๋ฅผ ๋ณํํ๋ค.
-
๋ด ์ฅ๋น(192.168.0.222)์์ naver.com์ผ๋ก HTTP ์์ฒญ
-
๊ณต์ ๊ธฐ๊ฐ NAT Table์ 192.168.0.222์ ๋๋ค ํฌํธ๋ก NAT ํ ์ด๋ธ์ ๊ธฐ๋กํ๋ค. (์: 192.168.0.222:44444 => ๊ณต์ ๊ธฐIP:33333)
-
๊ณต์ ๊ธฐ๊ฐ HTTP ์์ฒญ์ ๋์ ์ ์กํ๋ค. (๊ณต์ ๊ธฐIP:33333 => naver.com)
-
HTTP ์์ฒญ์ ๋ํ ์๋ต์ด ์ฌ ๊ฒฝ์ฐ, ๊ณต์ ๊ธฐ๋ NAT ํ ์ด๋ธ์ ์กฐํํด์ ์ญ๋ณํ์ ์ํํ๋ค. (์: naver.com => 192.168.0.222:44444)
-
๋ด ์ฅ๋น(192.168.0.222)์ naver.com์์ ๋ณด๋ด์ค HTTP ์๋ต์ ๋ฐ๋๋ค.
ํฌํธ๋ฅผ ๋ถ์ฌ์ ํต์ ์ ์ค์ฌํ๋ ์ด์ ๋, ํ๋์ ๊ณต์ ๊ธฐ๊ฐ ์ฌ๋ฌ๊ฐ์ ์ฅ๋น๋ฅผ ๋งค๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฅ๋น ํ๋๋น ํ๋์ ํฌํธ๋ฅผ ๋ถ์ฌํด์ ์ฒ๋ฆฌํ๋ค.
Cloud ํ๊ฒฝ
AWS ๊ฐ์ Public Cloud ํ๊ฒฝ์ ๊ฒฝ์ฐ์๋ NAT Gateway๋ผ๋ ์์คํ ์ด ๋ณ๋๋ก ์กด์ฌํ๋ค. ์์์ ์ธ๊ธํ NAT(PAT)๊ณผ ๋์ ๋ฐฉ์, ์๋ฆฌ๊ฐ ๊ฑฐ์ ๋์ผํ๋ค.
์ด๊ฑด private ๋ฆฌ์์ค์์ ์ธ๋ถ ์ธํฐ๋ท ์ ๊ทผ์ ์๋ํ ๊ฒฝ์ฐ์ ํ์ํ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ค.
๋น์ฐํ public ์ธํฐ๋ท์ ์ ๊ทผํ๋ ค๋ฉด public IP๊ฐ ์์ด์ผ ํ๋๋ฐ, private ๋ฆฌ์์ค๋ก ํ๋ก๋น์ ๋๋ ๊ฒฝ์ฐ์๋ public IP๊ฐ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ ์ธ๋ถ ํต์ ์ ์ค๊ณํด์ฃผ๋ ๊ฒ์ด๋ค.
ํด๋ผ์ฐ๋์ NAT์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ฉ์ด ๊ฝค๋ ๋น์ผ ํธ์ด๋ค. ๋ณดํต ํธ๋ํฝ๋น ๋น์ฉ๊ณผ ํ๋ก๋น์ ๋ ๋น์ฉ์ ๋ ๋ค ๋ฏ๋๋ค.
์ฉ๋
NAT์ ์์์ ์ ๊ทธ๋ฅ Public IP ํ๋๋ฅผ ๋๋ ค์จ์ IP ๋น์ฉ์ ์๋ผ๊ณ , ๊ฐ๋ณ ์ฅ์น๋ค์ ๋ด๋ถ IP ์ ๋ณด๋ฅผ ์๋ํ๋ ์ ๋์๋ค.
ํ์ง๋ง ๋ค๋ฅธ ์ฉ๋๋ ๋๊ฐ์ ๋๋ฌ๋ด๊ธฐ ์์ํ๋๋ฐ, ๊ทธ๊ฒ ๋ฐ๋ก IP๋ฅผ ๊ณ ์ ํ๋ ๊ฒ์ด๋ค.
์ผ๋ถ ์๋ํํฐ ์๋น์ค๋ค์ ๋ฏธ๋ฆฌ "์์ ํ" IP๋ฅผ ํ ๋นํด๋๊ณ ๊ทธ IP๋ฅผ ํตํด์ ์์ฒญํด์ผ๋ง ๋์ํ๊ฒ๋ Ingress ๋ณด์ ๊ณ์ธต์ ๊ตฌ์ฑํด๋๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ์ง ์๊ฒ ์๋ค. ํนํ ๋ณด์์ด ์ค์ํ ๊ธ์ต ์ชฝ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋๋ถ๋ถ ๋ค์ด๊ฐ๋ ๊ฒ ๊ฐ๋๋ผ.
์ด๋ ๊ฒ ๋๋ฉด ๊ฐ๋ณ ์๋ฒ๋ค์ด Public IP๋ฅผ ๊ฐ๊ฒ ํ ์ ์๋๋ผ๋, ๊ณ ์ ๋ IP๋ฅผ ํตํด์ ํต์ ์ด ์ด๋ฃจ์ด์ง๊ฒ ๋ง๋ค์ด์ผ๋ง ํ๋ค. NAT ํจํด์ ์ด๋ฐ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์
์ ๋จ๋ฝ๊ณผ ๊ฐ์ ์ด์ ์์, ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์๋ NAT ํจํด์ ๊ตฌํํด์ผ ํ ์ ์๋ค.
์ด๊ฑด ๋ฐฉ๋ฒ์ด ์ข ๋ค์ํ๋ฐ, CNI๋ฅผ ์ด๋ค๊ฑธ ์ฐ๋์ง์ ๋ฐ๋ผ์ ์ข ๋ฌ๋ผ์ง๋ค. ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ EgressGateway๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
CNI๋ก cilium์ด๋ Calico๋ฅผ ์ธ ๊ฒฝ์ฐ์๋ EgressGateway๋ผ๋ ๊ฒ์ ์ง์ํ๋ค. ์ด๊ฑธ ์ธํ ํ๋ฉด ์ธ๋ถ ํต์ ์ ์ฌ์ฉ๋๋ IP๋ฅผ ๊ฐ๋ก์ฑ์ ํน์ IP๋ก ๊ต์ฒดํด๋ฒ๋ฆด ์ ์๋ค.
๋ค์์ Calico๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ๊ตฌ์ฑ ์์ ๋ค.
apiVersion: projectcalico.org/v3
kind: EgressGateway
metadata:
name: tosspayments-egress
namespace: payment
spec:
egressIP: 3.35.123.45 # ๊ณ ์ ํ NAT IP
selector: "app == 'payment-api'" # ์ด๊ฒ๊ณผ ์ผ์นํ๋ Pod์ Egress Gateway ์ ์ฉ
replicas: 2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-api
namespace: payment
spec:
replicas: 10 # Pod ์ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ
template:
metadata:
labels:
app: payment-api
spec:
containers:
- name: api
image: payment-api:latest
์ด๋ฌ๋ฉด ์ payment-api๋ผ๋ Pod๋ค์ ์ค์ IP์ ๊ด๋ จ์์ด egressIP๋ผ๋ IP๋ก ๋ณํ๋์ด์ ํต์ ์ ํ๊ฒ ๋๋ค.
์ฐธ์กฐ
https://incodom.kr/NAT%28Network_Address_Translation%29
https://tech.kakaopay.com/post/cilium-egress-gateway/