작은숲:위키노트/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 설정]을 통해 기본적인 조치를 한 후 iptablesrecent 모듈을 이용해 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/messagesSSH SCAN Blocked: 접두어를 붙여 로그를 남긴다.

참고

이 작은숲 문서의 출처는 위키노트의 위키노트/Iptables 설정 문서입니다.