본문 바로가기

OS-서버/리눅스-유닉스

리눅스 방화벽 iptables

반응형

ி 개요

 
iptables는 리눅스에서 제공하는 기본 방화벽이며, 타 방화벽보다 빠르고 트래픽도 적다.
iptables에서 방화벽 규칙을 세우고,
패킷 필터링 기능은 리눅스 커널 내에 "netfilter" 프레임워크가 담당한다.



ி 구조

 
iptables은 총 4개의 테이블로 구성된다.

filter

 
방화벽의 주된 테이블로서 특정 룰에 따라서 패킷을 통제하는 역할을 한다.

➽ 체인(Chain)
체인은 table의 하위 개념으로 정해진 규칙에 따라서 패킷의 흐름을 제어한다.

filter에는 기본적으로 세가지 체인이 있다.
INPUT, OUTPUT, FORWARD

 

 

INPUT은 방화벽으로 들어오는 패킷,
OUTPUT은 방화벽에서 나가는 패킷이다.
FORWARD는 방화벽을 통과하는 패킷인데,
외부에서 받은 패킷을 다른 네트워크로 전달하는 기능이다. 라우터를 생각해보자.
데이터는 항상 라우터로 전송되지만 실제로는 라우터 자체로 보내지는 경우는 거의 없고 거쳐가기만 한다.
즉 내부의 다른 서버에서 방화벽을 통해 외부로 나가는 패킷을 필터링한다.
그 외에 POSTROUTING 체인, PREROUTING 체인이 있다.

iptables의 체인에서 룰 설정을 할 때 가장 중요한 것은 순서다.
앞 쪽 체인 룰이 우선순위가 높다.
만약 A 패킷을 거부하는 룰이 먼저 등록되있으면 그 이후에 A 패킷 허용룰을 작성해도 맨 앞에 등록된 룰 때문에 무력화된다.
따라서 허용하는 정책을 먼저 넣어야한다.

만약 패킷 규칙이 없다면 기본 정책이 적용된다.
기본 정책은 policy ACCEPT, policy DROP으로 설정하며, 기본 값은 DROP이다.


nat

 
방화벽을 통해 내부 네트워크로 들어가거나 외부 네트워크로 나갈 때 주소를 변환하는 역할을 한다.

nat에서 자주 사용하는 체인은 두 가지가 있다.

POSTROUTING 체인 Source NAT(SNAT)타겟과 매칭되어 내부 네트워크에서 방화벽을 통해 외부로 나갈 때 사용한다.
쉽게 말해 내부 ip에서 외부 ip로 바꿔주는 역할이며,
하나의 공인 IP를 통해 사설 대역을 만드는 공유기의 용도로도 사용할 수 있다.

PREROUTING 체인 Destination NAT(DNAT)타겟과 매칭되어 주로 외부에서 방화벽 내부 서버로 향하는 패킷을 포워딩 할 때 사용한다.
사설 ip로 서버를 운영하면서 외부로 서비스 하고자 할 때 사용한다.



mangle

 
패킷의 TTL이나 TOS(Type of Service : 패킷전송 우선순위)값을 변경하거나 매칭할 때 사용한다.

mangle에서 자주 사용하는 체인은 PREROUTING, OUTPUT이다.

PREROUTING 체인은 라우팅 경로가 결정되기 전에 방화벽으로 들어오는 패킷을 변경하거나 매칭한다.
OUTPUT 체인은 내부에서 생성된 패킷이 방화벽을 통해 나갈 때 변경하거나 매칭한다.



ி 설치

 
OS에 iptables가 없다면 아래처럼 별도 설치가 가능하다.

설치여부 확인

 
# rpm -qa | grep iptables

설치

 
# yum install -y iptables

부팅 시 자동 실행

 
# chkconfig iptables on

iptables 시작

 
# service iptables start



ி 문법

 
명령어 형식은 다음과 같다.
iptables 테이블, 체인, 규칙, 정책


명령어

 
-A (--append) - 새 규칙 추가
-I (--insert) - 새 규칙 삽입(최상위에 규칙 추가됨)
-R (--replace) - 새 규칙으로 교체
-D (--delete) - 규칙 삭제
-L (--list) - 규칙 출력
-F (--flush) - 체인으로부터 규칙을 모두 제거
-N (--new) - 새 체인 생성
-X (--delete-chain) - 체인 삭제
-P (--policy) - 기본정책 변경
-C (--check) - 패킷을 테스트한다.
-Z (--zero) - 모든 체인의 패킷과 바이트 카운터 값을 0으로 만든다.



매치(match)

 
패킷 처리 시 만족되는 조건을 뜻한다.

