작은숲:위키노트/Iptables 설정
레드햇 계열의 리눅스를 사용한다면 /etc/sysconf/iptables 파일에 [[작은숲:위키노트/Iptables|Iptables] 정책을 저장해두면 서버가 부팅될 때마다 적용된다. 단 iptables 룰은 적용 순서가 상당히 중요하므로 이에 대해 어느 정도 숙지한 후에 해야 한다. iptables에 새로운 정책을 추가하면 iptables를 재가동해야 한다.
# /etc/init.d/iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
기본 설정
...
-A RH-Firewall-1-INPUT -m state --state INVALID -j DROP
...
# sshd
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 218.0.0.15 --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 218.0.0.16 --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 218.0.0.17 --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 218.0.0.18 --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j DROP
# domain, rndc
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 953 -j ACCEPT
# mysqld
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
# block heavy requests
-A RH-Firewall-1-INPUT -m recent --update --seconds 600 --name TOO_MANY_REQUESTS -j DROP
-A RH-Firewall-1-INPUT -m hashlimit --hashlimit 10/s --hashlimit-burst 24 --hashlimit-mode srcip --hashlimit-name HTTP_REQ_LIMIT -j ACCEPT
-A RH-Firewall-1-INPUT -m recent --set --name TOO_MANY_REQUESTS -j DROP
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
...
DNS 서버에 대한 DoS 공격 대응
[[작은숲:위키노트/Bind 설정|Bind 설정]을 통해 기본적인 조치를 한 후 iptables의 recent 모듈을 이용해 DNS 서버에 무리한 질의를 하는 IP를 차단하도록 한다.
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -m recent --set --name DNS --rsource
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -m recent --update --seconds 10 --hitcount 10 --rttl --name DNS --rsource -j DROP
DNS 서버에 10초 동안 10번 이상 질의를 하면 차단하도록 한다. 설정을 추가한 후 iptables를 재가동한다.
SSH 무차별 대입 공격 대응
-N blacklist
-N sshscan
-A INPUT -m state --state NEW -p tcp --dport ssh -j sshscan
-A blacklist -m recent --set --name blacklist
-A blacklist -j LOG --log-level info --log-prefix "SSH SCAN Blocked: "
-A blacklist -j DROP
-A sshscan -m recent --update --seconds 1200 --hitcount 1 --name blacklist -j DROP
-A sshscan -m recent --set --name sshscan
-A sshscan -m recent --update --seconds 20 --hitcount 3 --name sshscan -j blacklist
-A sshscan -j ACCEPT
위 예는 같은 세션에서 20초 동안 3번의 새로운 접속 요청이 들어올 경우 20분 동안 차단한다. 그리고 /var/log/messages에 SSH SCAN Blocked: 접두어를 붙여 로그를 남긴다.
참고
- iptable을 이용한 서비스 차단 및 활용 <archiveis>xWbvj</archiveis>
- 커널 2.4에서 NAT(Network Address Translation) 구현
- iptables를 이용한 패킷 필터링
- iptables 사용법 예제로 정리
- CentOS 방화벽 설정 - iptables
- SSH의 Brute Force Attak을 막기
- iptables 사용법 정리 (usage of iptables)
- iptables를 이용한 ssh 스캐닝 공격 방어
- ssh dictionary attack 막기 ver.2
| 배포판 | |
|---|---|
| 서버 프로그램 | |
| 시스템 도구 | |
| 시스템 보안 | |
| 시스템 설정 | |
| HOWTO 문서 | |
| 사용자 설정 | |
| 활용 | |
| 명령어 | |