IPTABLES

๊ฐœ์š”

iptables ๋ช…๋ น์–ด๋กœ ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„ IN/OUT ํŒจํ‚ท์„ ํ•„ํ„ฐ๋ง ํ•˜๊ฑฐ๋‚˜ NAT ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.ํŠน์ • ์กฐ๊ฑด์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ํŒจํ‚ท ํ•„ํ„ฐ๋ง๊ณผ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ง€์› ์ˆœ์ฐจ์  ์‹คํ–‰์œผ๋กœ ์ •์ฑ… Top-Down ๋ฐฉ์‹์œผ๋กœ ์ •์ฑ…์ด ์œ ํšจํ•˜๋‹ค.์„ค์ • ํŒŒ์ผ ์œ„์น˜ : /etc/sysconfig/iptables

iptables ์„œ๋น„์Šค ์„ค์น˜

RHEL/CentOS 7๋ถ€ํ„ฐ๋Š” ๋ฐฉํ™”๋ฒฝ์„ firewalld ๋ผ๋Š” ๋ฐ๋ชฌ์œผ๋กœ ๊ต์ฒดํ–ˆ๊ณ  ํ”„๋กœ๊ทธ๋žจ์€ iptables ๋ช…๋ น์–ด ๋Œ€์‹  CLI์—์„œ๋Š” firewall-cmd, GUI์—์„œ๋Š” firewall-config๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

1. firewalld ์„œ๋น„์Šค ์ค‘๋‹จ ํ›„ mask
$ systemctl stop firewalld

$ systemctl status firewalld

$ systemctl mask firewalld

2. iptables ์„ค์น˜ ํ›„ ์‹คํ–‰
$ yum install -y iptables-services

$ systemctl start iptables

$ systemctl enable iptables

iptables ๋ฐ๋ชฌ ์ œ์–ด ๋ช…๋ น์–ด

1. ์‹คํ–‰/์ค‘์ง€/์žฌ์‹œ์ž‘/์ƒํƒœํ™•์ธ
$ systemctl start iptables
$ systemctl stop iptables
$ systemctl restart iptables
$ systemctl status iptables

2. ์ •์ฑ… ์ €์žฅ 
$ service iptables save

์‚ฌ์šฉ๋ฒ•

iptables [-t table] [action] [chain] [matches] -j [target]

table

  • filter - iptables์˜ ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”๋กœ ํŒจํ‚ท ํ•„ํ„ฐ๋ง

  • nat - IP ์ฃผ์†Œ ๋ณ€ํ™˜

  • mangle - ํŒจํ‚ท ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํŠน์ˆ˜ ๊ทœ์น™์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ToS ์„ค์ • raw - netfilter์˜ ์—ฐ๊ฒฐ ์ถ”์  ํ•˜์œ„ ์‹œ์Šคํ…œ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ทœ์น™์„ ์„ค์ •

$ iptables -t nat -nvL # nat ํ…Œ์ด๋ธ” ํ™•์ธ

Chain PREROUTING (policy ACCEPT 2450 packets, 193K bytes)
 pkts bytes target     prot opt in     out     source               destination
 1190 61896 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 1508 packets, 105K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 22608 packets, 2234K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 22608 packets, 2234K bytes)
 pkts bytes target     prot opt in     out     source               destination
   16  1054 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0

๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ filter

action

  • -A (--append) : ์ƒˆ๋กœ์šด ์ •์ฑ…์„ ์ถ”๊ฐ€

  • -I (--insert) : ์œ„์น˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์ •์ฑ…์„ ์‚ฝ์ž… # iptables -I INPUT 2 (2ํ–‰์— ์ถ”๊ฐ€)

  • -D (--delete) : ์ •์ฑ…์„ ์‚ญ์ œ

  • -R (--replace) : ์ •์ฑ…์„ ๊ต์ฒด

  • -F (--flush) : ์ฒด์ธ์œผ๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ์ •์ฑ… ์‚ญ์ œ

  • -P (--policy) : ๊ธฐ๋ณธ ์ •์ฑ…์„ ์„ค์ •

  • -L (--list) : ์ •์ฑ… ๋ชฉ๋ก์„ ํ™•์ธ

chain

  • INPUT - ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์€ INPUT ์ฒด์ธ์„ ํ†ต๊ณผ

  • OUTPUT - ์„œ๋ฒ„์—์„œ ๋‚˜๊ฐ€๋Š” ํŒจํ‚ท์€ OUTPUT ์ฒด์ธ์„ ํ†ต๊ณผ

  • FORWARD - ์„œ๋ฒ„๊ฐ€ ๋ชฉ์ ์ง€๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ํŒจํ‚ท์€ FORWARD ์ฒด์ธ์„ ํ†ต๊ณผ

match

