######################################

##  iptables 사용하기                        ##

##                                              ##

## Written by K.S.W              2014052701 ##

## boaniyagi@naver.com                     ##

## date : 2014.5.19                            ##

######################################


iptables 의 구조 : table -> chain -> rule


table : 방화벽에서 특정한 기능을 제공하는 것

table 종류 : filter, nat, mangle 

filter table 역할 : 패킷을 필터링하는 기능을 가지고 있다.

nat table 역할 : 패킷을 필터링하지는 않고 단순히 패킷의 소스나 목적지 주

소를 변환시켜 주는 기능을 가지고 있다.

mangle table 역할 : 패킷의 특성을 변경하거나 지정하는 기능을 한다


chain : 패킷이 이동하는 경로를 나타내는 것

rule  : 각 chain 에 설정하는 일련의 방화벽 정책


- iptables 도움말 보기

# iptables --help | head -20



# iptables -F


- 방화벽 chain 보기

# iptables -t filter -nL

# iptables -t nat -nL

# iptables -t mangle -nL





- 방화벽 룰 추가하기


-s (단일 IP, 복수 IP(192.168.0/24, 192.168.0/25, 192.168.128/25)

--sport (단일 port, 복수 port (-m multiport 모듈을 사용한다.)) 


- 단일 IP 지정해서 방화벽 룰을 설정한다.

# iptables -t filter -A INPUT -s 192.168.56.250 -j DROP

# iptables -t filter -A INPUT -s 192.168.56.251 -j DROP

# iptables -t filter -A INPUT -s 192.168.56.252 -j DROP

# iptables -t filter -A INPUT -s 192.168.56.210 -j DROP



- 방화벽 룰 확인하기

# iptables -t filter -nL INPUT

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

DROP       all  --  192.168.56.250       0.0.0.0/0           

DROP       all  --  192.168.56.251       0.0.0.0/0           

DROP       all  --  192.168.56.252       0.0.0.0/0 



# iptables -t filter -nvL INPUT

Chain INPUT (policy ACCEPT 147K packets, 22M bytes)

 pkts bytes target     prot opt in     out     source               destination         

    0     0 DROP       all  --  *      *       192.168.56.250       0.0.0.0/0           

    0     0 DROP       all  --  *      *       192.168.56.251       0.0.0.0/0           

    0     0 DROP       all  --  *      *       192.168.56.252       0.0.0.0/0           

    0     0 DROP       all  --  *      *       192.168.56.210       0.0.0.0/0           



- 방화벽 룰 테스트하기

- hping 설치하기

hping2.0.0-rc3.tar.gz


56.210(S2)# tar xzf hping2.0.0-rc3.tar.gz 

56.210(S2)# cd hping2-rc3

56.210(S2)# ./configure && make



56.210(S2)# mkdir -p /usr/local/man/man8

56.210(S2)# make install



- 192.168.56.200 으로 192.168.56.250 의 IP를 스푸핑하고 

- SYN 패킷을 두 개 보내본다.

56.210(S2)# hping -a 192.168.56.250 192.168.56.200 -S -c 2 -i u1000

56.210(S2)# hping -a 192.168.56.251 192.168.56.200 -S -c 1 

56.210(S2)# hping -a 192.168.56.252 192.168.56.200 -S -c 1



- 패킷이 들어왔는지 확인한다.

56.200(S1)# iptables -nvL INPUT 

Chain INPUT (policy ACCEPT 147K packets, 22M bytes)

 pkts bytes target     prot opt in     out     source               destination         

    2    80 DROP       all  --  *      *       192.168.56.250       0.0.0.0/0           

    1    40 DROP       all  --  *      *       192.168.56.251       0.0.0.0/0           

    1    40 DROP       all  --  *      *       192.168.56.252       0.0.0.0/0           

    0     0 DROP       all  --  *      *       192.168.56.210       0.0.0.0/0           



- 방화벽 룰 삭제하기

- 삭제방법 2가지가 있다.

- 첫 번째 : 동일한 룰을 가지고 삭제 

- 두 번째 : 룰번호로 삭제

# iptables -t filter -D INPUT -s 192.168.56.252 -j DROP

# iptables -t filter -D INPUT -s 192.168.56.250 -j DROP

# iptables -t filter -D INPUT -s 192.168.56.251 -j DROP

# iptables -t filter -D INPUT -s 192.168.56.210 -j DROP



# iptables -t filter -D INPUT 2

# iptables -t filter -D INPUT 3


숫자는 구성되어있는 정책 번호임 (iptables -nvL INPUT)


# iptables -t filter -nL INPUT

Chain INPUT (policy ACCEPT)

target     prot opt source               destination 


===================================================================


IPTABLES-LAB> iptables 를 이용하여 아래 서비스들을 추가하여 보자.


/etc/services  <-- 서비스명이 있다.


서비스명 : www(80) , ssh(22)   <-- ACCEPT  

룰순서   : www(80) , ssh(22)

나머지 모두 : DROP


# iptables -F

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# iptables -A INPUT -j DROP



#  iptables -nL INPUT

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 

DROP       all  --  0.0.0.0/0            0.0.0.0/0  


===================================================================


===================================================================

IPTABLES-LAB> 다양한 방법으로 rule 을 생성해보자.


# iptables -F

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# iptables -A INPUT -j ACCEPT -p tcp --dport 22

# iptables -j ACCEPT -p tcp --dport 25 -A INPUT

# iptables -A INPUT -m comment --comment 'rsync server' \

> -p tcp --dport 873 -j ACCEPT

# iptables -j DROP -A INPUT



# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           /* rsync server */ tcp dpt:873 

DROP       all  --  0.0.0.0/0            0.0.0.0/0


===================================================================


===================================================================

IPTABLE-LAB> 사용자 정의 체인을 생성/삭제/변경 해보자.


# iptables -N DROPIP

# iptables -N ACCEPTIP

# iptables -nL




# iptables -X DROPIP

# iptables -X ACCEPTIP

# iptables -nL



# iptables -N DROP_IP

# iptables -N ACCEPT_IP

# iptables -nL

  :

  :

Chain ACCEPT_IP (0 references)

target     prot opt source               destination         


Chain DROP_IP (0 references)

target     prot opt source               destination         



# iptables -E DROP_IP DROP-IP

# iptables -E ACCEPT_IP ACCEPT-IP

# iptables -nL

  :

  :

Chain ACCEPT-IP (0 references)

target     prot opt source               destination         


Chain DROP-IP (0 references)



===================================================================


# iptables -I INPUT 3 -p udp --dport 53 -j ACCEPT

# iptables -I INPUT 4 -p tcp --dport 53 -j ACCEPT



- 쿼리가 안된다.

# dig @localhost sbs.com +short


# iptables -I INPUT 5 -p udp --sport 53 -j ACCEPT

# iptables -I INPUT 6 -p tcp --sport 53 -j ACCEPT

#  iptables -nL INPUT

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 

ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53 

ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp spt:53 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp spt:53 

DROP       all  --  0.0.0.0/0            0.0.0.0/0           



# dig @localhost sbs.com +short

192.168.56.200



IPTABLES-LAB> 사용자 정의체인을 생성/변경/삭제 해보자.

--> 복습

- 생성

# iptables -N DROPIP

# iptables -N DROPPORT

# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination         


Chain DROPIP (0 references)

target     prot opt source               destination         


Chain DROPPORT (0 references)

target     prot opt source               destination         


- 이름 변경

# iptables -E DROPIP DROP_IP

# iptables -E DROPPORT DROP_PORT

# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination         


Chain DROP_IP (0 references)

target     prot opt source               destination         


Chain DROP_PORT (0 references)

target     prot opt source               destination         


# iptables -E DROPIP DROP-IP

# iptables -E DROP_PORT DROP-PORT

# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination         


Chain DROP-IP (0 references)

target     prot opt source               destination         


Chain DROP-PORT (0 references)

target     prot opt source               destination         


- 삭제

# iptables -X DROP-IP

# iptables -X DROP-PORT

# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination   


======================================================================

IPTABLES-LAB> 방화벽에 inbound 정책에 설정되어있는 룰을 변경하여 yum을 사용할 수 있도록 해보자.


*** My Server 입장에서 보면 ***

자신이 서비스하는 것을 허용하기 위해서는 : --dport 

외부의 서비스하는 것을 허용하기 위해서는 : --sport 

*** My Server 입장에서 보면 ***

               

DNS/WEB server                            My Server

+-------------+                        +-----------------+

| -d, --dport   | INPUT      OUTPUT | -s, --sport       |

|  DNS(53)     <====================+                   |

|  WEB(80) |  |                        |  yum install mc  |

|  Server1 |   |                        |  Server2          |

|                +==================>                     |

| -s, --sport   | OUTPUT     INPUT  | -d, --dport      |

+-------------+                         +-----------------+

192.168.56.200                             192.168.56.201


-- 순서 --

1. My Server 에 inbound 룰 설정

2. yum 을 이용할 수 있도록 룰 설정

3. yum 을 이용해서 패키지 설치


조건 

- yum 을 사용할 수 있어야 한다.

- ex)

