Firewall - iptables_conntrack 모듈

conntrack 모듈 사용하기


conntrack이란 iptables의 상태추적 모듈로 NAT 테이블, FTP 등과 관련이 있는 모듈로, 현재 접속 상태에 대한 정보를 일정 시간 동안 시스템에 기억하도록 해주는 모듈이다.

iptables에서는 conntrack 모듈을 이용해 각 테이블에 등록된 IP의 연결을 추적한다.


지금까지는 하나의 서비스를 사용하기 위해 INPUT, OUTPUT 각각 정책을 설정해야 했다.

하지만 상태기반 방화벽에서는 INPUT 체인에 정책을 정적으로 설정하면 응답에 대한 연결은 상태 정책을 이용해 동적으로 패킷을 허용하므로, 정책이 하나만 있으면 접속이 가능하다.


상태 기반 정책 설정 시 사용하는 상태(state)는 다음과 같다.

iptables11_1


이제 다음의 요구 사항을 만족하도록 정책을 설정해보자.


  • 호스트 IP에서만 방화벽으로 ssh 접속 허용
  • 모든 IP에서 방화벽으로 ping 허용

  • 방화벽에서 외부의 모든 DNS 서버로 DNS 쿼리가 가능
  • 각 체인의 기본 정책은 DROP
  • 모든 정책에 대해 로그 기록


먼저 패킷 필터링 방식을 사용하면 다음과 같이 하나의 서비스를 INPUT, OUTPUT에 각각 정책을 설정해주어야 한다.

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -s 192.168.35.X -p tcp --dport 22 -j LOG --log-prefix "ssh_accept"
iptables -A INPUT -s 192.168.35.X -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_accept"
iptables -A INPUT -p udp --sport 53 -j ACCEPT


iptables -A OUTPUT -d 192.168.35.X -p tcp --sport 22 -j LOG --log-prefix "ssh_accept"
iptables -A OUTPUT -d 192.168.35.X -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_accept"
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

iptables11_2


정책이 제대로 설정되었는지 ping을 보내 확인해보자.

iptables11_3

iptables11_4


반면, 상태 기반 방식으로 설정하면 INPUT 이나 OUTPUT 중 한 곳에만 설정하면 되므로 훨씬 간단해진다.

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -s 192.168.35.X -p tcp --dport 22 -j LOG --log-prefix "ssh_accept"
iptables -A INPUT -s 192.168.35.X -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,RELTAED -j ACCEPT


iptables -A OUTPUT -p udp --dport 53 -j LOG --log-prefix "dns_accept"
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j LOG --log-prefix "accept_out"
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables11_5


마찬가지로 ping을 보내 정책이 제대로 설정되었는지 확인한다.

iptables11_6