본문 바로가기
Linux

iptables

by Skogkatt의 개인 블로그 2020. 3. 31.
반응형

Iptables

  • iptablesNetfilter에서 개발한 리눅스에서 방화벽 정책을 수립할 수 있는 도구로 2001년 리눅스 2.4 커널 배포 시점부터 리눅스의 일부분으로 제공되기 시작하였다.[각주:1]
  • iptables의 가장 주된 기능은 패킷 필터링으로 들어오고 나가는 IP 패킷에 대하여 제어 기능을 구현할 수 있다.
  • 패킷을 검사하고 해당 패킷을 허용할지 차단할지 결정하기 위해서는 특정한 기준이 필요하며 이러한 허용과 차단에 대한 기준을 정책이라고 한다.

table

  • iptables에서의 테이블은 패킷 필터링이나 네트워크 주소 변환(NAT, Network Address Translation)과와 같은 iptables에서 제공하는 기능의 큰 범주(category)를 기술하는 용어로써 iptables의 구성요소 정도로 이해할 수 있다.
  • 쉽게, iptables에서 tableiptalbes의 기능을 큰 범주로 구분해 놓은 것이며,
    iptables
    의 기본 테이블은 filter / NAT / magle / raw 테이블이 존재한다.
filter table
  • filter 테이블은 iptablesdefault 테이블이자 가장 핵심적인 테이블
  • 특정 정책(rule)에 따라 패킷을 필터링하거나 허용하는 역할을 맡는다.
    때문에 네트워크 방화벽의 정책(rule)을 설정할 때 가장 많이 사용되며 일반적으로 방화벽 정책을 세운다 함은 filter 테이블 정책을 세우는 것으로 이해된다.
  • 기본적으로 3개의 체인을 가진다.
NAT table
  • 네트워크 주소 변환(NAT)[각주:2]에 관한 정책을 설정하는 테이블[foonote] 단, NAT테이블은 주소변환만 할 뿐 패킷을 차단하거나 허용하는 필터링 기능은 없다. 필터링과 관련된 정책은 filter 테이블에서 적용한다.[/footnote]
  • nat테이블의 저액으로는 방화벽 외부에서 방화벽 내부로 향하는 패킷을 방화벽이 보호하는 내부 네트워크의 주소(사설 IP)로 변환해  주는 기능과, 방화벽 내부 네트워크에서 방화벽을 통해 외부 네트워크로 나갈 때 외부 IP주소(공인 IP)로 변환해 주는 기능으로 구분된다.
raw table
  • Netfilter의 연결 추적(Connection Tracking) 시스템과는 독립적으로 동작해야 하는 정책을 적용하고자 할 때 사용되며 NOTRACK 타겟과 함께 사용한다.
  • NOTRACK은 특정 패킷에 대하여 conntrack을 하지 않도록 할 때 사용되는 타깃이다. 테이블에서는 적용할 수 없고, -m state --state New와 같은 stateful inspection 정책에는 사용하면 안 된다.
  • 서버에 접속 수가 많아져 conntrack_max값이 초과되면 정상적인 패킷도 드롭되는 문제가 발생할 수 있다. 이러한 문제를 완화하기 위해 자주 사용되는 패킷은 conntrack을 거치지 않도록 설정할 수 있는데 이때 사용되는 것이 NOTRACK 타깃이다.
  • 예) 80(HTTP)서비스에 대하여 CONNTRACK을 하지 않도록 적용한 정책
    iptables -t raw -A INPUT -p tcp --dprot 80 -j NOTRACK

chain

  • 패킷이 iptables 내부에서 이동(처리)하는 경로를 나타낸다.
  • iptables에는 INPUT / OUTPUT / FORWARD / PREROUTING / POSTROUTING 체인이 존재한다.
  • 테이블들은 각자 다른 체인을 가지고 있으며 일반적으로 INPUT, OUTPUT, FORWARD 체인이 가장 많이 사용된다.
INPUT chain
  • 방화벽으로 들어오는 패킷(입력 패킷). , 목적지 주소가 방화벽 IP인 모든 패킷
  • 커널 내부에서 라우팅 처리를 마친 후 목적지가 방화벽인 패킷에 대한 정책을 설정할 때 사용한다.
OUTPUT chain
  • 방화벽에서 나가는 패킷(출력 패킷). , 출발지 주소가 방화벽 IP인 모든 패킷
  • 방화벽 자체에서 외부로 나가는 패킷에 적용되는 정책을 설정할 때 사용한다.
FORWARD chain
  • 네트워크 간 패킷이 iptables 방화벽을 거쳐서 통신하는 경우
  • 출발지 IP나 목적지 IP가 방화벽 IP와는 무관하지만, 방화벽을 거쳐야만 통신할 수 있는 패킷에 대한 정책을 설정할 때 사용된다

macth

  • iptables에서 패킷을 처리할 때 패킷이 만족해야 하는 조건을 가리킨다. , 이 조건을 만족시키는 패킷에만 규칙을 적용한다.