- yum -y install mc 했을때 설치가 되야한다. 

- yum -y remove mc 했을때 설치가 되야한다. 


inbound  : INPUT

outbound : OUTPUT (현재 없음) 



1. My Server 에 inbound 룰 설정

- inbound 정책을 INPUT chain에 설정한다.


# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25 

DROP       all  --  0.0.0.0/0            0.0.0.0/0  



- 아래 mc 는 설치가 안된다.

dpt (dport, destination port) 만 ACCEPT 시켜주면 안된다.

yum으로 내가 서버에 요청하는 것이기 때문에

INPUT기준으로 sport를 허용해 주어야 한다.


- yum 을 사용하다가 안되면 

- Ctrl + Z 를 누르고 kill -9 %1 로 프로세스를 종료하면 된다.

# yum -y install mc


2. yum 을 이용할 수 있도록 룰 설정

- yum 을 사용하기 위해서는 외부의 dns 와 web 에 접근해야 한다.

# iptables -I INPUT 5 -p udp --sport 53 -j ACCEPT

# iptables -I INPUT 6 -p tcp --sport 80 -j ACCEPT

# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25 

ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp spt:53 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp spt:80



3. yum 을 이용해서 패키지 설치

- 아래 mc 는 설치가 된다.

# yum -y install mc


