서버 관리 · 9 min read · Dec 02, 2025

완벽한 서버 확장 - Debian Squeeze [ISPConfig 3] - 페이지 5

11. 시스템 강화

우선, ISPConfig3 패널의 Server Config - Web (탭)에서 보안 수준을 높음으로 설정했는지 확인하세요.

다음 지침은 단지 시연일 뿐입니다. 적용하고 사용하기 전에 (인터넷에서 문서를 읽어) 완전히 이해하시기 바랍니다.

일반적으로, 이 지침을 따르면 특정 포트에서 트래픽을 제한하고, syn 연결을 줄이며, 알려진 나쁜 패킷을 사용하는 침입을 방지할 수 있습니다. 이를 적용하려면 /root/scripts 폴더를 생성하고 (존재하지 않는 경우) 다음 5개의 파일을 생성합니다. (loadfw, unloadfw, IPs, fwrules 및 reloadfail2ban). 첫 번째 파일은 규칙을 로드하는 스크립트를 포함하고, 두 번째는 규칙을 언로드하는 스크립트를 포함하며, 세 번째는 “BAD” IP와 “BAD” 네트워크를 포함하고, 네 번째는 사용자 정의 규칙을 포함하며, 다섯 번째는 모든 것을 다시 로드하는 몇 가지 명령을 포함합니다 (fail2ban 포함).

mkdir /root/scripts  
touch /root/scripts/loadfw  
touch /root/scripts/unloadfw  
touch /root/scripts/IPs  
touch /root/scripts/fwrules  
touch /root/scripts/reloadfail2ban  
cd /root/scripts  
nano loadfw

다음 내용을 붙여넣습니다:

#!/bin/bash  
# 간단한 iptables IP/서브넷 로드 스크립트  
# ----------------------------------------------------------  

cd /root/scripts/  

IPT=/sbin/iptables  
DROPMSG="fwBLOCKED "  
BADIPS=$(egrep -v -E "^#|^$" /root/scripts/IPs)  
  
while read fwrule  
do  
  $IPT -I INPUT $fwrule  
  
done < /root/scripts/fwrules  
  
for ipblock in $BADIPS  
do  
   $IPT -I INPUT -s $ipblock -j DROP  
   $IPT -I INPUT -s $ipblock -j LOG --log-prefix "$DROPMSG"  
done  

unloadfw를 편집합니다:

nano unloadfw

다음 내용을 붙여넣습니다:

#!/bin/bash  
# 간단한 iptables IP/서브넷 언로드 스크립트  
# ---------------------------------------------------------  
  
cd /root/scripts/  
  
IPT=/sbin/iptables  
DROPMSG="fwBLOCKED "  
BADIPS=$(egrep -v -E "^#|^$" /root/scripts/IPs)  
  
while read fwrule  
do  
  $IPT -D INPUT $fwrule  
  
done < /root/scripts/fwrules  
for ipblock in $BADIPS  
do  
   $IPT -D INPUT -s $ipblock -j DROP  
   $IPT -D INPUT -s $ipblock -j LOG --log-prefix "$DROPMSG"done

IPs를 편집합니다:

nano IPs

여기에서 귀찮은 IP (예: fail2ban에 의해 여러 번 차단된 IP) 또는 전체 네트워크를 붙여넣습니다. 언제든지 IP 또는 네트워크를 추가할 수 있지만, 수정하기 전에 (특히 무언가를 제거하는 경우) “/root/scripts/unloadfw”를 실행해야 합니다. 그 후 파일을 편집하여 IP 또는 네트워크를 삽입하고 마지막으로 “/root/scripts/loadfw”를 실행해야 합니다 (아래 참조).

#IP  
x.y.z.w  
x.q.a.r  
  
#네트워크  
d.r.t.h/24  
  
#메일서버  
a.g.h.j

