์ปค๋ ์์ค์์๋ ํจํท์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ๋ฐ์ดํฐ์ ๋ํ ์์ ์ ์ํํ๋ฉฐ ํ๋ฆ์ ์ ์ดํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ผ๋ฐ ํ๋กํ ์ฝ ๋ ๋ฆฝ์ ์ธํฐํ์ด์ค๋ง ์ ๊ณต๋ฉ๋๋ค. ํํฐ๋ง ๊ท์น ์์ฒด์ ํ๋กํ ์ฝ๋ณ ํธ๋ค๋ฌ๋ ์ฌ์ฉ์ ๊ณต๊ฐ ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ๋ ํ ์ด ๋ฐ์ดํธ์ฝ๋๊ฐ Netlink ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋์ ๋ก๋๋๊ณ BPF(Berkeley Packet Filters)์ ์ ์ฌํ ํน์ ๊ฐ์ ๋จธ์ ์ ์ปค๋์์ ์คํ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ปค๋ ์์ค์์ ์คํ๋๋ ํํฐ๋ง ์ฝ๋์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ๊ตฌ๋ฌธ ๋ถ์ ๊ท์น์ ๋ชจ๋ ๊ธฐ๋ฅ๊ณผ ํ๋กํ ์ฝ ์์ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์ฃผ์ ํ์ :
- ์ธํธ ์์์ ๊ด๋ จ๋ ํจํท ๋ฐ ํธ๋ํฝ ์นด์ดํฐ์ ๋ํ ์ง์์ด ์ธํธ์ ์ถ๊ฐ๋์์ต๋๋ค. ์นด์ดํฐ๋ "counter" ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฑํ๋ฉ๋๋ค.
ํ ์ด๋ธ IP x {
์ธํธ y {
์ ํ์ ip saddr
์นด์ดํฐ
์์ = {192.168.10.35, 192.168.10.101, 192.168.10.135}
}์ฒด์ธ z {
์ ํ ํํฐ ํํฌ ์ถ๋ ฅ ์ฐ์ ์์ ํํฐ; ์ ์ฑ ๋์;
IP ์๋น @y
}
} - ์๋ฅผ ๋ค์ด, ์ฌ์์ ํ ์ด์ ์นด์ดํฐ๋ฅผ ๋ณต์ํ๊ธฐ ์ํด ์นด์ดํฐ์ ์ด๊ธฐ ๊ฐ์ ์ค์ ํ๋ ค๋ฉด "nft -f" ๋ช
๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# ๊ณ ์์ด ๊ท์น ์ธํธ.nft
ํ ์ด๋ธ IP x {
์ธํธ y {
์ ํ์ ip saddr
์นด์ดํฐ
์์ = { 192.168.10.35 ์นด์ดํฐ ํจํท 1๋ฐ์ดํธ 84, 192.168.10.101 \
์นด์ดํฐ p 192.168.10.135 ์นด์ดํฐ ํจํท 0๋ฐ์ดํธ 0 }
}์ฒด์ธ z {
์ ํ ํํฐ ํํฌ ์ถ๋ ฅ ์ฐ์ ์์ ํํฐ; ์ ์ฑ ๋์;
IP ์๋น @y
}
}
# nft -f ๊ท์น ์ธํธ.nft
#nft ๋ชฉ๋ก ๊ท์น ์ธํธ
ํ ์ด๋ธ IP x {
์ธํธ y {
์ ํ์ ip saddr
์นด์ดํฐ
์์ = { 192.168.10.35 ์นด์ดํฐ ํจํท 1๋ฐ์ดํธ 84, 192.168.10.101 \
์นด์ดํฐ p 192.168.10.135 ์นด์ดํฐ ํจํท 0๋ฐ์ดํธ 0 }
}์ฒด์ธ z {
์ ํ ํํฐ ํํฌ ์ถ๋ ฅ ์ฐ์ ์์ ํํฐ; ์ ์ฑ ๋์;
IP ์๋น @y
}
} - ์นด์ดํฐ ์ง์๋ flowtable์ ์ถ๊ฐ๋์์ต๋๋ค.
ํ ์ด๋ธ IP ํธ {
ํ๋ก์ฐํ ์ด๋ธ ๋ฐ {
ํํฌ ์์ ์ฐ์ ์์ -100
์ฅ์น = { eth0, eth1 }
์นด์ดํฐ
}์ฒด์ธ ํฌ์๋ {
์ ํ ํํฐ ํํฌ ์๋ฐฉํฅ ์ฐ์ ์์ ํํฐ;
ํ๋ฆ ์ถ๊ฐ @bar ์นด์ดํฐ
}
}"conntrack -L" ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์นด์ดํฐ ๋ชฉ๋ก์ ๋ณผ ์ ์์ต๋๋ค.
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 ํจํท=9๋ฐ์ดํธ=608 \
src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
secctx=null ์ฌ์ฉ=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
ํจํท=1005763๋ฐ์ดํธ=44075714753 src=10.0.1.2 dst=10.0.1.1 ์คํฌ์ธ =5201 dport=47280 \
ํจํท=967505๋ฐ์ดํธ=50310268 [OFFLOAD] ํ์=0 secctx=null ์ฌ์ฉ=2 - ์ฐ๊ฒฐ ์ธํธ(์ฐ๊ฒฐ, ๋น๊ต๋ฅผ ๋จ์ํํ๋ ํน์ ์ฃผ์ ๋ฐ ํฌํธ ๋ฒ๋ค)์์๋ ์ธํธ ์์์ ๊ตฌ์ฑ ๋ถ๋ถ์ ๋ํ ์์์ ๋ฐ์ดํฐ ์ ํ์ ๊ฒฐ์ ํ๋ "typeof" ์ง์์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ ์ด๋ธ IP ํธ {
ํ์ดํธ๋ฆฌ์คํธ ์ค์ {
์ ํ์ ip saddr์ ๋๋ค. TCP ํฌํธ
์์ = { 192.168.10.35 . 80, 192.168.10.101. 80}
}์ฒด์ธ ๋ฐ {
์ ํ ํํฐ ํํฌ ์ฌ์ ๋ผ์ฐํ ์ฐ์ ์์ ํํฐ; ์ ์ฑ ์ญ์ ;
IP ์๋น . tcp dport @whitelist ์๋ฝ
}
} - typeof ์ง์๋ฌธ์ ์ด์ ๋งต ๋ชฉ๋ก์ ์กฐ์ธ์๋ ์ ์ฉ๋ฉ๋๋ค.
ํ ์ด๋ธ IP ํธ {
์ง๋ addr2mark {
์ ํ์ ip saddr์ ๋๋ค. tcp dport : ๋ฉํ ๋งํฌ
์์ = { 192.168.10.35 . 80 : 0x00000001,
192.168.10.135. 80 : 0x00000002 }
}์ฒด์ธ ๋ฐ {
์ ํ ํํฐ ํํฌ ์ฌ์ ๋ผ์ฐํ ์ฐ์ ์์ ํํฐ; ์ ์ฑ ์ญ์ ;
๋ฉํ ๋งํฌ๋ ip Daddr๋ก ์ค์ ๋ฉ๋๋ค. tcp dport ๋งต @addr2mark ์๋ฝ
}
} - ์ต๋ช
(์ด๋ฆ ์์) ์งํฉ์ ๋ฒ์ ์กฐ์ธ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
# nft ์ถ๊ฐ ๊ท์น inet ํํฐ ์ ๋ ฅ ip Daddr. TCP ํฌํธ\
{ 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } ์๋ฝ - ๋คํธ์ํฌ ๋ธ๋ฆฌ์ง๋ฅผ ์ฒ๋ฆฌํ ๋ 802.1q(VLAN) ํ๋๊ทธ๊ฐ ์๋ ํจํท์ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ด ์ ๊ณต๋ฉ๋๋ค.
# nft ์ถ๊ฐ ๊ท์น ๋ธ๋ฆฌ์ง foo bar ์ํ ๋ฅด ์ ํ vlan ๊ฑฐ๋ถ(tcp ์ฌ์ค์ ํฌํจ)
- TCP ์ธ์
์๋ณ์(conntrack ID)๋ณ ์ผ์น์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. conntrack ID๋ฅผ ํ์ธํ๋ ค๋ฉด "--output id" ์ต์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# conntrack -L โ์ถ๋ ฅ ID
UDP 17 18 src=192.168.2.118 dst=192.168.2.1 ์คํฌ์ธ =36424 dport=53 ํจํท=2 \
bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
[๋ณด์ฆ๋จ] mark=0 ์ฌ์ฉ=1 id=2779986232# nft ์ถ๊ฐ ๊ท์น foo bar ct id 2779986232 ์นด์ดํฐ
์ถ์ฒ : opennet.ru