======================================================================


======================================================================

IPTABLES-LAB> iptables 의 룰 파일을 저장/복구해보자


# chkconfig --list iptables

iptables       0:off 1:off 2:on 3:on 4:on 5:on 6:off


# iptables-save > /etc/sysconfig/iptables

# cat /etc/sysconfig/iptables

# Generated by iptables-save v1.3.5 on Thu May 15 21:57:52 2014

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [1485:111488]

:ACCEPT-IP - [0:0]

:DROP-IP - [0:0]

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 

-A INPUT -p udp -m udp --dport 53 -j ACCEPT 

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 

-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT 

-A INPUT -p udp -m udp --sport 53 -j ACCEPT 

-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT 

-A INPUT -j DROP 

COMMIT

# Completed on Thu May 15 21:57:52 2014


# vi /etc/sysconfig/iptables



-- /etc/sysconfig/iptables --


# Generated by iptables-save v1.3.5 on Thu May 15 21:57:52 2014

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [1485:111488]

:ACCEPT-IP - [0:0]

:DROP-IP - [0:0]

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 

-A INPUT -p udp -m udp --dport 53 -j ACCEPT 

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 

-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT 

-A INPUT -p udp -m udp --sport 53 -j ACCEPT 

-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT 

-A INPUT -i lo -j ACCEPT                      <-- 추가한다.

-A INPUT -j DROP 

COMMIT

# Completed on Thu May 15 21:57:52 2014

-- /etc/sysconfig/iptables --



# iptables-restore /etc/sysconfig/iptables


- lo 가 inbound 쪽에 추가된걸 확인할 수 있다.

# iptables -nvL INPUT

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination         

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 

   28  1796 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 

    5   326 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 

    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp spt:53 

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:80 

    7   694 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           


======================================================================


======================================================================

oops firewall

김정균씨가 만든 방화벽룰을 분석해볼 것!!!

(안녕 리눅스 개발자)


참고 : http://oops.org/?t=lecture&sb=firewall&n=1


/etc/init.d/iptables 분석

======================================================================


======================================================================

IPTABLES-LAB> iptables 를 이용하여 아래 서비스들을 추가하여 보자.

--> 해보길.. 복습

서비스명 : www(80), SSH(22), DNS(53), Email(25)

룰순서   : www(80), DNS(53), Email(25), SSH(22)

나머지   : DROP


조건 

- yum 을 사용할 수 있어야 한다.

- ex)

