본문 바로가기

IT's Life/Linux

리눅스 - 방화벽(iptables) 개념, 설정, 방법


★방화벽(iptables) 설정


☆방화벽(iptables)란?


기본적으로 방화벽의 개념은 

1. 외부에서 서버로 들어오거나 

2. 서버에서 외부로 나가거나 

3. 서버를 경유하거나 

이렇게 3가지다.

방화벽을 어떻게 설정하느냐에 따라 위험해지거나 안전해질 수도 있다.

방화벽의 기본 정책은 모든 것을 허용(ACCEPT)한 후 불필요한 것을 거부(DROP) 또는 모든 것을 거부(DROP)한 후 필요한 것만 허용(ACCEPT)하는 것이다.

작동방식은 쉽게 설명하자면 방화벽허용을 체인으로 설정했을 때를 파이썬이나 C언어에서 함수 안에 또 다른 함수가 있는 격이라고 보면 이해하기 쉽다. 




★iptables 테이블(tables)


iptables는 3개의 테이블로 이뤄져 있으며, 각 테이블은 확장 모듈(Extension modules)을 사용하여 확장 옵션을 사용할 수 있고, 패킷을 처리하는 체인(chains)를 가진다.


테이블명 

 기본 체인명

 filter

  INPUT, FORWARD, OUTPUT, 사용자 정의 체인

 nat

 PREROUTING, OUTPUT, POSTROUTING

 mangle

 PREROUTING, OUTPUT



① filter 테이블

filter 테이블은 기본 체인과 페도라 코어에서 지원하는 방화벽처럼 INPUT 체인에 사용자 정의로 체인(RH-Firewall-1-INPUT)을 추가하여 INPUT 체인 대신에 사용할 수 있는 사용자 정의 체인을 가진다.

패킷을 어떻게 처리할 것인가를 타겟(target)이라 하는데, filter 테이블은 타겟으로 ACCEPT와 DROP이 있다.

filter 테이블은 타겟 확장(target extension)과 매치 확장(match extension) 등 두 개의 확장 모듈을 가지며, 타겟 확장 모듈을 사용하게 되면 ACCEPT, DROP 두 타겟 외에 REJECT, LOG 타겟을 추가로 사용할 수 있게 된다. 매치 확장 모듈은 접속 상태(state), 멀티포트(multiport) 리스트, limit 등의 다양한 패턴 검사를 확장하는데 사용된다.


② nat 테이블

nat 테이블은 패킷의 출발지와 목적지 주소와 포트를 변환하는데 사용되며, 기본 체인으로는 PREROUTING, OUTPUT, POSTROUTING 등이 있으며, SNAT(Source NAT), DNAT(Destination NAT), MASQUERADE, REDIRECT 등의 확장 모듈이 있다.


③ mangle 테이블

mangle 테이블은 패킷내의 TOS(Type Of Service), TTL, MARK 필드 값을 설정하거나 변경할 때 사용되며, 기본 체인으로는 PREROUTING과 OUTPUT가 있다.





★기본적인 체인


체인명

 기능

 INPUT

 로컬로 들어오는 패킷(입력 패킷)

 FORWARD

 INPUT과 OUTPUT 역할, 라우터에 방화벽을 적용할 때 쓰임

 OUTPUT

 외부로 나가는 패킷 (출력 패킷)


※명령어

들어오는 패킷 : iptables -A INPUT -p 프로토콜 --sport 포트번호 -j ACCEPT

나가는 패킷 : iptables -A OUTPUT -p 프로토콜 --dport 포트번호 -j ACCEPT

INPUT과 OUTPUT 체인을 짝으로 생각해서 방화벽을 설정해 주면 된다. 

왜냐하면 TCP나 UDP는 양방향 접속이기 때문이다.





★체인과 관련된 명령 옵션


iptables -옵션