(각 국가와 관련된 네트워크를 보려면 http://www.countryipblocks.net를 사용할 수 있습니다). fwrules를 편집합니다:

nano fwrules

다음 내용을 붙여넣습니다 (INPUT 체인에서 삽입 (-I) 또는 삭제 (-D)할 수 있는 모든 것을 포함합니다. 이 규칙은 단일 네트워크 인터페이스 (eth0)를 가진 서버를 위한 것입니다. 필요에 맞게 변경하세요 (예: 네트워크 인터페이스가 다르면 eth0를 변경).

-p tcp --dport 50022 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw50022 -j DROP  
-p tcp --dport 50022 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw50022 -j LOG --log-prefix "LMfwport50022"  
-p tcp --dport 50022 -i eth0 -m state --state NEW -m recent --set --name fw50022  
-p tcp --dport 50000 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw50000 -j DROP  
-p tcp --dport 50000 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw50000 -j LOG --log-prefix "LMfwport50000"  
-p tcp --dport 50000 -i eth0 -m state --state NEW -m recent --set --name fw50000  
-p tcp --dport 10000 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw10000 -j DROP  
-p tcp --dport 10000 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw10000 -j LOG --log-prefix "LMfwport10000"  
-p tcp --dport 10000 -i eth0 -m state --state NEW -m recent --set --name fw10000  
-p tcp --dport 25 -i eth0 -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 20 --name fw25 -j DROP  
-p tcp --dport 25 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name fw25 -j LOG --log-prefix "LMfwport25"  
-p tcp --dport 25 -i eth0 -m state --state NEW -m recent --set --name fw25  
-p tcp --dport 110 -i eth0 -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 20 --name fw110 -j DROP  
-p tcp --dport 110 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name fw110 -j LOG --log-prefix "LMfwport110"  
-p tcp --dport 110 -i eth0 -m state --state NEW -m recent --set --name fw110  
-p tcp --dport 50443 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw50443 -j DROP  
-p tcp --dport 50443 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw50443 -j LOG --log-prefix "LMfwport50443"  
-p tcp --dport 50443 -i eth0 -m state --state NEW -m recent --set --name fw7443  
-p tcp --dport 22 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw22 -j DROP  
-p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw22 -j LOG --log-prefix "LMfwport22"  
-p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set --name fw22  
-p tcp --dport 20 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw20 -j DROP  
-p tcp --dport 20 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw20 -j LOG --log-prefix "LMfwport20"  
-p tcp --dport 20 -i eth0 -m state --state NEW -m recent --set --name fw20  
-p tcp --dport 21 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw21 -j DROP  
-p tcp --dport 21 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw21 -j LOG --log-prefix "LMfwport21"  
-p tcp --dport 21 -i eth0 -m state --state NEW -m recent --set --name fw21  
-p tcp --dport 143 -i eth0 -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 20 --name fw143 -j DROP  
-p tcp --dport 143 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name fw143 -j LOG --log-prefix "LMfwport143"  
-p tcp --dport 143 -i eth0 -m state --state NEW -m recent --set --name fw143  
-p tcp --dport 53 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw53 -j DROP  
-p tcp --dport 53 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw53 -j LOG --log-prefix "LMfwport53"  
-p tcp --dport 53 -i eth0 -m state --state NEW -m recent --set --name fw53  
-p tcp --dport 443 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw443 -j DROP  
-p tcp --dport 443 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw443 -j LOG --log-prefix "LMfwport443"  
-p tcp --dport 443 -i eth0 -m state --state NEW -m recent --set --name fw443  
-p tcp --dport 8081 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw8081 -j DROP  
-p tcp --dport 8081 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw8081 -j LOG --log-prefix "LMfwport8081"  
-p tcp --dport 8081 -i eth0 -m state --state NEW -m recent --set --name fw8081  
-p icmp -j DROP  
-p icmp -m limit --limit 2/s -j ACCEPT  
-p tcp --syn --dport 80 -m connlimit --connlimit-above 25 -j DROP  
-p tcp --syn --dport 80 -m connlimit --connlimit-above 25 -j LOG --log-prefix "BLfwsyn80"  
-p tcp --syn --dport 443 -m connlimit --connlimit-above 25 -j DROP  
-p tcp --syn --dport 443 -m connlimit --connlimit-above 25 -j LOG --log-prefix "BLfwsyn443"  
-p tcp --syn --dport 50443 -m connlimit --connlimit-above 25 -j DROP  
-p tcp --syn --dport 50443 -m connlimit --connlimit-above 25 -j  LOG --log-prefix "BLfwsyn50443"  
-p tcp --syn --dport 50022 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 50022 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn50022"  
-p tcp --syn --dport 22 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 22 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn22"  
-p tcp --syn --dport 50000 -m connlimit --connlimit-above 15 -j DROP  
-p tcp --syn --dport 50000 -m connlimit --connlimit-above 15 -j LOG --log-prefix "BLfwsyn50000"  
-p tcp --syn --dport 10000 -m connlimit --connlimit-above 15 -j DROP  
-p tcp --syn --dport 10000 -m connlimit --connlimit-above 15 -j LOG --log-prefix "BLfwsyn10000"  
-p tcp --syn --dport 25 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 25 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn25"  
-p tcp --syn --dport 20 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 20 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn20"  
-p tcp --syn --dport 21 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 21 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn21"  
-p tcp --syn --dport 110 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 110 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn110"  
-p tcp --syn --dport 143 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 143 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn143"  
-p tcp --syn --dport 53 -m connlimit --connlimit-above 10 -j DROP  
-p tcp --syn --dport 53 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn53"  
-i eth0 -p tcp --tcp-flags ALL ALL -j DROP  
-i eth0 -p tcp --tcp-flags ALL ALL -j LOG --log-level 4 --log-prefix "FLAAfw"  
-i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP  
-i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-level 4 --log-prefix "FINGfw"  
-i eth0 -f -j DROP  
-i eth0 -f  -m limit --limit 6/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "FRAGfw"  
-i eth0 -p tcp --tcp-flags ALL NONE -j DROP  
-i eth0 -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULLfw"  
-i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP  
-i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMASfw"  
-i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP  
-i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-level 4 --log-prefix "SYNRTSfw"  
-i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP  
-i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-level 4 --log-prefix "SYNRTSACKfw"  
-i eth0 -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP  
-i eth0 -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j LOG --log-level 4 --log-prefix "SYNRTSYNSfw"  
-i eth0 -p tcp ! --syn -m state --state NEW -j DROP  
-i eth0 -p tcp ! --syn -m state --state NEW  -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "DROSYNCfw"

reloadfail2ban을 편집합니다:

nano reloadfail2ban

다음 내용을 붙여넣습니다:

#!/bin/bash  
  
/etc/init.d/fail2ban restart  
sleep 2  
/root/scripts/unloadfw  
sleep 2  
/root/scripts/loadfw

reloadfail2ban 스크립트는 fwrules의 사용자 정의 규칙을 언로드하고, fail2ban을 재시작하고, 다시 fwrules의 규칙을 로드합니다. 전체 방화벽 재시작은 하지 않습니다. 따라서 이 파일 (또는 IPs 파일)에서 규칙을 편집하기 전에 unloadfw로 언로드해야 합니다. reloadfail2ban의 역할은 fail2ban의 기능을 테스트하는 것입니다.

마지막으로 실행합니다:

chmod 700 reloadfail2ban  
chmod 700 unloadfw  
chmod 700 loadfw  
/root/scripts/reloadfail2ban

매번 재부팅 후 사용자 정의 규칙을 로드하려면 /etc/init.d/rc.local의 끝에 다음 줄을 붙여넣습니다: /root/scripts/loadfw:

nano /etc/init.d/rc.local

그리고 다음을 추가합니다:

[...]  
/root/scripts/loadfw

(D)DoS Deflate는 서비스 거부 공격을 차단하는 과정에서 도움을 주기 위해 설계된 경량 bash 셸 스크립트입니다. 서버에 연결된 IP 주소 목록과 총 연결 수를 생성합니다. 소프트웨어 수준에서 설치하기 가장 간단하고 쉬운 솔루션 중 하나입니다.

사전 구성된 연결 수를 초과하는 IP 주소는 서버의 방화벽에서 자동으로 차단되며, 이는 직접 iptables 또는 고급 정책 방화벽 (APF)일 수 있습니다. (D)DoS Deflate를 설치하려면:

cd /tmp  
wget http://www.inetbase.com/scripts/ddos/install.sh  
chmod 0700 install.sh  
./install.sh

/usr/local/ddos/ddos.conf를 편집하고 APF 방화벽을 비활성화하고 일반 iptables를 사용하며, 이벤트를 root에게 이메일로 보내고 분당 100개 이상의 연결을 차단하도록 다음 변경 사항을 적용합니다.

[...]  
APF_BAN=0  
EMAIL_TO="root"  
NO_OF_CONNECTIONS=100  
[...]  

위의 내용은 몇 가지 제안일 뿐입니다. 원하는 대로 확장할 수 있습니다.

구현은 많은 접근 방식 중 하나일 뿐입니다. APF, Shorewall 등과 같은 방화벽 솔루션을 사용할 수 있습니다. 이와 함께 더 다양한 접근 방식을 포함할 수 있다면 기쁠 것입니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.