지난 포스트에서 방화벽에 대한 내용을 다뤘는데 firewalld에 대해 다뤄보았다. 이번에 다뤄볼 내용은 iptables 명령어를 활용하는 방법에 대해 초점을 두었다.
firewalld와 iptables의 차이점은 아래 링크에서 다뤄보았다.
차이점 확인하러 가기
iptables는 리눅스상에서 방화벽을 설정하는 도구로서 ipchains를 대신하는 방화벽 도구이다. iptables는 커널상에서의 netfilter 패킷필터링 기능을 사용자 공간에서 제어하는 수준으로 사용할 수 있다.
특정 조건을 가지고 있는 패킷에 대해 허용(ACCEPT)과 차단(DROP)등을 지정할 수 있으며, 특정 조건등을 통해 다양한 방식의 패킷 필터링과 처리 방식을 지원한다.
iptables 정책은 여러 구분으로 나눠지며 중요한 부분은 Chain이다.
Chain은 패킷이 조작될 상태를 지정하며, iptables에 내장된 기본 Chain은 다음과 같다.
옵션 | 설명 |
---|---|
-L(list) | 적용되어 있는 정책 목록 출력 |
-A(add) | 새로운 정책 추가(맨 아래에 추가) |
-I(insert) | 새로운 정책 삽입(맨 위에 삽입) |
-R(replace) | 새로운 정책 교환 |
-D(delete) | 정책 삭제 |
-N(new chain) | INPUT, OUTPUT, FORWARD를 제외한 새로운 체인 생성 |
-P(policy) | 기본 정책 변경 |
-F(flush) | 체인의 규칙 삭제 |
-C(check) | 패킷 테스트 |
-X | 비어있는 체인 삭제 |
옵션 | 설명 |
---|---|
-s(source address) | 출발지 주소 |
-d(destination address) | 목적지 주소 |
--sport(source port) | 출발지 포트번호 |
--dport(destination port) | 목적지 포트번호 |
-p(protocol) | 프로토콜 지정 |
-i(inbound interface) | 인바운드 인터페이스 |
-o(outbound interface) | 아웃바운드 인터페이스 |
-f(fragment packet) | 단편화(fragment) 패킷 |
-j(jump) | 규칙에 적합한 패킷 처리 방법 명시 |
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -L
/etc/sysconfig/iptables 에 저장된다.
service iptables save
iptables -F
iptables -D INPUT 1
iptables -A INPUT -s 192.168.0.2 -j DROP
iptables -A INPUT -d ! 192.168.0.3 -j ACCEPT
iptables -A INPUT -p TCP -j ACCEPT
iptables -A INPUT -p TCP --dport 80 -j DROP
모든 방화벽은 순차적으로 실행된다.
예를 들어 모든 입출력 패킷에 대해 거부하는 설정이 먼저 등록되는 정책이 먼저 설정되고 이후에 포트를 열어주는 정책을 추가한다면 포트가 열리지 않는다.
이렇게 순차적으로 실행되는 특성상 특정 포트나 주소 등에 대한 허용정책을 먼저 정의 후 거부정책을 추가해야 한다.
iptables -A INPUT -p TCP --dport 22:30 -j DROP
iptables -A INPUT -p TCP --dport 22 -j ACCEPT
- 위의 예시는 22~30번 포트로 접속하는 TCP 패킷을 차단하는 정책을 먼저 정의하고 다음 명령줄에서 22번 포트로 접속하는 TCP 패킷을 허용하는 정책을 정의했기 때문에 22번을 사용하는 ssh 접속이 불가능한 상태가 된다.
- 하지만 위의 방법과 반대로 명령어를 입력한다면 먼저 22번 포트를 열고 접속 허용을 한 후 22~30번 포트를 차단하기 때문에 ssh 접속이 가능한 상태가 된다.
접속하기 위한 패킷이 똑같은 IP에서 비정상적으로 많이 요청이 되는 경우 공격으로 간주하고 SYN을 패킷을 폐기시키는 정책을 추가할 수 있다.
# 1초에 10번 이상 80번 포트로 접속하는 경우 패킷을 폐기하는 정책 추가
iptables -A INPUT -p TCP --dport 80 -m recent --update --seconds 1 --hitcount 10 --name HTTP -j DROP