[Linux] 서버 공격 방어를 위한 iptables 방화벽 설정

Posted by subkarsei2
2014. 9. 20. 12:35 Info/Tips/Server

윈도우에서는 윈도우 자체 내장 방화벽에서는 도스 공격 방어라던지 네트워크 감지 등 특별한 기능들이 없어 해당 방화벽에 대해서는 별로 좋지 못한 모습을 보여주고 있습니다만(그래서 보통 Comodo 방화벽, Avast 방화벽 등을 사용합니다).


리눅스에서는 자체 내장 방화벽인 iptables 에서부터 여러가지 고급 기능들이 들어있어 별도의 프로그램을 설치하지 않아도 뛰어나고 강력한 기능을 사용할 수 있습니다(대신에 사용하기 좀 어렵습니다).


DOS 공격은 비싼 보안 장비를 설치하지 않는 이상 제대로 방어하기가 힘듭니다. 따라서, 보안 장비가 없는 상태에서 컴퓨터에서 DOS 공격을 막아내더라도, 그걸 처리하는 CPU의 과정 등도 있기 때문에 보안 장비를 설치하지 않는 상태에서는 완전한 방어를 기대하지 마시길 바랍니다.


아래 내용에서는 iptables 설정을 다룬 글이기 때문에 기타 방화벽 설정은 다루지 않았습니다.



# 루프백 허용


iptables -A INPUT -i lo -j ACCEPT






# 특정 IP 허용


# 참고: 원격으로 리눅스를 사용하고 있을 경우 관리자 아이피를 쓸 것을 권장합니다.


#iptables -A INPUT -s 주소 -j ACCEPT






# 특정 IP 차단


#iptables -A INPUT -s 주소 -j DROP






# 사설 IP 차단


# 참고: 아래 중에서 이용하고 있는 사설 IP 대역이 있다면 해당하는 IP 대역이 있는 행을 지워주세요. (+아래 IANA 참고)


iptables -A INPUT -s 10.0.0.0/8 -j DROP


iptables -A INPUT -s 172.16.0.0/16 -j DROP


iptables -A INPUT -s 192.168.0.0/16 -j DROP


iptables -A INPUT -s 224.0.0.0/4 -j DROP


iptables -A INPUT -s 240.0.0.0/5 -j DROP


iptables -A OUTPUT -d 10.0.0.0/8 -j DROP


iptables -A OUTPUT -d 172.16.0.0/16 -j DROP


iptables -A OUTPUT -d 192.168.0.0/16 -j DROP


iptables -A OUTPUT -d 224.0.0.0/4 -j DROP


iptables -A OUTPUT -d 240.0.0.0/5 -j DROP






# IANA 예약 IP 대역 차단


iptables -A INPUT -s 0.0.0.0/8 -j DROP


iptables -A INPUT -s 169.254.0.0/16 -j DROP


iptables -A INPUT -s 192.0.0.0/24 -j DROP


iptables -A INPUT -s 248.0.0.0/5 -j DROP


iptables -A OUTPUT -d 0.0.0.0/8 -j DROP


iptables -A OUTPUT -d 169.254.0.0/16 -j DROP


iptables -A OUTPUT -d 192.0.0.0/24 -j DROP


iptables -A OUTPUT -d 248.0.0.0/5 -j DROP






# 주요 서비스 허용 (HTTP, FTP, MySQL 등)


# 참고: 옵션 -m mport 로 간단하게 사용 가능합니다.


iptables -A INPUT -p tcp --dport 20 -j ACCEPT


iptables -A INPUT -p tcp --dport 21 -j ACCEPT


iptables -A INPUT -p tcp --dport 22 -j ACCEPT


iptables -A INPUT -p tcp --dport 53 -j ACCEPT


iptables -A INPUT -p tcp --dport 80 -j ACCEPT


iptables -A INPUT -p tcp --dport 443 -j ACCEPT


iptables -A INPUT -p tcp --dport 3306 -j ACCEPT


iptables -A INPUT -p udp --dport 22 -j ACCEPT


iptables -A INPUT -p udp --dport 53 -j ACCEPT


iptables -A INPUT -p udp --dport 443 -j ACCEPT






# 뒤따라오는 연결은 허용


# 참고: 이걸 안하게 되면 네트워크간 접속이 원활하지 않게 됩니다.


iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT






# TCP 연결 중 새로 들어오는 접속이 SYN 패킷이 아닌 것만을 허용


iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP






# 비정상인 tcp-flag는 차단


iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL PSH,FIN -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK,FIN -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,ACK,RST -j DROP


iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK,FIN,RST,PSH -j DROP


iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP


iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP


iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP


iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP






# 조각난 패킷은 아웃


iptables -A INPUT -f -j DROP






# 포트 스캔 방지


iptables -A INPUT -p icmp -j DROP






# 패킷량 제한 (tcp 만)


iptables -A INPUT -p tcp -m multiport --sport 20,21,22,53,80,443,3306 -m length --length 0:40 -j LOG --log-prefix "[LENGTH_0-40_-OpenTCP] "


iptables -A INPUT -p tcp -m multiport --sport 20,21,22,53,80,443,3306 -m length --length 0:40 -j DROP






# 접속량 제한 (초당 2회까지만)


iptables -A INPUT -p tcp -m state --state NEW -m hashlimit --hashlimit-mode srcip,dstport --hashlimit-name LimitConTCP --hashlimit 1/s --hashlimit-burst 2 -j LOG --log-prefix "[LimitConnect-TCP] "


iptables -A INPUT -p tcp -m state --state NEW -m hashlimit --hashlimit-mode srcip,dstport --hashlimit-name LimitConTCP --hashlimit 1/s --hashlimit-burst 2 -j ACCEPT


iptables -A INPUT -p udp -m state --state NEW -m hashlimit --hashlimit-mode srcip,dstport --hashlimit-name LimitConUDP --hashlimit 1/s --hashlimit-burst 2 -j LOG --log-prefix "[LimitConnect-UDP] "


iptables -A INPUT -p udp -m state --state NEW -m hashlimit --hashlimit-mode srcip,dstport --hashlimit-name LimitConUDP --hashlimit 1/s --hashlimit-burst 2 -j ACCEPT






# 룰 전체 기본 정책 설정


iptables -P INPUT DROP


iptables -P FORWARD DROP


iptables -P OUTPUT ACCEPT






# 나머지 반입은 모두 제거


iptables -A INPUT -j DROP