-t(table) - 처리될 테이블
-p(protocol) - 프로토콜명 또는 포트번호
-s(source) - 출발지
-d(destination) - 목적지
-i(in-interface) - 입력 인터페이스
-o(out-interface) - 출력 인터페이스
-j(jump) - 패킷 통제 여부
-y(syn) - 접속 요청 패킷인 SYN 패킷 미허용
-f(fragment) - 두 번째 이후의 조각에 대해 규칙을 명시한다.
-m(--match) - 특정 모듈과의 매치(요청 시 자동 응답)
--state - 연결 상태와의 매칭



타겟(target)

 
패킷 규칙과 일치할 때의 동작을 지정한다.

ACCEPT - 패킷 수용
DROP - 패킷 드롭
REJECT - 패킷을 드롭한 뒤 응답
LOG - 패킷 기록
RETURN - 호출 체인 내에서 패킷 처리 지속



연결 추적(Connection Tracking)

 
패킷에 대한 연결 정보 상태 테이블에 기록한다.
연결된 상태의 패킷은 패턴 검사를 수행하지 않아서 부하가 줄고,
연결을 감시하고 제한하기 때문에 연결된 상태인 것처럼 위조한 패킷을 차단할 수 있다.

NEW - 패킷이 새로 연결된 상태
ESTABLISHED - 패킷이 기존에 연결된 상태
RELATED - 이미 연결된 패킷과 연관성이 있는 상태
INVALID - 연결 여부가 확인이 안되는 상태




ி 실습

 


초기 설정

 

centos 6은 iptables를 기본 방화벽으로 쓰고

centos 7버전은 기본 방화벽을 firewalld로 사용한다. 

필자가 실습한 환경은 centos 6 버전이다.

 

우선 IP Forwarding 기능을 사용하려면 옵션을 활성화 해야한다.

➽ 임시적으로 활성화 하려면 다음 명령을 입력한다.
# echo 1 > /proc/sys/net/ipv4/ip_forward

➽ 영구적으로 활성화 하려면 다음 명령을 입력한다.
# vi /etc/sysctl.conf에서 net.ipv4.ip_forward 값을 1로 변경한다.
# sysctl -p /etc/sysctl.conf - 변경사항 적용

➽ 편의를 위해 iptables 초기 스크립트를 만들어놓는다.

#!/bin/sh

# 규칙 초기화
iptables -F

# 기본 정책 설정
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

... 규칙 입력 ...

# 설정 저장 및 방화벽 재시작
service iptables save
service iptables restart


방화벽 설정 백업

 
 
➽ 방화벽 설정 백업
# iptables-save > 190927.rules

➽ 방화벽 설정 복구
# iptables-restore < 190927.rules



문법 예시

 

➽ 적용 상태 확인
iptables -nvL

➽ 특정 IP 차단
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP

➽ 특정 포트 허용
iptables -A INPUT -p tcp --dport xxxx ACCEPT

➽ 모든 포트 차단
iptables -A INPUT -p tcp --dport 0:65535 -j DROP

➽ 루프백 허용
iptables -A INPUT -i lo -j ACCEPT

➽ 내부 네트워크 접속
iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT

➽ http를 https로 전환
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 443

 

➽ FTP 포트 허용 iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp –-sport 21 -j ACCEPT

 

➽ MAC 주소 제어
iptables -A INPUT -s xxx.xxx.xxx.xxx -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT

➽ 내부 및 외부 네트워크간 인터넷 허용
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -o eth0 -j ACCEPT
iptables -n nat -A POSTROUTING -o eth1 -j masquerade
3번 째 줄에 masquerade는 eth1에서 나가는 ip를 사용한다.
NIC 카드의 IP를 사용하겠다는 뜻이다.

➽ 주소 변경
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to xxx.xxx.xxx.xxx
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx

➽ 목적지에 도달하지 못한 패킷 허용
iptables -A INPUT -i eth0 -p icmp --icmp-type 3 -j ACCEPT

➽ 조각난 패킷 차단
iptables -A INPUT -f -j DROP

➽ NULL 패킷 차단
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

➽ 연결상태가 ESTABLISHED, RELATED인 패킷을 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

➽ 통신규약에서 벗어난 비정상적인 패킷을 로깅하고 차단
iptables -I FORWARD 1 -m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID_DROP"
iptables -I FORWARD 2 -m conntrack --ctstate INVALID -j DROP

➽  임계치 차단(1초에 10회 트래픽 발생시 드랍)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/s -j DROP



문제

 

 

 

 문제1

 

1-1) 모든 PC에서 방화벽 eth0,eth1,eth2 중에 eth1과 eth2로 

       ping을 허용하고 로그를 남긴다.

 

 

 

1-2) 방화벽 eth0으로 ping이 들어오면 그에 대한 로그가 기록 되어야 하며, 

       해당 패킷은 차단 되어야 한다.

 


1-3) 방화벽 담당자
($admin)만 방화벽으로 ssh 접속이 되어야 한다.

 