๋งค์น˜ ์˜ต์…˜์„ ํ†ตํ•ด์„œ ์„ธ๋ถ€์ ์ธ ํŒจํ‚ท์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

  • -s (--source, --src) : ์ถœ๋ฐœ์ง€, ๋„๋ฉ”์ธ or ip or ๋„ท๋งˆ์Šคํฌ ๊ฐ’

  • --sport : ์ถœ๋ฐœ์ง€ ํฌํŠธ

  • -d (--destination, --dst) : ๋ชฉ์ ์ง€ , ๋„๋ฉ”์ธ or, ip or ๋„ท๋งˆ์Šคํฌ ๊ฐ’

  • --dport : ๋ชฉ์ ์ง€ ํฌํŠธ -p : ํ”„๋กœํ† ์ฝœ TCP, UDP, ICMP์™€ ๊ฐ™์€ IP ํ”„๋กœํ† ์ฝœ

  • -i (--in-interface) : ์ž…๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค

  • -o (--out-interface) : ์ถœ๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค

  • -m (--match) : ํŠน์ • ๋ชจ๋“ˆ ์‚ฌ์šฉ (๋ณดํ†ต state ๋ชจ๋“ˆ ์‚ฌ์šฉ)

  • --state : ์—ฐ๊ฒฐ ์ƒํƒœ (NEW, ESTABLISHED, RELATED, INVALID)

  • --line : ์ค„๋ฒˆํ˜ธ ์ถœ๋ ฅ -j (--jump) : ๊ทœ์น™์— ๋งž๋Š” ํŒจํ‚ท์˜ ํ–‰๋™

target

์กฐ๊ฑด์— ๋งค์นญ๋˜๋Š” ํŒจํ‚ท์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„

  • ACCEPT : ๋งค์นญ๋˜๋Š” ํŒจํ‚ท ํ—ˆ์šฉ

  • DROP : ๋งค์นญ๋˜๋Š” ํŒจํ‚ท ๊ฑฐ๋ถ€

  • LOG : ๋งค์นญ๋˜๋Š” ํŒจํ‚ท ๋กœ๊ทธ ์ €์žฅ

  • REJECT : ๋งค์นญ๋˜๋Š” ํŒจํ‚ท ๊ฑฐ๋ถ€ (TCP-RST, UDP-ICMP Port Unreachable)

  • RETURN : ์ฒด์ธ ๋‚ด์—์„œ ํŒจํ‚ท ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์†ํ•จ (์žฌ๊ท€)

๋ฐฑ์—…, ๋ณต์›

๊ทœ์น™ ์ €์žฅ
$ iptables-save > /root/firewall.rules

๊ทœ์น™ ๋ณต์›
$ iptables-restore < /root/firewall.rules

์—ฐ๊ฒฐ ์ถ”์ (Connection Tracking)

iptables๋Š” ์—ฐ๊ฒฐ ์ถ”์ (Connection Tracking)์ด๋ผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ์ƒ ์„œ๋น„์Šค ์—ฐ๊ฒฐ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ๊ทธ ์—ฐ๊ฒฐ์„ ๊ฐ์‹œํ•˜๊ณ  ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์—ฐ๊ฒฐ ์ถ”์  ๋ฐฉ์‹์€ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ‘œ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ๊ฒฐ ์ƒํƒœ์—์„œ ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ฒฐ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • NEW - ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๋Š” ํŒจํ‚ท

  • ESTABLISHED - ๊ธฐ์กด ์—ฐ๊ฒฐ์˜ ์ผ๋ถ€์ธ ํŒจํ‚ท

  • RELATED - ๊ธฐ์กด ์—ฐ๊ฒฐ์— ์†ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๋Š” ํŒจํ‚ท

  • INVALID - ์—ฐ๊ฒฐ ์ถ”์ ํ‘œ์—์„œ ์–ด๋”” ์—ฐ๊ฒฐ์—๋„ ์†ํ•˜์ง€ ์•Š์€ ํŒจํ‚ท

์ƒํƒœ์— ๊ธฐ๋ฐ˜(Stateful)ํ•œ iptables ์—ฐ๊ฒฐ ์ถ”์  ๊ธฐ๋Šฅ์€ ์–ด๋А ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์—์„œ๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, UDP์™€ ๊ฐ™์ด ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”(Stateless) ํ”„๋กœํ† ์ฝœ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

$ iptables -I INPUT 1 -t tcp --dport 22 -j ACCEPT
$ iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT

์œ„ ์˜ˆ์ œ์™€ ๊ฐ™์ด INPUT์—์„œ SSH ํ—ˆ์šฉ ํ›„ OUTPUT์—์„œ ESTABLISHED๋ฅผ ํ—ˆ์šฉํ•ด์ฃผ๋ฉด

OUTPUT์—์„œ ๋‹ค๋ฅธ ์ •์ฑ… ์ถ”๊ฐ€ ์—†์ด Client๋Š” SSH ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ์ œ

์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” TCP 22(SSH) ACCEPT ์ •์ฑ…์„ 1ํ–‰์— ์ถ”๊ฐ€
$ iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT 

์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” UDP 53(DNS) DROP ์ •์ฑ…์„ 1ํ–‰์— ์ถ”๊ฐ€
$ iptables -I INPUT 1 -p udp --dport 53 -j DROP 

์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ์ƒˆ๋กœ์šด ํ†ต์‹ ์ด SYN ํŒจํ‚ท์ด ์•„๋‹Œ ๊ฒฝ์šฐ DROP ์ •์ฑ…์„ 1ํ–‰์— ์ถ”๊ฐ€
$ iptables -I INPUT 1 -p tcp ! --syn -m state --state NEW -j DROP

์„œ๋ฒ„์—์„œ ๋‚˜๊ฐ€๋Š” ์ƒˆ๋กœ์šด ํ†ต์‹ ์„ ACCEPT ์ •์ฑ…์„ 1ํ–‰์— ์ถ”๊ฐ€
$ iptables -I OUTPUT 1 -m state --state NEW -j ACCEPT 

์กฐ๊ฐ๋‚œ ํŒจํ‚ท ์ฐจ๋‹จ
$ iptables -A INPUT -f -j DROP

Last updated