오늘은 리눅스 계열 중 신기능 업데이트가 빠르다고 소문난 서버 운영체제인 우분투 방화벽 업그레이드를 위해, 우분투에서 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 disable
Code language: PHP (php)
그리고 UFW를 기반으로 설정되어 있는 방화벽 설정을 모두 초기화 시킵니다. 이는 UFW도 IPtables를 기본으로 활용하므로 아래와 같은 명령을 사용합니다.
iptables -F
Code language: PHP (php)
IPtables를 안정적으로 사용하기 위한 패키지 설치
IPtables이나 Fail2Ban과 같은 보안 프로그램들은 다시 시작하면 기존 설정이 초기화됩니다. IPtables도 마찬가지로 시스템을 다시 시작한다든지 다시 작하게되면 설정이 초기화됩니다.
최신 버전의 우분투(Ubuntu)에서 이는 특히 피할 수 없이 나타는 현상이므로 이를 해소할 수 있는 패키지를 설치합니다.
이러한 패키지로 추천되는 것이 바로 iptables-persistent입니다. 여기서는 이를 사용하도록 합니다.
그리고 netfilter-persistent도 같이 설치합니다. netfilter는 IPtabels를 이용하면서도 이를 뛰어넘을 솔류션으로 인기를 끌고 있다고 하네요.
apt-get install iptables-persistent netfilter-persistent
Code language: PHP (php)
설치 도중에 ip4/ip6 저장 여부를 묻는데 yes를 선택합니다. 설정파일은 /etc/iptables 폴더에 저장됩니다.
이 설치를 마치고나면 /etc/iptables 라는 폴더에 rules.v4와 rules.v6가 생성되었다.
IPtables 설정을 변경했다면 netfilter-persistent save 명령어로 저장하고, 나중에 netfilter-persistent reload 명령어로 다시 설정을 불러올 수 있습니다.
sudo netfilter-persistent save
sudo netfilter-persistent reload
Code language: PHP (php)
재부팅 후 iptables -S 로 정책이 유지되는지 확인해 봅니다. 혹시나 정책이 제대로 유지되지 않았다면 netfilter-persistent reload 명령으로 다시 방화벽 정책을 불러올 수 있습니다.
iptables -S
Code language: PHP (php)
우분투 Iptables 기본 설정
이제 안정적으로 IPtables를 사용할 수 있게되었기 때문에 본격적으로 방화벽을 설정해 보기로 하죠.
일반적으로 아래와 같은 기본 설정등을 합니다.
일반적으로 네트워크 트래픽은 양방으로 흘러야 합니다. 때문에 established and related 접속 허용합니다.
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
Code 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 ACCEPT
Code 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 DROP
Code 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 DROP
Code language: PHP (php)
Block New Packets That Are Not SYN
iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
Code language: PHP (php)
Block Uncommon MSS Values
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
Code 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 DROP
Code 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 DROP
Code 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 DROP
Code language: PHP (php)
마지막으로 저장합니다.
netfilter-persistent save
Code language: PHP (php)