nftables ํŒจํ‚ท ํ•„ํ„ฐ 0.9.1 ๋ฆด๋ฆฌ์Šค

XNUMX๋…„์˜ ๊ฐœ๋ฐœ ๋์— ์ œ์‹œ๋œ ํŒจํ‚ท ํ•„ํ„ฐ ๋ฆด๋ฆฌ์Šค nftables 0.9.1, IPv6, IPv4, ARP ๋ฐ ๋„คํŠธ์›Œํฌ ๋ธŒ๋ฆฌ์ง€์— ๋Œ€ํ•œ ํŒจํ‚ท ํ•„ํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ iptables, ip6table, arptables ๋ฐ ebtables๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. nftables ํŒจํ‚ค์ง€์—๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋˜๋Š” ํŒจํ‚ท ํ•„ํ„ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ปค๋„ ์ˆ˜์ค€ ์ž‘์—…์€ ๋ฆด๋ฆฌ์Šค 3.13๋ถ€ํ„ฐ Linux ์ปค๋„์˜ ์ผ๋ถ€์˜€๋˜ nf_tables ํ•˜์œ„ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์ปค๋„ ์ˆ˜์ค€์€ ํŒจํ‚ท์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ, ๋ฐ์ดํ„ฐ ์ž‘์—… ์ˆ˜ํ–‰ ๋ฐ ํ๋ฆ„ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ”„๋กœํ† ์ฝœ ๋…๋ฆฝ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ํ•„ํ„ฐ๋ง ๋กœ์ง ์ž์ฒด์™€ ํ”„๋กœํ† ์ฝœ๋ณ„ ํ•ธ๋“ค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋œ ํ›„ ์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ 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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€