Iptables ๋ฅผ ์์๋ณด๊ธฐ ์ ์ ๋จผ์ Netfilter ์ ๋ํด ์์๋ณด์ฃ !
Netfilter ์ Iptables
AWS EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ Security Group ์ด๋ผ๋ ๊ฒ์ ์ค์ ํฉ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก ์ธ๋ถ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ์กฐ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐฉํ๋ฒฝ ๊ธฐ๋ฅ์ด์ฃ . EC2 ์ธ์คํด์ค ์๋จ์ ์ด๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ์๋ง ๋ฌผ๋ฆฌ์ ์ธ ๊ธฐ๊ณ๊ฐ ์์ด์ ์ด๋ค ํธ๋ํฝ์ ํ์ฉํ๊ณ , ์ด๋ค ํธ๋ํฝ์ ๊ฑฐ๋ถํ๊ฒ ์ฃ .
Security Group ์ด ํ๋์จ์ด ๋ฐฉํ๋ฒฝ ์ด๋ผ๋ฉด Netfilter ๋ ์ํํธ์จ์ด ๋ฐฉํ๋ฒฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
Netfilter ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค.
- ์ํํธ์จ์ด ๋ฐฉํ๋ฒฝ
- ํจํท ํํฐ๋ง
- ๋ฆฌ๋ ์ค ์ปค๋ ๋ด๋ถ์ ํ๋ ์์ํฌ
- ํฌํธ ์ฃผ์, ๋ณํ, ํฌํธ ํฌ์๋ฉ ๋ฐ ํจํท ๋ณ๊ฒฝ
- ๋ผ์ฐํ ์ ํ์ ๋ฐ์ดํฐ ๋ฐ IP ํจํท ํค๋ ๋ณ๊ฒฝ
๊ทธ์น๋ง ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ Netfilter ์ ์ง์ ์ ๊ทผํ์ง ์๊ณ , ์ด๋ค ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํด์ ๋ณ๊ฒฝํ๋๋ฐ ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก Iptables ์ ๋๋ค.
์ฆ, Iptables ๋ Netfilter ๋ฅผ ์ปจํธ๋กคํ๋ ์ํํธ์จ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
ํท๊ฐ๋ฆฌ์๋ค๋ฉด, Iptables ๊ณผ Netfilter ๋ฅผ ๋์ผ์ ์๊ฐํด๋ ํฌ๊ฒ ์ด ๊ธ์ ์ดํดํ๋๋ฐ ์ง์ฅ์ ์์ ๊ฒ๋๋ค ๐
Netfilter Chains
Netfilter ์๋ ๋ค์๊ณผ ๊ฐ์ด 5 ๊ฐ์ Chains ๋ผ๋ ๊ฒ์ด ์กด์ฌํฉ๋๋ค.
Input
- ๋ค์ด์ค๋ ํจํท์ ํ์ฉํ๊ฑฐ๋ ๊ฑฐ๋ถ(Drop)
- ํธ์คํธ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ํจํท์ ์์ธ์์ด Input ๊ท์น์ ๋ฐ๋ฆ
- Input ๊ท์น์ ๊ฑด๋๋ธ ์ ์๋ ํจํท์ ์์
$ iptables -t filter -A INPUT -p icmp -j DROP
# ๋ค์ด์ค๋ ๋ชจ๋ icmp ๋ฅผ DROP ํ๋ค
# ping ์ iptables ๋ฅผ ์ ์ฉํ ํธ์คํธ๋ก ๋ณด๋ด๋ฉด ์๋ต์ด ์ค์ง ์๋๋ค
Output
- ๋๊ฐ๋ ํจํท์ ํ์ฉํ๊ฑฐ๋ ๊ฑฐ๋ถ(Drop)
- ํธ์คํธ๊ฐ Source ๊ฐ ๋จ
$ iptables -t filter -A OUTPUT -d netfilter.org -j DROP
# ํธ์คํธ์์ netfilter.org ๋ก ๋๊ฐ๋ ๋ชจ๋ ํจํท์ ๋๋กญ๋๋ค
์ด์ธ Prerouting, Forward, PostRouting ๊ฐ ์กด์ฌํ๋๋ฐ ์ด๋ ์ข ๋ ๋ค์์ ๋ค๋ฃจ๋๋ก ํ์ฃ ๐ง
Netfilter Tables
Netfilter ์์ Chain ๋ง๊ณ Table ๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋๋ฐ ์ด 4๊ฐ์ง๊ฐ ์กด์ฌํฉ๋๋ค.
Iptables ์์ ์์ฑํ ๋ฃฐ์ ์ ์ํ๋ Table ์ด์ฃ .
filter
- iptables ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ ์ด๋ธ
- ๋ชจ๋ ์์ ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ฐฉํ๋ฒฝ๊ณผ ์ฐ๊ฒฐ๋๋ ๊ณณ
- ์ฌ๊ธฐ์ ํจํท์ ํ์ฉํ ์ง ๊ฑฐ๋ถํ ์ง ์ ํจ
$ iptables -A INPUT -p tcp --dport 22 -s 5.3.6.6 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 22 -j DROP
# ์ฒด์ธ์ ๋ฑ๋ก๋ ์์๋ก ์๋ํ๋ค
# 5.3.6.6:22 ์ ํจํท๋ง ํ์ฉ๋๋ค
# ํ์ง๋ง ๋๋ฒ์งธ ์ฒด์ธ์์ 22 ํฌํธ๋ก ์ค๋ ํจํท์ ์ด๋ค IP ๋ ๋๋กญ๋๋ค
nat
- DNAT, SNAT ๊ด๋ จ ๋ฃฐ์ ์ ์ํจ
๋๋จธ์ง mangle ๊ณผ raw ํ ์ด๋ธ์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค.. ์ฌ์ฉํ๋ ์ ์ด ์์ด์.. ๐
๊ธฐ๋ณธ์ ์ธ Command
Iptables ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ iptables ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋์ ๊ฐ์ด ๋ง์ด์ฃ .
$ iptables -vnL
ํต์ฌ Command ๋ง ํ๋ฒ ์์๋ณด์ฃ !
์ฐธ๊ณ : iptables ๋ช ๋ น์ด๋ root ๊ณ์ ๋ง ๊ฐ๋ฅํฉ๋๋ค
์ฐธ๊ณ : -t nat ์ ๊ฐ์ด table ์ ์ง์ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก filter ๋ฅผ ์ฌ์ฉํฉ๋๋ค
L ์ต์
iptables ์ ์กด์ฌํ๋ Rule ์ ๋ฆฌ์คํธํฉ๋๋ค.
$ iptables -L
# ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค
$ iptables -vnL
# ๋ ์์ธํ๊ฒ ๋ณด์ฌ์ค
# -v : verbose
# -n : numberic
A ์ต์
iptables ์ Rule ์ ์ถ๊ฐํ๋ ์ต์ ์ ๋๋ค.
$ iptables -A INPUT -p tcp --dport 80 -j DROP
# 80 ํฌํธ๋ก ๋ค์ด์ค๋ ํจํท์ ๋๋กญํจ
$ iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# 8080 ํฌํธ๋ก ๋ค์ด์ค๋ ํจํท์ ํ์ฉํจ
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# ๊ท์น์ ์์์ ์๋๋ก ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ฒซ๋ฒ์งธ ๊ท์น์ ์ํด DROP ๋์ด
# ์ด ๊ท์น์ ์ฌ์ค์ ๋ฌด์๋ฏธํจ
I ์ต์
A ์ต์ ๊ณผ ๋๊ฐ์ด ๊ท์น์ ์ถ๊ฐํ์ง๋ง A ์ต์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ค์์ ์ถ๊ฐํ๊ณ , I ์ต์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฒซ๋ฒ์งธ์์ ์ถ๊ฐํฉ๋๋ค.
๋ค์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
ํ์ฌ 80 ํฌํธ๋ฅผ DROP ํ๋ ๊ท์น์ด ํ๊ฐ ์์ต๋๋ค. ์ด๋ I ์ต์ ์ ์ฌ์ฉํ๋ค๋ฉด DROP ๊ท์น ์๋๊ฐ ์๋ ์์ ์์ฑ๋๊ฒ ๋ฉ๋๋ค.
$ iptables -A INPUT -p tcp --dport 80 -j DROP
$ iptables -I INPUT -p tcp --dport 80 -j ACCEPT
์๋๊ฐ ์๋ ์์ ์๊ธด ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ ์ ์ด์ผ๊ธฐํ์ง๋ง ๊ท์น์ ์์์ ์๋๋ก ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ฒฝ์ฐ 80 ํฌํธ๋ ๋ค์ด์ค๋ ํธ๋ํฝ์ ๋ฌด์กฐ๊ฑด ํ์ฉ๋ฉ๋๋ค.
F ์ต์
๊ทธ๋ผ ์์์ ์ถ๊ฐํ ๊ท์น์ ๋ค ์ญ์ ํด๋ณด์ฃ !
$ iptables -F
๊ท์น์ด ๋ค ์ญ์ (Flush) ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ์์ ๋ฅผ ํตํด ์ง๊ธ๊น์ง ๋ฐฐ์ด ๊ฑธ ํ์ฉํด๋ณด์ฃ ๐
๊ธฐ๋ณธ ์์
Case 1) 80 ํฌํธ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ๋ชจ๋ ๊ฑฐ๋ถํ์!
ํ์ฌ Host ์์ 80 ํฌํธ๋ Nginx ํ๋ก์ธ์ค์ ๋๋ค.
Client ์์ curl ๋ฅผ ์ด์ฉํด์ Host ์ Nginx ์ ์ ๊ทผํด๋ณด์ฃ !
๋ฌด๋ฆฌ์์ด ์๋ต์ ๋ฐ๊ณ ์์ต๋๋ค. ๊ทธ๋ผ ์ด๋ฅผ ๊ฑฐ๋ถํ๋ Rule ์ ์ถ๊ฐํด๋ณด์ฃ !
Host ๋ก ์ด๋ํด์ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
$ iptables -A INPUT -p tcp --dport 80 -j DROP
# -p : protocol
# ํฌํธ๋ L4 ์ดํ๋ถํฐ ๊ฐ๋ฅํ๋ฏ๋ก -p tcp ๋ผ๋ ์ต์
์ ์ถ๊ฐํด์ฃผ์ด์ผ ํจ
80 ํฌํธ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ํธ๋ํฝ์ DROP ํ๊ธฐ ๋๋ฌธ์ curl ์ ํด๋ ์๋ต์ด ์ค์ง ์์ต๋๋ค.
๊ทธ๋ผ ๋ค์ ์ด๋ฅผ ACCEPT ํ ์ ์๊ฒ ์๋ก์ด ๊ท์น์ ์ถ๊ฐํด๋ณด์ฃ ! ์ด๋ค ์ต์ ์ ์ฐ๋ฉด ๋ ๊น์?
Case 2) -F ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ 80 ํฌํธ๋ฅผ ๋ค์ ํ์ฉํด์ฃผ์!
๊ฐ์ด ์ค์๋์? ๋ง์ต๋๋ค. I ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
$ iptables -I INPUT -p tcp --dport 80 -j ACCEPT
๊ทธ๋ผ ๋ค์ curl ๋ฅผ ๋ณด๋ด๋ณผ๊น์?
DROP ๋๋ ๊ท์น์ด ์๊ธด ํ์ง๋ง ๊ณ์ ์ด์ผ๊ธฐํ๋ค์ํผ ๊ท์น์ ์์์ ์๋๋ก ์ฝ๊ธฐ ๋๋ฌธ์ ACCEPT ๊ฐ ๋๋ ๊ฑธ ์ ์ ์์ต๋๋ค ๐ค
๊ทธ๋ผ ์ข ๋ ์ฌํ๋ ๊ธฐ๋ฅ์ ์์๋ณด์ฃ !
DNAT ๊ณผ SNAT ๊ทธ๋ฆฌ๊ณ MASQUERADE
iptables ์ ํต์ฌ ๊ธฐ๋ฅ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
DNAT ๊ณผ SNAT ์ ์ดํดํ๊ธฐ ์ํด์ ์ฐ์ NAT ์ด๋ผ๋ ๊ฐ๋ ์ ์์์ผ ํฉ๋๋ค.
NAT ์ Network Address Translation ์ ์ฝ์๋ก ์ด๋ฆ ๊ทธ๋๋ก Network ์ฃผ์๋ฅผ ๋ณํํ๋ ๊ธฐ์ ์ ๋งํฉ๋๋ค.
NAT ์ ๊ดํ ๊ธ์ ์๋๋ ์์ธํ ๊ฑด ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์ !
DNAT ์ D ๋ Destination, SNAT ์ S ๋ Source ๋ฅผ ์๋ฏธํ๋ฉฐ DNAT ์ Destination ์ ์ฃผ์๋ฅผ ๋ณํํ๊ณ , SNAT ์ Source ์ ์ฃผ์๋ฅผ ๋ณํํฉ๋๋ค.
DNAT ์ ํญ์ PREROUTING ์ฒด์ธ ๊ท์น์ ์ฌ์ฉํด์ผํ๋ฉฐ, SNAT ์ ํญ์ POSTROUTING ์ฒด์ธ ๊ท์น์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ผ ์ด์ MASQUERADE ์ ๋ํด ์์๋ณด์ฃ !
MASQUERADE ๋ SNAT ์ ์ผ์ข ์ด๋ฉฐ SNAT ๊ณผ ๋ค๋ฅด๊ฒ ๋์ ์ผ๋ก ์์ค IP ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ค๋๋ค.
๋๋ฌธ์ ๋ณดํต SNAT ๋ณด๋จ MASQUERADE ๋ฅผ ํตํด์ ๊ท์น์ ์ง์ ํ๋๊ฒ ํธ๋ฆฌํฉ๋๋ค.
์ด์ ์ดํด๊ฐ ์์๋์ ๋ค๊ตฌ์?
๊ทธ๋ผ ์์ ๋ฅผ ํตํด ํ๋ฒ ์์๋ณด์ฃ !
์ฌํ ์์ - iptables ์ ์ด์ฉํ์ฌ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ๋ง๋ค์ด๋ณด์!
iptables ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ทธ๋ผ ๋ฐ๋ก ๊ฐ๋ณด์ฃ ! ๐ค
๊ธฐ๋ฅ์ ์์ฃผ ๊ฐ๋จํฉ๋๋ค. Load Balancer ์ 3000 ํฌํธ๋ก ์ ๊ทผํ๋ฉด Server A ๋ก ๊ฐ๊ณ , 3010 ํฌํธ๋ก ์ ๊ทผํ๋ฉด Server B ๋ก ๊ฐ๋๋ค.
๊ทธ๋ผ ์ฐ์ Server A ์ Server B ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ฌด์จ ์๋ต์ด ์ค๋์ง ํ์ธํด๋ณด์ฃ .
๋ ๋ค ok ๊ฐ ์๋ต์ผ๋ก ์ค๋ ์์ฃผ ๊ฐ๋จํ ์๋ฒ์ ๋๋ค.
๊ทธ๋ผ ์ด์ ์ง์ Server A ์ Server B ์ ์์ฒญํ๋ ๊ฒ์ด ์๋ Load Balancer ๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ด๋ณด์ฃ !
๊ทธ ์ ์ ์ฐ์ Route ๊ธฐ๋ฅ์ ํ์ฑํํด์ค๋๋ค.
echo "1" > /proc/sys/net/ipv4/ip_forward
์ดํ ๋ค์๊ณผ ๊ฐ์ด Load Balancer ์ฉ๋์ Host ์ ์ถ๊ฐํฉ๋๋ค.
$ iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 54.180.126.167:9090
# 3000 ์ผ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ 54.180.126.167:9090 ๋ก ๋๊ฐ
$ iptables -t nat -A PREROUTING -p tcp --dport 3010 -j DNAT --to-destination 54.180.126.167:4040
# 3010 ์ผ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ 54.180.126.167:4040 ๋ก ๋๊ฐ
$ iptables -t nat -A POSTROUTING -j MASQUERADE
# Host ๋ฅผ ๋๊ฐ ๋ Source IP ๋ํ MASQUERADE ๋ก ์๋์ผ๋ก ๋ณํํจ
๋ชจ๋ ์ค๋น๋ ๋๋ฌ์ต๋๋ค. ๊ทธ๋ผ ํ๋ฒ Load Balancer ์ ์ ๊ทผํด๋ณด์ฃ ๐
์ฑ๊ณต์ ์ ๋๋ค!
์ฌ์ค Load Balancer ๋ผ๊ณ ํ๊ธฐ์ ๊ธฐ๋ฅ์ด ๋ง์ด ๋ถ์กฑํ์ง๋ง ์ข ์๋ณด๋ฉด ์ถฉ๋ถํ ๋ง๋ค ์ ์์๊ฑฐ ๊ฐ์ต๋๋ค.
์ง๊ธ๊น์ง ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
'๊ฒํฅ๊ธฐ ์๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฒํฅ๊ธฐ ์๋ฆฌ์ฆ] ๋ deploy ๋ง ์ ๊ฒฝ์จ, ์ํฌ๋ฆฟ์ ๋ด๊ฐ ๊ด๋ฆฌํ ๊ฒ! - Vault ํธ (0) | 2023.08.04 |
---|---|
[๊ฒํฅ๊ธฐ ์๋ฆฌ์ฆ] k8s์ ๋ฆฌ์์ค๋ฅผ ์ํด ์น์ผ์ค - Helm ํธ (0) | 2022.12.21 |