0. IPtables-Persistent 설치
- 리눅스서버의 네트워크 정책을 IPtables 설정을 통해서 관리할 수가 있다. 웹서버나 서비스 레벨에서도 관리가 가능하지만, 운영체제 레벨에서 관리하는 것이 리소스 측면에서 가장 효율적이다.
- 우분투에서는 ufw가 IPtables로부터 정보를 받아서 패킷을 관리해주고 있는데, iptables를 직접 설정을 해두면 보다 확실하게 네트워크 정책을 관리할 수가 있다.
- IPtables는 서버가 재부팅되면 정책이 초기화 된다. 정책을 유지하기 위해서 iptables-Persistent를 설치해준다.
sudo ufw disable # ufw 중지
sudo apt update
sudo apt install iptables-persistent netfilter-persistent
1. IPtables 기본 지식
- 체인(chain)
- Input : 서버로 들어오는 패킷
- Output : 서버에서 밖으로 나가는 패킷
- Forward : 서버를 통과해가는 패킷
- 액션(Action)
- -P (POLICY) : 기본적인 정책을 설정
- -A (APPEND) : 정책 추가 – 가장 아래에 추가
- -I (INSERT) : 정책 삽입 – 가장 위에 삽입
- -D (DELETE) : 정책 삭제
- -F (FLUSH) : 모든 정책을 삭제
- -X : 비어있는 체인을 삭제
- 옵션(Options)
- -p (protocol) : TCP/UDP와 같은 프로토콜
- -s (source) : 출발지
- –sport : 출발 포트
- -d (destination) : 목적지
- –dport : 목적 포트
- -j (jump) : 매치되는 패킷에 대한 처리
- ACCEPT : 패킷을 허용
- DROP : 패킷을 버림
2. 목표
- 앞으로 사용할 것으로 예상되는 포트는 다음과 같다. 해당 포트에 대해서만 ACCEPT 하도록 설정할 것이다.
- 22 : SSH/Sftp에 사용
- 80 : http의 기본 포트
- 443 : https의 기본 포트
- 3306 : MySQL/MariaDB의 기본 포트
- 위와 같이 자주 사용되는 포트는 보안에 취약하기 때문에 라우터에서 포트포워딩 할 때는 외부 포트를 다르게 설정하는 것이 좋다.
3. 초기화 및 설정
- 설정한 정책은 다음 명령으로 저장 및 불러오기가 가능하다.
sudo netfilter-persistent save
sudo netfilter-persistent reload
sudo iptables -F
sudo iptables -X
- 기본 정책으로 INPUT/FORWARD는 DROP하고 OUTPUT은 허용해서 외부에서 아무 포트로나 접근하지 못하게 한 다음, 필요한 포트만을 열어주도록 한다. 일단 모든 포트를 ACCEPT하고 설정이 끝나면 INPUT과 FORWARD는 DROP할 것이다.
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
- 네트워크는 기본적으로 쌍방향 통신이기 때문에 established and related 접속이 가능하도록 해준다.
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
- 설치된 서비스들이 localhost와 통신이 될 수 있도록 loopback 설정도 해준다.
sudo iptables -A INPUT -i lo -j ACCEPT
- HTTP/HTTPS (80/443) 포트를 열어준다.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- SSH/Sftp (22), DBMS(3306) 포트를 열어준다.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
- 이제 나머지 INPUT과 FORWARD는 DROP 설정해준다.
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -S
sudo netfilter-persistent save
sudo netfilter-persistent reload