옵션

 기능

 -N(new chain)

 새로운 체인 생성

 -X(delet chain)

 비어있는 체인 제거

 -P(policy)

 체인 정책 변경

 -L(list)

 체인의 규칙 상태 보기

 -F(flush)

 체인내의 모든 규칙 제거(방화벽 초기화<플러시>)

 -Z(zero)

 체인내의 모든 규칙의 패킷과 바이트의 카운트를 0으로 초기화






★규칙(rule)에 관련된 명령 옵션


옵션

 기능

 -A(append)

 체인 마지막에 새로운 규칙 추가

 -I(insert)

 체인 앞부분에 새로운 규칙 추가

 -D(delete)

 체인내의 규칙 번호에 있는 규칙 제거






★규칙 관련 파라미터


규칙을 적용할 패킷의 패턴에 파라미터를 붙여 지정할 수 있다.


파라미터

 설명

 -p(protocol)

 /etc/protocols 파일에 명시된 프로토콜을 지정

 -i(in-interface)

 패킷을 받는 네트워크 인터페이스로, INPUT, FORWARD, PREROUTING 체인에서 사용

 -o(out-interface)

 패킷이 나가는 네트워크 인터페이스로, FORWARD, OUTPUT, POSTROUTING 체인에서 사용됨

 -s(source)

 출발지 아이피 주소

 -d(destination)

 목적지 아이피 주소

 -j(jump)

 패킷이 규칙에 일치할 때 처리해야 할 행동(이를 target이라 함)을 지정. 기본 목표로는 ACCEPT, DROP, 사용자 정의 체인이 있다.


각 파라미터 값 앞에 except를 의미하는 ! 기호를 붙일 수 있다.

예를 들어 192.168.3.152 아이피 주소를 제외한 모든 네트워크에서 TCP 프로토콜에 접근을 거부하도록 설정하려면 다음과 같이 설정해 주면 된다. 

# iptables -A INPUT -p tcp -i eth0 -s ! 192.168.3.152 -j DROP





★필터 테이블 매치 확장(filter Table Match Extension)


옵션

 설명

 --sport

 출발지의 TCP, UDP 포트 범위를 명시한다.

 --dport

 목적지의 TCP, UDP 포트 범위를 지정한다.

 --tcp-flags

 SYN, ACK, FIN, RST, URG, PSH, ALL, NONE 등의 TCP 플래그를 지정할 수 있다.

 --syn

 처음 연결 요청으로 SYN flag를 설정한다.


※ICMP


Match

 설명

 --icmp-type

 ICMP 유형 이름 또는 수를 지정한다.






★iptables에서 지원하는 ICMP 유형(type)과 수(number)


ICMP type

 Number

 echo-reply

 0

 destination-unreachable

 3

 source-quench

 4

 redirect

 5

 echo-request

 8

 time-exceeded

 10

 parameter-problem

 11


명령어를 입력할 때 메시지 유형 대신에 숫자로 대신하여 실행할 수도 있다.

ex) iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

     iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT



※멀티 포트(multiport)


멀티 포트(multiport)는 TCP 또는 UDP의 포트를 여러 개 지정할 수 있게 해준다. 이 때 반드시 이 규칙은 프로토콜 지시자(-p) 뒤에 따라야 하며, 여러 개의 포트를 지정할 때 포트와 포트 사이를 콤마로 구분하기 때문에 콤마와 포트를 띄워서는 안 된다.


-m, --match multiport

 설명

 --source-port

 소스 포트 범위 설정

 --destination-port

 목적지 포트 범위 설정

 --port

 소스와 목적지 포트 범위가 같을 때




※리밋(limit)


로그 목표로 향하는 로그 메시지가 저장되는 속도를 제한하는데 사용된다.


--m, --match list

 설명

 --limit

 주어진 시간 프레임내에 받아들일 패킷의 최대 수

 --limit-burst

  제한을 두기 전에 받아들일 패킷의 최대 수



※스테이트(state)


연결 추적(Connection Tracking)모듈을 이용하여 내부 네트워크에서 다음과 같은 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있다.