- yum -y install mc 했을때 설치가 되야한다. 

- yum -y remove mc 했을때 설치가 되야한다. 


yum 을 사용하기 위해서는 외부의(outbound) dns 와 web 에 접근해야 한다.


# iptables -A INPUT -p tcp --dport www -j ACCEPT

# iptables -A INPUT -p udp --dport domain -j ACCEPT

# iptables -A INPUT -p tcp --dport smtp -j ACCEPT

# iptables -A INPUT -p tcp --dport ssh -j ACCEPT

# iptables -A INPUT -p tcp --dport domain -j ACCEPT

# iptables -A INPUT -p udp --sport 53 -j ACCEPT

# iptables -A INPUT -p tcp --sport 80 -j ACCEPT

# iptables -A INPUT -j DROP -m comment --comment "ALL DROP"


- /etc/init.d/iptables 의 start 부분에 아래처럼 적용되어 있다.

- $IPTABLES-restore $OPT $IPTABLES_DATA

# iptables-save > /etc/sysconfig/iptables


- 잘 안되면 복구 

# iptables-restore /etc/sysconfig/iptables 


위에서 INPUT 으로 설정한 룰을 OUTPUT 으로도 정책을 세우시오.

inbound 트래픽은  OUTPUT 에 --sport 를 이용해서 정책을 설정한다.

outbound 트래픽은  OUTPUT 에 --dport 를 이용해서 정책을 설정한다.

OUTPUT 의 마지막은 DROP 으로 처리한다.


# yum install mc 


외부에서 ssh 접근 O

외부에서 웹 접근 O


# iptables -A OUTPUT -p tcp --sport www -j ACCEPT

# iptables -A OUTPUT -p udp --sport domain -j ACCEPT

# iptables -A OUTPUT -p tcp --sport smtp -j ACCEPT

# iptables -A OUTPUT -p tcp --sport ssh -j ACCEPT

# iptables -A OUTPUT -p tcp --sport domain -j ACCEPT

# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

# iptables -A OUTPUT -j DROP -m comment --comment "ALL DROP"


내부에서 외부로 SSH 접근이 허용 O

# iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

# iptables -I INPUT 8 -p tcp --sport 22 -j ACCEPT

======================================================================


======================================================================

IPTABLES-LAB> 로컬DNS에 연결을 요청해서 IP를 출력하는 룰을 설정해보자.


*** 패킷의 출발지가 기준 ***

C           S

-----------+  INPUT  --dport 

             |

             |

<----------+  OUTPUT --sport 

- INPUT 으로 들어왔다가 OUTPUT 으로 패킷이 나간다.


INPUT  체인에서 로컬 서버가 제공하는 서비스 포트로 클라이언트가 접근하기 위해서는  --dport 를 사용한다.

OUTPUT 체인에서 로컬 서버가 제공하는 서비스 포트로 들어온 후 클라이언트로 응답을 해주기 위해서는  --sport 를 사용한다.


S          C

+---------->  INPUT  --sport 

|          

|           

+----------+  OUTPUT --dport 

- OUTPUT 으로 나갔다가 INPUT 으로 패킷이 들어온다.


OUTPUT 체인에서 외부 서버가 제공하는 서비스 포트로 로컬서버가 는 --dport 를 사용한다.

INPUT  체인에서 외부 서버가 제공하는 서비스 포트로 로컬서버가 접근하기 위해서는 --sport 를 사용한다.


조건은 아래 옵션을 이용할 것!


-i : INPUT  체인에서 interface 지정  

ex) -i lo, -i eth1


-o : OUTPUT 체인에서 interface 지정

ex) -o lo, -o eth1 


-s : 출발지 IP

-s 192.168.56.200, -s 192.168.56.0/24


-d : 도착지 IP

-d 192.168.56.200, -d 192.168.56.0/24


# /etc/init.d/named restart

# vi /etc/resolv.conf 

-- /etc/resolv.conf --

nameserver 127.0.0.1

-- /etc/resolv.conf --

# iptables -F

# dig sbs.com +short

192.168.56.200


# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# iptables -P INPUT DROP

# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

# iptables -P OUTPUT DROP


# iptables -A INPUT  -i lo -j ACCEPT

# iptables -A OUTPUT -o lo -j ACCEPT

# dig sbs.com +short

192.168.56.200


======================================================================