target

  • 패킷이 조건으로 설정한 규칙과 일치할 때 수행하는 동작
  • 조건으로 설정한 규칙과 일치함은 매치에 설정된 모든 내용이 일치함을 의미하며, 수행하는 동작은 패킷을 허용(ACCEPT)하거나 차단(DROP)하는 iptables에서 처리될 최종 행위를 의미한다. 상용 방화벽들은 타겟(target)이라는 용어보다 액션(action)이라는 용어를 사용하고 있다.
  • 조건으로 설정한 규칙과 일치함은 매치에 설정된 모든 내용이 일치함을 의미하며, 수행하는 동작은 패킷을 허용(ACCEPT)하거나 차단(DROP)하는 iptables에서 처리될 최종 행위를 의미한다.


iptables 기본 사용법

iptables의 현재 버전 확인(-V, Version)
iptables -V

테이블에 적용된 정책 확인 (-L, --list)	
iptables -T [테이블] -L [체인]

filter 테이블의 모든 정책 확인
iptables -t filter -L

nat 테이블의 모든 정책 확인
iptables -t nat -L

filter테이블의 INPUT 체인 정책만 표시
iptables -t filter -L INPUT

filter테이블의 OUTPUT 체인 정책만 표시
iptables -L OUTPUT 

nat테이블의 PREROUTING체인 정책만 표시
iptables -t nat -L PREROUTING

firewall 정지 
systemctl stop firewalld.service

INPUT 체인의 정책 삭제
iptables -F INPUT

test 체인 생성
Iptables -N test

test체인의 타겟을 ACCEPT로 설정 
iptables -A test -j ACCEPT

INPUT체인의 정책 타겟을 test로 지정
iptables -A INPUT -j test

test 체인 삭제
iptables -X test

INPUT테이블에 ACCEPT 정책 설정
iptables -P INPUT ACCEPT

INPUT테이블에 DROP 정책 설정
iptables -P OUTPUT DROP

설정 예시

더보기
1) 방화벽 담당자인 Host PC IP(192.168.0.24)에서만 방화벽으로 ssh 접속이 되어야 한다.(다른 모든 IP에서의 ssh 접속은 차단)
2) 모든 IP에서 방화벽으로 ping이 되어야 한다.
3) 방화벽에서는 외부의 모든 DNS서버로 DNS 쿼리를 할 수 있어야 한다.
4) 각 체인의 기본 정책은 DROP으로 되어 있으며 변경할 수 없다. (fwstart.sh 스크립트 실행)
5) 모든 정책에 대하여 각각 로그를 기록하여야 한다. (로그 이름은 각자 임의로 지정하여 준다.)

INPUT
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j LOG --log-prefix “ssh_accpet_log”
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j LOG --log-prefix “ssh_drop”
iptables -A INPUT -p tcp –dport 22 -j DROP
iptables -A INPUT -p icmp -j LOG --log-prefix “icmp_accept”
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j LOG --log-prefix “dns_accpet”
iptables -A INPUT -p udp --sport 53 -j ACEEPT
OUTPUT
iptables -A OUTPUT -d 192.168.0.24 -p tcp --sport 22 -j LOG --log-prefix “ssh_accpet”
iptables -A OUTPUT -d 192.168.0.24 -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j LOG --log-prefix “ssh_drop”
iptables -A OUTPUT -p tcp –sport 22 -j DROP
iptables -A OUTPUT -p icmp -j LOG --log-prefix “icmp_accept”
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j LOG --log-prefix “dns_accpet”
iptables -A OUTPUT -p udp --dport 53 -j ACEEPT

--------------------------------------------------------------------------------------------------

INPUT 
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j LOG --log-prefix “ssh_accpet”
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j LOG --log-prefix “ssh_drop”
iptables -A INPUT -p tcp –dport 22 -j DROP
iptables -A INPUT -p icmp -j LOG --log-prefix “icmp_accept”
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED.RELATED -j LOG --log-prefix “accept_input”
iptables -A INPUT -m conntrack --ctstate ESTABLISHED.RELATED -j ACCEPT
OUTPUT
iptables -A OUTPUT -p udp --dport 53 -j LOG --log-prefix “dns_accpet”
iptables -A OUTPUT -p udp --dport 53 -j ACEEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED.RELATED -j LOG --log-prefix “accept_output”
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED.RELATED -j ACCEPT
  1. iptables는 Netfilter의 일부분으로서 Netfilter가 더 포괄적으로 사용 [본문으로]
  2. NAT Network Address Translation)는 사설 IP와IP 공인 IPIP 간의 주소 변환을 해주는 기능으로 NAT테이블에 설정하는 정책에 의해서 iptables 방화벽을 통과하는 패킷의 IP  주소변환이 이루어진다. [본문으로]
반응형

'Linux' 카테고리의 다른 글

[Kali Linux] VirtualBox에 Kali Linux 설치  (0) 2020.02.27
LILO(Linux Loader)  (0) 2019.10.11
Linux Mint  (0) 2019.07.14
[File System] ext (EXTended file system)  (0) 2019.07.13
리눅스 디렉터리  (0) 2019.07.07

댓글