방화벽2

김상우·2022년 8월 4일
0
post-thumbnail

지난 포스트에서 방화벽에 대한 내용을 다뤘는데 firewalld에 대해 다뤄보았다. 이번에 다뤄볼 내용은 iptables 명령어를 활용하는 방법에 대해 초점을 두었다.

firewalld와 iptables의 차이점은 아래 링크에서 다뤄보았다.
차이점 확인하러 가기

기본 동작 원리

iptables는 리눅스상에서 방화벽을 설정하는 도구로서 ipchains를 대신하는 방화벽 도구이다. iptables는 커널상에서의 netfilter 패킷필터링 기능을 사용자 공간에서 제어하는 수준으로 사용할 수 있다.

  • 패킷필터링
    지나가는 패킷의 해더를 보고 그 전체 패킷의 운명을 결정하는 것을 말한다. 일반적으로 패킷은 해더와 데이터를 가진다.

특정 조건을 가지고 있는 패킷에 대해 허용(ACCEPT)과 차단(DROP)등을 지정할 수 있으며, 특정 조건등을 통해 다양한 방식의 패킷 필터링과 처리 방식을 지원한다.

iptables 정책은 여러 구분으로 나눠지며 중요한 부분은 Chain이다.
Chain은 패킷이 조작될 상태를 지정하며, iptables에 내장된 기본 Chain은 다음과 같다. 

  • Chain
    Chain INPUT : 서버로 들어오는 기본 정책
    Chain FORWARD : 서버에서 forwarding 기본 정책
    Chain OUTPUT : 서버에서 나가는 기본 정책

옵션

  • 기본 옵션
옵션설명
-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)규칙에 적합한 패킷 처리 방법 명시
  • 사용예시

사용 예시

  • 기본정책을 ACCEPT로 설정
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
  • 현재 자신의 방화벽 규칙 출력
iptables -L
  • 규칙 추가 후 저장 /etc/sysconfig/iptables 에 저장된다.
service iptables save
  • 현재 iptables 규칙 초기화
iptables -F
  • INPUT체인의 1번째 행의 정책 삭제
iptables -D INPUT 1
  • 출발지 주소가 192.168.0.2인 패킷을 모두 차단하는 정책을 INPUT 체인에 추가
iptables -A INPUT -s 192.168.0.2 -j DROP
  • 목적지 주소가 192.168.0.3인 패킷은 모두 허용하는 정책을 INPUT 체인에 추가
iptables -A INPUT -d ! 192.168.0.3 -j ACCEPT
  • TCP 프로토콜 패킷은 모두 허용하는 정책을 INPUT 체인에 추가
iptables -A INPUT -p TCP -j ACCEPT
  • 목적지 포트번호가 80번인 TCP 프로토콜 패킷은 모두 차단하는 정책을 INPUT 체인에 추가
iptables -A INPUT -p TCP --dport 80 -j DROP

iptables 정책 순서

모든 방화벽은 순차적으로 실행된다.
예를 들어 모든 입출력 패킷에 대해 거부하는 설정이 먼저 등록되는 정책이 먼저 설정되고 이후에 포트를 열어주는 정책을 추가한다면 포트가 열리지 않는다.
이렇게 순차적으로 실행되는 특성상 특정 포트나 주소 등에 대한 허용정책을 먼저 정의 후 거부정책을 추가해야 한다.

  • 허용정책 보다 거부정책을 먼저 정의한 예시
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 접속이 가능한 상태가 된다.

iptables를 통한 패킷 폐기 정책

접속하기 위한 패킷이 똑같은 IP에서 비정상적으로 많이 요청이 되는 경우 공격으로 간주하고 SYN을 패킷을 폐기시키는 정책을 추가할 수 있다.

  • 80번 포트로 접속하는 비정상적인 패킷을 차단하는 정책을 정의한 예시
# 1초에 10번 이상 80번 포트로 접속하는 경우 패킷을 폐기하는 정책 추가
iptables -A INPUT -p TCP --dport 80 -m recent --update --seconds 1 --hitcount 10 --name HTTP -j DROP
profile
아침엔 운동하고 밤엔 잠을 잔다.

0개의 댓글