iptables 설정하기
iptables란 시스템 관리자가 리눅스 상에서 방화벽 설정을 위해 필터링을 적용하기 위한 테이블입니다.
안내
iptables에 대한 자세한 설명은 netfilter 공식 사이트의 iptables를 참고하시기 바랍니다.
주요 개념
iptables의 기본 용어와 명령어는 다음과 같습니다.
기본 용어
표 iptables 기본 용어
용어 | 설명 |
---|---|
Target | IP Packet이 Rule과 일치하는 경우 실행되는 동작 - ACCEPT: packet 허용 - DROP: packet 차단, 사용자에게 오류 메시지를 보내지 않음 - REJECT: packet 차단, 사용자에게 오류 메시지를 보냄 |
Chain | IP Packet에 미리 설정한 Rule을 적용하여 Target 결정 - INPUT: System으로 들어오는 Packet의 Policy Rule - OUTPUT: System에서 나가는 Packet의 policy Rule - FORWARD: System에서 다른 System으로 보내는 Packet의 policy Rule |
명령어
표 전체 명령어
용어 | 설명 |
---|---|
-A (–append) | 새로운 Rule 추가 - 현재 Rule 뒤에 추가됨 |
-D (–delete) | Rule 삭제 |
-C (–check) | 패킷 테스트 |
-R (–replace) | 새로운 Rule로 교체 |
-I (–insert) | 새로운 Rule 삽입 - 현재 Rule 앞에 추가됨 |
-L (–list) | Rule 조회 |
-S (–list-rules) | Rule 출력 |
-F (–flush) | Chain으로부터 Rule 모두 삭제 |
-Z (–zero) | 모든 Chain의 패킷과 바이트 카운터 값을 0으로 만듦 |
-N (–new) | 새로운 Chain을 생성 |
-X (–delete-chain) | Chain 삭제 |
-P (–policy) | 기본정책 변경 |
-s (source IP) | 출발지 IP |
-d (destination IP) | 목적지 IP |
–sport (source port) | 출발지 포트 |
–dport (destination port) | 목적지 포트 |
j (–jump target) | 특정 정책 설정 |
p (protocol) | TCP, UDP, ICMP 등 사용 |
i (in-interface) | INPUT, OUTPUT chain에서 패킷이 들어오는 인터페이스를 설정할 때 사용 |
o (out-interface) | OUPUT, FORWARD chain에서 패킷이 나가는 네트워크 장치를 지정할 때 사용 |
t (tables) | filter, nat, mangle 중 선택 가능 - 기본값: filter |
정책 설정하기
카카오 i 클라우드 콘솔의 Bare Metal Server 서비스에는 기본 설치된 iptables v1.6.1과 SSHGUARD가 있습니다. SSHGUARD는 몇 초 내 다수 로그인 실패와 같은 ssh에 대한 무차별 대입 공격으로부터 호스트를 보호합니다. SSHGUARD는 일반적인 iptables Rule에 해당되는 역할을 수행하지는 않으며, 사용자의 정책 기준에 따라 Rule을 직접 설정해야 합니다.
카카오 i 클라우드 Bare Metal Server Ubuntu 환경에서 사용자가 iptables에 해당되는 Rule을 설정하는 방법은 다음과 같습니다.
안내
SSHGUARD에 대한 자세한 설명은 SSHGUARD 공식 사이트를 참고하시기 바랍니다.
iptables 버전 확인하기
설치된 iptables의 버전을 확인할 수 있습니다.
코드 예제 iptables 버전 확인 명령어
sudo iptables -V
코드 예제 iptables 버전 확인 명령 예시
iptables v1.6.1
Rule 조회하기
현재 iptables에 설정된 Rule을 조회할 수 있습니다.
코드 예제 Rule 조회 명령어
sudo iptables -nL --line-numbers --verbose
SSHGUARD가 설치되어 있으며, 적용된 Rule이 없는 상태입니다.
코드 예제 Rule 조회 명령 실행 결과 예시
sudo iptables -nL --line-numbers --verbose 명령어 실행 결과 (예시)
Chain INPUT (policy ACCEPT 451 packets, 44136 bytes)
num pkts bytes target prot opt in out source destination
1 773 77557 sshguard all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 278 packets, 30411 bytes)
num pkts bytes target prot opt in out source destination
Chain sshguard (1 references)
num pkts bytes target prot opt in out source destination
Rule 출력하기
전체 Rule을 출력할 수 있습니다. 출력 결과가 iptables-save 방식으로 생성되어 바로 재사용이 가능한 포맷이라는 점에서 iptables Rule 조회 명령어인 sudo iptables -L
와 다릅니다.
코드 예제 Rule 출력 명령어
sudo iptables -S -v
코드 예제 Rule 출력 명령 예시
sudo iptables -S -v 명령어 실행 결과 (예시)
-P INPUT ACCEPT -c 511 50127
-P FORWARD ACCEPT -c 0 0
-P OUTPUT ACCEPT -c 323 36247
-N sshguard
-A INPUT -c 833 83548 -j sshguard
Rule 생성하기
새로운 Rule을 생성할 수 있습니다.
주의
iptables에서 정책을 설정할 때, 사용자 접속 및 서비스와 관련된 IP Port가 차단되지 않도록 유의해야 합니다. 특히 외부로 나가는 Packet의 경우 특정 Port만 허용하면 나머지 Port로의 접근은 불가능해지므로 주의하시기 바랍니다. 사용자가 iptables를 직접 제어하다가 발생하는 문제는 서비스 공급자(카카오엔터프라이즈)가 대신 해결할 수 없으며, 사용자가 직접 이미지 재설치를 통해 인스턴스를 초기화하여 해결해야 합니다. 이미지 재설치는 이미지 재설치는 인스턴스 더보기의 리빌드 기능을 통해 할 수 있습니다.
코드 예제 Rule 생성 명령어
sudo iptables -A
코드 예제 Rule 생성 명령 실행 사례
#case1. localhost 인터페이스에 들어오는 모든 패킷을 허용하는 Rule을 생성합니다.
sudo iptables -A INPUT -i lo -j ACCEPT
#case2. 외부에서 모든 목적지의 tcp/22 port로의 접근을 허용하는 Rule을 생성합니다.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#case3. 외부에서 모든 목적지의 tcp/80 port로의 접근을 허용하는 Rule을 생성합니다.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#case4. 외부에서 모든 목적지의 tcp/443 port로의 접근을 허용하는 Rule을 생성합니다.
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#case5. 외부 모든 출발지에서 내부 000.000.00.00 목적지 서버의 tcp/22번 port로의 접근을 허용하는 Rule을 생성합니다.
sudo iptables -A INPUT -d 000.000.00.00 -p tcp --dport 22 -j ACCEPT
Rule 삭제하기
더 이상 사용하지 않는 Rule을 삭제할 수 있습니다.
코드 예제 Rule 삭제 명령어
sudo iptables -D
코드 예제 Rule 삭제 명령 실행 사례
#case1. INPUT 체인의 Rule number 4를 삭제합니다.
sudo iptables -D INPUT 4
#case2. tcp 22 Port 접속 차단 Rule을 삭제합니다.
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j REJECT
#case3. 내부 모든 서버의 tcp/443번 Port로의 접근을 허용한 Rule을 삭제합니다.
sudo iptables -D INPUT -p tcp --dport 443 -j ACCEPT
Rule 설정 저장하기
iptables Rule은 시스템을 다시 시작하면 모두 사라지므로, 변경된 Rule 설정을 별도 etc/iptables.rules
파일로 저장합니다.
코드 예제 Rule 설정 저장 명령어
sudo iptables-save
코드 예제 저장된 파일 etc/iptables.rules 확인 명령어
sudo cat /etc/iptables.rules
코드 예제 sudo cat /etc/iptables.rules
# sudo cat /etc/iptables.rules 명령어 실행 결과
filter
:INPUT ACCEPT [1438:151829]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [845:93350]
:sshguard - [0:0]
-A INPUT -j sshguard
COMMIT
표 iptables 명령어 예시에 대한 항목별 설명
기본 | 명령어 | 체인 | Source IP | Destination IP | Protocol | Port | 매칭 | 동작 |
---|---|---|---|---|---|---|---|---|
iptables | -A | INPUT | -s | -d | -p | -dport | -j | ACCEPT |
iptables | -D | OUTPUT | -s | -d | -p | -dport | -j | DROP |
iptables | -I | FORWARD | -s | -d | -p | -dport | -j | REJECT |