Tips서버우분투 방화벽 강화를 위한 우분투 IPtables 설정법 - DDoS 방어 포함

우분투 방화벽 강화를 위한 우분투 IPtables 설정법 – DDoS 방어 포함

오늘은 리눅스 계열 중 신기능 업데이트가 빠르다고 소문난 서버 운영체제인 우분투 방화벽 업그레이드를 위해, 우분투에서 IPtables 사용법을 살펴보겠습니다.

우분투는 기본적으로 UFW(Uncomplicated Firewall)를 사용하지만 보다 고급 설정을 위해서 조금 더 활용 자유도가 높은 Iptables 사용법을 살펴봅니다.

우분투에서 IPtables 사용하기

우분투에서는 기본 방화벽으로 UFW(Uncomplicated Firewall)를 사용하고 있습니다. UFW는 아주 간단하고 명료한 방화벽을 구성할 수 있고, 무엇보다도 쉽기 때문에 초보가 사용하기에 좋습니다.

그러나 UFW는 IPtables를 조금 더 편리하게 사용할 수 있도록 만든 것에 불과하므로 조금 더 복잡하고 디테일한 방화벽을 구성하려면 IPtables를 사용하는 것도 좋습니다.

The Uncomplicated Firewall (ufw) is a frontend for iptables and is particularly well-suited for host-based firewalls. ufw aims to provide an easy to use interface for people unfamiliar with firewall concepts, while at the same time simplifies complicated iptables commands to help an adminstrator who knows what he or she is doing.

IPtables 사용전, UFW 사용 중지 및 방화벽 설정 초기화

처음 서버 세팅 시라면 UFW를 적용하지말고 바로 IPtables을 설치하면됩니다.

그러나 방화벽으로 UFW를 사용하다가 IPtables로 바꾼다면, 우분투 서버에서 Iptables를 설정하기 전에 먼저 UFW를 사용 중지합니다.

UFW 중지 명령은 아래와 같습니다.

ufw disableCode language: PHP (php)

그리고 UFW를 기반으로 설정되어 있는 방화벽 설정을 모두 초기화 시킵니다. 이는 UFW도 IPtables를 기본으로 활용하므로 아래와 같은 명령을 사용합니다.

iptables -FCode language: PHP (php)

IPtables를 안정적으로 사용하기 위한 패키지 설치

IPtables이나 Fail2Ban과 같은 보안 프로그램들은 다시 시작하면 기존 설정이 초기화됩니다. IPtables도 마찬가지로 시스템을 다시 시작한다든지 다시 작하게되면 설정이 초기화됩니다.

최신 버전의 우분투(Ubuntu)에서 이는 특히 피할 수 없이 나타는 현상이므로 이를 해소할 수 있는 패키지를 설치합니다.

이러한 패키지로 추천되는 것이 바로 iptables-persistent입니다. 여기서는 이를 사용하도록 합니다.

그리고 netfilter-persistent도 같이 설치합니다. netfilter는 IPtabels를 이용하면서도 이를 뛰어넘을 솔류션으로 인기를 끌고 있다고 하네요.

apt-get install iptables-persistent netfilter-persistentCode language: PHP (php)

설치 도중에 ip4/ip6 저장 여부를 묻는데 yes를 선택합니다. 설정파일은 /etc/iptables 폴더에 저장됩니다.

우분투 방화벽_netfilter-persistent 설차 옵션

이 설치를 마치고나면 /etc/iptables 라는 폴더에 rules.v4와 rules.v6가 생성되었다.

IPtables 설정을 변경했다면 netfilter-persistent save 명령어로 저장하고, 나중에 netfilter-persistent reload 명령어로 다시 설정을 불러올 수 있습니다.

sudo netfilter-persistent save
sudo netfilter-persistent reloadCode language: PHP (php)