1-4) 방화벽에 ssh 접속이 실패했을 때 로그가 기록 되어야 한다.

 

 

 

 

 

 

 

 문제2

 

 

 

2-1) hacker PC($hacker) 에서 사무실 PC($WPC)로 ping이 되도록 한다.

 


2-2) 
사무실PC($WPC) <---> Server($server)로만 ssh접속가능

 


2-3) 모든 사용자는 web 서버
(192.168.136.200)로 홈페이지 접속이 되도록 한다.

       port 80,443(HTTP,HTTPS)

 

     

 

2-4) 모든 사용자가 server($server)를 이용해서 메일 보내기 / 받기가 가능하도록 한다.

 

 

2-5) [사무실 PC와 Server]($WPC_SV)는 yum install이 가능하도록 한다.

     

 

 

 

 

더보기

1-1) 모든 PC에서 방화벽 eth1, eth2 ip로 ping이 되어야 한다. / 로그기록

 

iptables -A INPUT ! -i eth0 -p icmp -j LOG --log-prefix "icmp_accept"

iptables -A INPUT ! -i eth0 -p icmp -j ACCEPT

iptables -A OUTPUT ! -o eth0 -p icmp -j ACCEPT

 

 

 

 

 

1-2) 방화벽 eth0 ip로 ping이 들어오면 그에 대한 로그가 기록 되어야 하며, 해당 패킷은 

차단 되어야 한다.


iptables -A INPUT -i eth0 -p icmp -j LOG --log-prefix "icmp_drop"
iptables -A INPUT -i eth0 -p icmp -j DROP

 

 

 

 

 

 

1-3) 방화벽 담당자($admin)에서만 방화벽으로 ssh접속이 되어야한다.


iptables -A INPUT -s $admin -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d $admin -p tcp --sport 22 -j ACCEPT

 

 

 

 

 

 

1-4) 방화벽에 ssh 접속이 실패했을 때 그에 대한 로그가 기록 되어야 한다.

 

 iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "ssh-drop "

 

 

 

더보기

2-1) hacker PC($hacker) 에서 사무실 PC($WPC) 로 ping이 되도록 한다.


hacker ----------------------FW------------------------->사무실PC



iptables -A FORWARD -s $hacker -d $WPC -p icmp -j ACCEPT
iptables -A FORWARD -s $hacker -d $WPC -p icmp -j ACCEPT
ipatbles -A FORWARD -m conntrack --ctstate ESTABLISHEd -j ACCEPT

 

 

 

 

 

2-2) 사무실PC($WPC) <---> Server($server)로만 ssh접속가능

 


iptables -A FORWARD -s $WPC -d $server -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -s 
$server -d $WPC -p tcp --dport 22 -j ACCEPT



 

 

 

2-3) 모든사용자는 web 서버(192.168.136.200)로 홈페이지 접속이 되도록한다.

     

  iptables -A FORWARD -d 192.168.136.200 -p tcp -m multiport -dport 80,443 

 -j ACCEPT

 


2-4) 모든 사용자가 Server($server)를 이용해서 메일 보내기 / 메일 받기가 

      가능하도록 하자.(smtp/pop3/imap 로그 기록)

<유형1>

any -------------------- FW ---------------->Server 25
  iptables -A FORWARD -d $server -p tcp --dport 25 -j ACCEPT
  iptables -A FORWARD -s $server -p tcp --sport 25 -j ACCEPT
any<------------------- FW ---------------- Server 25
            
 any ------------------- FW ---------------->Server 110
  iptables -A FORWARD -d $server -p tcp --dport 110 -j ACCEPT
  iptables -A FORWARD -s $server -p tcp --sport 110 -j ACCEPT
 any<------------------ FW ---------------- Server 110

 

 any ------------------- FW ---------------->Server 143
  iptables -A FORWARD -d $server -p tcp --dport 143 -j ACCEPT
  iptables -A FORWARD -s $server -p tcp --sport 143 -j ACCEPT
 any<------------------ FW ---------------- Server 143

 

 

 

<유형2>

iptables -A FORWARD -s $server -p tcp -m multiport --sport 25,110,143 -j ACCEPT

iptables -A FORWARD -d $server -p tcp -m multiport --dport 25,110,143 -j ACCEPT

 

메일 서버에서
systemctl stop firewalld
nc -l -p n ( n번 포트를 열고 기다린다)

 

 

 

 

 

 

2-5) [사무실 PC와 Server]($WPC_SV)는 yum install이 가능하도록 하자.

먼저 방화벽에서는 외부의 DNS서버로 네임쿼리가 가능하도록 해야한다.

 

 

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPTiptables -A FORWARD -s $WPC_SV -d 8.8.8.8 -p udp --dport 53 -j ACCEPT

 

iptables -A FORWARD -s $WPC_SV -d 0.0.0.0/0 -p tcp --dport 80 -j ACCEPT
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형