administration tool for IPv4/IPv6 packet filtering and NAT

간혹 CentOS를 사용시에 외부에서 접속 테스트시, 내부에서는 접속이 되지만 외부에서는 접속이 되지 않는 경우가 있다. 예를 들어 apache2를 사용한다면, netstat등으로 포트를 확인했을 때 80이 사용중이지만 외부에서 접속이 되지 않는 경우다. 대부분 iptables이 외부로부터의 접근을 막고 있기 때문이다. 이렇게 iptables은 보통 외부로부터의 접근을 막는 방화벽의 목적으로 사용하며, 이외에도 여러가지 목적으로 사용되고는 한다.

우분투의 경우 ufw로 대체된 경우를 많이 볼 수 있지만 거의 모든 리눅스에서는 iptables이 주로 쓰인다.

참고 문서

기본 정보

간단한 방법으로 현재 iptables의 룰을 확인할 수 있다. 명령어는 다음과 같다.

$ iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
  • -t filter : 테이블을 선택한다. 여기서는 filter 테이블을 선택했다.
  • -L : 룰 리스트를 본다.

그래서 이 명령의 결과로 filter 테이블의 룰 리스트를 확인할 수 있다.

테이블

iptables에서는 총 5개의 기본 테이블과 유저가 만들 수 있는 커스텀 테이블을 관리한다. 기본 테이블의 목록은 다음과 같다.

  • filter
  • nat
  • mangle
  • raw
  • mac

filter

기본 테이블. 테이블을 선택하지 않으면 자동으로 이 테이블을 선택한다. 이 테이블에는 세 가지의 체인이 있는데, 각각 다음과 같다.

  • INPUT : 이 컴퓨터로 도착하는 패킷에 대해
  • OUTPUT : 이 컴퓨터에서 만들어진 패킷이 밖으로 나갈 때
  • FORWARD : 패킷이 이 컴퓨터를 통해 라우팅될때

nat

새로운 연결이 만들어질때 생기는 패킷에 대한 테이블이다. 이 테이블에는 세 가지의 체인이 있는데, 각각 다음과 같다.

  • PREROUTING : 이 컴퓨터로 패킷이 들어오기 전
  • POSTROUTING : 이 컴퓨터에서 만들어진 패킷이 밖으로 나가기 전에
  • OUTPUT : 이 컴퓨터에서 만들어진 패킷이 라우팅되기 전에

mangle

raw

security

전체 구조 그림은 다음과 같다. 패킷은 그림과 같은 순서로 흘러가게 되며, iptables의 룰들이 이 순서에 개입하게 된다.

룰은 5가지의 필드로 이루어져 있다.

  • target : 규칙이 일치할 경우에 수행할 동작
  • prot : protocol, /etc/protocols에 지정된 프로토콜 이름을 의미한다.
  • opt
  • source : 패킷이 출발한 지점
  • destination : 패킷이 도착할 지점

기본 사용법

기본적인 사용법을 알아본다. 다음의 예는 외부에서 들어오는 http, 80번 포트를 막는 명령이다.

$ iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:http

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
  • -A : 룰 추가
  • -i : in-interface
  • -p : 프로토콜. /etc/protocols에 지정된 프로토콜 이름을 의미한다.
  • –dport, –destination-port : 목적 포트
  • -j : rule의 target 지정

따라서 위 명령은 eth0으로 들어와서 tcp 80으로 도착하는 패킷을 버린다.