[Linux] 서버 공격 방어를 위한 iptables 방화벽 설정
윈도우에서는 윈도우 자체 내장 방화벽에서는 도스 공격 방어라던지 네트워크 감지 등 특별한 기능들이 없어 해당 방화벽에 대해서는 별로 좋지 못한 모습을 보여주고 있습니다만(그래서 보통 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
'Info/Tips > Server' 카테고리의 다른 글
| [SRCDS] Temporary Entity 속성 정보 확인 방법 (0) | 2015.01.22 |
|---|---|
| [SRCDS] 서버 콘솔 명령어 찾기, 플러그인 핸들 누수 확인 (0) | 2015.01.22 |
| [Linux] Apache, MySQL, PHP 설치하기 (웹 서버 설치) (0) | 2015.01.22 |
| [SRCDS] 보이스 여러 명 겹칠 시 렉 걸림 방지법 (0) | 2015.01.22 |
| [SRCDS] RCON 포트 네트워크에서 막기, VAC 포트 정보 (0) | 2015.01.22 |