★방화벽(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주소입력)
'IT's Life > Linux' 카테고리의 다른 글
UNIX / Linux 시스템 구조 (0) | 2019.08.08 |
---|---|
유닉스와 리눅스의 밀접한 관계 (0) | 2019.08.08 |
솔라리스와 FreeBSD / 리눅스의 과거 사건 (0) | 2019.08.08 |
유닉스의 거친 역사 (0) | 2019.08.08 |
운영 체제란 무엇입니까, 운영 체제 개요 (0) | 2019.08.08 |