-m, --match state

 설명

 NEW

 새로운 연결을 요청하는 패킷

 ESTABLISHED

 기존 연결의 일부인 패킷

 RELATED

 기존 연결에 속하지만 새로운 연결을 요청하는 패킷(FTP 데이터 전송, ICMP에러)

 INVALID

 어느 연결에도 속하지 않은 패킷








★필터 테이블 타겟 확장(filter Table Target Extension)


1) LOG 타겟 확장


-j LOG

 설명

 --log-level 

 기록할 로그 레벨 지정(/etc/syslog.conf와 동일)

 --log-prefix

 규칙에 대한 로그 메시지 앞에 접두사가 붙어 기록됨

 --log-ip-options

 log출력에서 IP 헤더 옵션 포함시킴

 --log-tcp-sequence

  log출력에서 TCP 패킷 시퀀스 번호를 포함시킴

 --log-tcp-options

 log 출력에서 TCP 헤더 옵션을 포함시킴



2) REJECT 타겟 확장


-j REJECT

  설명

 --reject-with

 오류 메시지를 응답해 줄 ICMP 유형을 지정한다.

 --reject-with tcp-reset

 ICMP 오류 메시지 대신에 TCP RST 메시지를 보내주면서 TCP 패킷 거부

 --reject-with echo-reply

 핑에서 echo-request에 대해서 방화벽이 echo-reply 메시지를 보내주면서 거부








★명령어 예시 총정리


▶방화벽 초기화

iptables -F

iptables -X

iptables -Z


▶루프백을 INPUT과 OUTPUT체인에 허용(루프백으로 모든 패킷이 자유롭게 들어오고 나갈 수 있도록)

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT


▶인풋과 아웃풋의 상태를 ESTABLISHED,RELATED 허용.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


▶새로운 체인을 추가 인트라넷, 인터넷

iptables -N intranet

iptables -N internet


▶출발하는 아이피를 인트라넷으로 점프하는 패킷을 받아들인다.

iptables -A INPUT -s 192.168.3.2 -j intranet

iptables -A INPUT -s 192.168.3.151 -j intranet

iptables -A INPUT -s 192.168.3.153 -j intranet

iptables -A INPUT -s 192.168.3.156 -j intranet

iptables -A INPUT -s 192.168.3.158 -j intranet


▶출발하는 아이피를 인터넷으로 점프하는 패킷을 받아들인다.

iptables -A INPUT -s 0.0.0.0/0 -j internet


▶FTP허용

iptables -A intranet -p tcp --dport 21 -m state --state NEW -j ACCEPT


▶삼바 허용

iptables -A intranet -p udp --dport 137 -m state --state NEW -j ACCEPT

iptables -A intranet -p udp --dport 138 -m state --state NEW -j ACCEPT

iptables -A intranet -p tcp --dport 139 -m state --state NEW -j ACCEPT

iptables -A intranet -p tcp --dport 445 -m state --state NEW -j ACCEPT


▶SSH 허용

iptables -A intranet -p tcp --dport 22 -m state --state NEW -j ACCEPT


▶외부에서 오는 ping 허용

iptables -A internet -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT


▶Web허용

iptables -A internet -p tcp --dport 80 -m state --state NEW -j ACCEPT


▶DNS허용

iptables -A internet -p tcp --dport 53 -m state --state NEW -j ACCEPT

iptables -A internet -p udp --dport 53 -m state --state NEW -j ACCEPT


▶SMTP허용

iptables -A internet -p tcp --dport 25 -m state --state NEW -j ACCEPT


▶서버에서 보내는 패킷의 허용 (ping, DNS, Web, https, FTP, SMTP, 삼바)

iptables -A OUTPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p udp --dport 137 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p udp --dport 138 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p tcp --dport 139 -m state --state NEW -j ACCEPT

iptables -A OUTPUT -p tcp --dport 445 -m state --state NEW -j ACCEPT


▶리눅스에서 상대방 삼바 접속하기

smbclient -L //192.168.3.xxx (상대방 IP주소입력)