재부팅 후 iptables -S 로 정책이 유지되는지 확인해 봅니다. 혹시나 정책이 제대로 유지되지 않았다면 netfilter-persistent reload 명령으로 다시 방화벽 정책을 불러올 수 있습니다.

iptables -SCode language: PHP (php)

우분투 Iptables 기본 설정

이제 안정적으로 IPtables를 사용할 수 있게되었기 때문에 본격적으로 방화벽을 설정해 보기로 하죠.

일반적으로 아래와 같은 기본 설정등을 합니다.

established and related 접속 허용

일반적으로 네트워크 트래픽은 양방으로 흘러야 합니다. 때문에 established and related 접속 허용합니다.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPTCode language: PHP (php)

~

loopback 허용

일반적으로 많은 소프트웨어들이 localhost 어댑터와 통신이 되어야 하기때문에 필요합니다.

sudo iptables -A INPUT -i lo -j ACCEPT Code language: PHP (php)

핑을 허용

만약 핑(ping)을 허용하려면 아래 명령을 추가합니다.

sudo iptables -A INPUT -p icmp -j ACCEPT  Code language: PHP (php)

HTTP/HTTPS 허용

80포트 및 443포트 허용

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPTCode language: PHP (php)

SSL/SFTP용 포트

SSL/SFTP를 이용하기 위한 포트를 엽니다.

sudo iptables -I INPUT -p tcp --dport (SSL/SFTP용 포트) -j ACCEPT Code language: PHP (php)

INPUT과 FORWARD 차단

위에서 기본적인 것을 허용했기 때문에 나머지는 차단합니다.

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROPCode language: PHP (php)

~

어느 정도 기본 설정을 했으면 저장합니다.

netfilter-persistent save Code language: PHP (php)

DDoS 방어

IPtables를 이용해 DDoS 방어 방업에 대해서 알아봅니다. 이러한 옵션은 DDoS Protection With IPtables: The Ultimate Guide를 그대로 가져왔습니다.

이 방법은 DDoS 방어와 관련한 벤치마킹 등에서 많이 언급되고 있는 방법들이고, 며칠간 열심히 검색한 결과 DDoS 방어 관련해서는 가장 품부한 내용을 담고 있습니다.

위 글은 비록 센토스(CentOS) 7을 기반으로 작성되었으나 IPtables을 사용하기 때문에 우분투에서 사용할 수 있습니다.

며칠 공부를 해봤는데 어설프게 설명하는것보다 원문 그대로 두고 필요하신분은 따로 공부하시는 것이 좋을 것 같아요. 단어는 이해가되는데 전체 맥락이나 정확한 개념 파익이 어려워요.

Block Invalid Packets

iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROPCode language: PHP (php)

Block New Packets That Are Not SYN

iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROPCode language: PHP (php)

Block Uncommon MSS Values

iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROPCode language: PHP (php)

Block Packets With Bogus TCP Flags

iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROPCode language: PHP (php)

Block Packets From Private Subnets (Spoofing)

iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROPCode language: PHP (php)

Drop ICMP (you usually don’t need this protocol)

iptables -t mangle -A PREROUTING -p icmp -j DROP  Code language: PHP (php)

Drop fragments in all chains

iptables -t mangle -A PREROUTING -f -j DROP  Code language: PHP (php)

Limit connections per source IP

iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset  Code language: PHP (php)

Limit RST packets

iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  Code language: PHP (php)

Limit new TCP connections per second per source IP

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP  Code language: PHP (php)

Use SYNPROXY on all ports (disables connection limiting rule)

SSH brute-force protection

/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set 
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP  Code language: PHP (php)

Protection against port scanning

/sbin/iptables -N port-scanning 
/sbin/iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN 
/sbin/iptables -A port-scanning -j DROPCode language: PHP (php)

마지막으로 저장합니다.

netfilter-persistent save  Code language: PHP (php)
Subscribe
Notify of
guest
0 Comments
Oldest
Newest
Inline Feedbacks
View all comments