XNUMX๋
์ ๊ฐ๋ฐ ๋์
์ปค๋ ์์ค์ ํจํท์์ ๋ฐ์ดํฐ ์ถ์ถ, ๋ฐ์ดํฐ ์์
์ํ ๋ฐ ํ๋ฆ ์ ์ด๋ฅผ ์ํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ผ๋ฐ์ ์ธ ํ๋กํ ์ฝ ๋
๋ฆฝ์ ์ธ ์ธํฐํ์ด์ค๋ง ์ ๊ณตํฉ๋๋ค.
ํํฐ๋ง ๋ก์ง ์์ฒด์ ํ๋กํ ์ฝ๋ณ ํธ๋ค๋ฌ๋ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ๋ ํ ์ด ๋ฐ์ดํธ์ฝ๋๊ฐ Netlink ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋์ ๋ก๋๋๊ณ BPF(Berkeley Packet Filters)๋ฅผ ์ฐ์์ํค๋ ํน์ ๊ฐ์ ๋จธ์ ์์ ์คํ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ปค๋ ์์ค์์ ์คํ๋๋ ํํฐ๋ง ์ฝ๋์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ํ๋กํ ์ฝ ์์
์ ์ํ ๊ตฌ๋ฌธ ๋ถ์ ๊ท์น ๋ฐ ๋
ผ๋ฆฌ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์ฃผ์ ํ์ :
- IPsec ์ง์์ผ๋ก ํจํท, IPsec ์์ฒญ ID ๋ฐ SPI(Security Parameter Index) ํ๊ทธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฐ๋ ์ฃผ์๋ฅผ ์ผ์น์ํฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
... ip saddr 192.168.1.0/24์ ipsec
... spi 1-65536์ ipsec๊ฒฝ๋ก๊ฐ IPsec ํฐ๋์ ํต๊ณผํ๋์ง ํ์ธํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด IPSec๋ฅผ ํตํ์ง ์๊ณ ํธ๋ํฝ์ ์ฐจ๋จํ๋ ค๋ฉด ๋ค์์ ์ํํ์ธ์.
... ํํฐ ์ถ๋ ฅ rt ipsec ๋๋ฝ ๋๋ฝ
- IGMP(์ธํฐ๋ท ๊ทธ๋ฃน ๊ด๋ฆฌ ํ๋กํ ์ฝ) ์ง์. ์๋ฅผ ๋ค์ด ๊ท์น์ ์ฌ์ฉํ์ฌ ์์ IGMP ๊ทธ๋ฃน ๋ฉค๋ฒ์ญ ์์ฒญ์ ์ญ์ ํ ์ ์์ต๋๋ค.
nft ์ถ๊ฐ ๊ท์น netdev foo bar igmp ์ ํ ๋ฉค๋ฒ์ญ ์ฟผ๋ฆฌ ์นด์ดํฐ ๋๋กญ
- ์ ํ ์ฒด์ธ(jump / goto)์ ์ ์ํ๊ธฐ ์ํด ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ. ์๋ฅผ ๋ค์ด:
dest = ber๋ฅผ ์ ์ํ๋ค
๊ท์น ip foo bar ์ ํ $dest ์ถ๊ฐ - ํค๋์ TTL ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ด์ ์ฒด์ (OS Fingerprint)๋ฅผ ์๋ณํ๋ ๋ง์คํฌ๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณด๋ธ ์ฌ๋ OS๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํจํท์ ํ์ํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
... ๋ฉํ ๋งํฌ ์ธํธ osf ttl ์ด๋ฆ ๊ฑด๋๋ฐ๊ธฐ map { "Linux" : 0x1,
"์๋์ฐ": 0x2,
"๋งฅOS": 0x3,
"์ ์ ์์": 0x0 }
... osf ttl ๊ฑด๋๋ฐ๊ธฐ ๋ฒ์ "Linux:4.20" - ๋ฐ์ ์์ ARP ์ฃผ์์ ๋์ ์์คํ
์ IPv4 ์ฃผ์๋ฅผ ์ผ์น์ํค๋ ๊ธฐ๋ฅ. ์๋ฅผ ๋ค์ด ์ฃผ์ 192.168.2.1์์ ์ ์ก๋ ARP ํจํท์ ์นด์ดํฐ๋ฅผ ๋๋ฆฌ๋ ค๋ฉด ๋ค์ ๊ท์น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ ์ด๋ธ arp x {
์ฒด์ธ y {
์ ํ ํํฐ ํํฌ ์ ๋ ฅ ์ฐ์ ์์ ํํฐ; ์ ์ฑ ๋์;
arp saddr ip 192.168.2.1 ์นด์ดํฐ ํจํท 1๋ฐ์ดํธ 46
}
} - ํ๋ก์(tproxy)๋ฅผ ํตํ ํฌ๋ช
ํ ์์ฒญ ์ ๋ฌ ์ง์. ์๋ฅผ ๋ค์ด ํฌํธ 80์ ๋ํ ํธ์ถ์ ํ๋ก์ ํฌํธ 8080์ผ๋ก ๋ฆฌ๋๋ ์
ํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
ํ ์ด๋ธ IP x {
์ฒด์ธ y {
์ ํ ํํฐ ํํฌ ์ฌ์ ๋ผ์ฐํ ์ฐ์ ์์ -150; ์ ์ฑ ๋์;
tcp dport 80 tproxy ~ :8080
}
} - SO_MARK ๋ชจ๋์์ setockopt()๋ฅผ ํตํด ์ธํธ ๋งํฌ๋ฅผ ์ถ๊ฐ๋ก ์ป์ ์ ์๋ ๊ธฐ๋ฅ์ผ๋ก ์์ผ ํ์๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
ํ ์ด๋ธ inet x {
์ฒด์ธ y {
์ ํ ํํฐ ํํฌ ์ฌ์ ๋ผ์ฐํ ์ฐ์ ์์ -150; ์ ์ฑ ๋์;
tcp dport 8080 ๋งํฌ ์ธํธ ์์ผ ๋งํฌ
}
} - ์ฒด์ธ์ ์ฐ์ ์์ ํ
์คํธ ์ด๋ฆ ์ง์ ์ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
nft add chain ip x raw { ์ ํ ํํฐ ํํฌ ์ฌ์ ๋ผ์ฐํ ์ฐ์ ์์ raw; }
nft add chain ip x filter { ์ ํ ํํฐ ํํฌ ์ฌ์ ๋ผ์ฐํ ์ฐ์ ์์ ํํฐ; }
nft add chain ip x filter_later { ์ ํ ํํฐ ํํฌ ์ฌ์ ๋ผ์ฐํ ์ฐ์ ์์ ํํฐ + 10; } - SELinux ํ๊ทธ(Secmark)๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด SELinux ์ปจํ
์คํธ์์ "sshtag" ํ๊ทธ๋ฅผ ์ ์ํ๋ ค๋ฉด ๋ค์์ ์คํํ ์ ์์ต๋๋ค.
nft๋ secmark inet ํํฐ sshtag "system_u:object_r:ssh_server_packet_t:s0"์ ์ถ๊ฐํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ท์น์์ ์ด ๋ผ๋ฒจ์ ์ฌ์ฉํฉ๋๋ค.
nft ์ถ๊ฐ ๊ท์น inet ํํฐ ์ ๋ ฅ tcp dport 22 ๋ฉํ secmark ์ธํธ "sshtag"
nft add map inet filter secmapping { type inet_service : secmark; }
nft ์ถ๊ฐ ์์ inet ํํฐ secmapping { 22 : "sshtag" }
nft ์ถ๊ฐ ๊ท์น inet ํํฐ ์ ๋ ฅ ๋ฉํ secmark ์ธํธ tcp dport ๋งต @secmapping - /etc/services ํ์ผ์ ์ ์๋ ๋๋ก ํ๋กํ ์ฝ์ ํ ๋น๋ ํฌํธ๋ฅผ ํ
์คํธ ํ์์ผ๋ก ์ง์ ํ๋ ๊ธฐ๋ฅ. ์๋ฅผ ๋ค์ด:
nft ์ถ๊ฐ ๊ท์น xy tcp dport "ssh"
nft ๋ชฉ๋ก ๊ท์น ์ธํธ -l
ํ ์ด๋ธ x {
์ฒด์ธ y {
...
TCP dport "ssh"
}
} - ๋คํธ์ํฌ ์ธํฐํ์ด์ค ์ ํ์ ํ์ธํ๋ ๊ธฐ๋ฅ. ์๋ฅผ ๋ค์ด:
๊ท์น inet raw ์ฌ์ ๋ผ์ฐํ ๋ฉํ iifkind "vrf" ํ์ฉ ์ถ๊ฐ
- "๋์ " ํ๋๊ทธ๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ฌ ์ธํธ ๋ด์ฉ์ ๋์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ ์ง์์ด ํฅ์๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ธํธ "s"๋ฅผ ์
๋ฐ์ดํธํ์ฌ ์์ค ์ฃผ์๋ฅผ ์ถ๊ฐํ๊ณ 30์ด ๋์ ํจํท์ด ์๋ ๊ฒฝ์ฐ ํญ๋ชฉ์ ์ฌ์ค์ ํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
ํ ์ด๋ธ x ์ถ๊ฐ
์ธํธ xs ์ถ๊ฐ { ipv4_addr ์ ๋ ฅ; ์ฌ์ด์ฆ 128; ์๊ฐ ์ด๊ณผ 30์ด; ๋์ ํ๋๊ทธ; }
์ฒด์ธ ์ถ๊ฐ xy { ์ ํ ํํฐ ํํฌ ์ ๋ ฅ ์ฐ์ ์์ 0; }
๊ท์น xy ์ ๋ฐ์ดํธ @s { ip saddr } ์ถ๊ฐ - ๋ณ๋์ ์๊ฐ ์ด๊ณผ ์กฐ๊ฑด์ ์ค์ ํ๋ ๊ธฐ๋ฅ. ์๋ฅผ ๋ค์ด ํฌํธ 8888์ ๋์ฐฉํ๋ ํจํท์ ๊ธฐ๋ณธ ์๊ฐ ์ ํ์ ์ฌ์ ์ํ๋ ค๋ฉด ๋ค์์ ์ง์ ํ ์ ์์ต๋๋ค.
ํ ์ด๋ธ IP ํํฐ {
ct ์๊ฐ ์ด๊ณผ ๊ณต๊ฒฉ์ -tcp {
ํ๋กํ ์ฝ TCP;
l3ํ๋กํ IP;
์ ์ฑ = {์ค๋ฆฝ: 100, close_wait: 4, ๋ง๊ฐ: 4}
}
์ฒด์ธ ์ถ๋ ฅ {
...
tcp dport 8888 ct ์๊ฐ ์ด๊ณผ ์ค์ "aggressive-tcp"
}
} - inet ๊ณ์ด์ ๋ํ NAT ์ง์:
ํ ์ด๋ธ inet nat {
...
IP6 ์๋น ์ฌ๋ง::2::1 dnat์์ ์ฌ๋ง:2::99
} - ํฅ์๋ ์คํ ์ค๋ฅ ๋ณด๊ณ :
nft ์ถ๊ฐ ์ฒด์ธ ํํฐ ํ ์คํธ
์ค๋ฅ: ํด๋น ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ฐ์กฑ IP์ "ํํฐ" ํ ์ด๋ธ์ ์๋ฏธํฉ๋๊น?
์ฒด์ธ ํํฐ ํ ์คํธ ์ถ๊ฐ
^^^^^^ - ์ธํธ๋ก ์ธํฐํ์ด์ค ์ด๋ฆ์ ์ง์ ํ๋ ๊ธฐ๋ฅ:
์ค์ sc {
inet_service ๋ฅผ ์ ๋ ฅํ์ธ์. ifname
์์ = { "ssh" . "eth0" }
} - ์
๋ฐ์ดํธ๋ ํ๋ฆ ํ
์ด๋ธ ๊ท์น ๊ตฌ๋ฌธ:
nft ํ ์ด๋ธ ์ถ๊ฐ x
nft add flowtable x ft { ํํฌ ์์ ์ฐ์ ์์ 0; ์ฅ์น = {eth0, wlan0 }; }
...
nft ์ถ๊ฐ ๊ท์น x ์ ๋ฌ IP ํ๋กํ ์ฝ { tcp, udp } ํ๋ฆ ์ถ๊ฐ @ft - JSON ์ง์์ด ํฅ์๋์์ต๋๋ค.
์ถ์ฒ : opennet.ru