정보보안(구버전)/작업중 2016. 1. 31. 16:12

13. CentOS를 이용한 'iptables' 방화벽

 

 

VMware를 이용하여 'CentOS 64-bit(iptables&snort)' 이미지를 오픈하여 실행한다.

 

 

 - 방화벽 기본 준비 사항 설정

 

[root@snort ~]# chkconfig --list iptables          서비스 등록 상태 확인

[root@snort ~]# service iptables status            iptables 실행 상태 확인

[root@snort ~]# service iptables start               iptables 시작

 


 - 방화벽 설정

 

 iptables [-options] [-Action]

 

# iptables -f filter -L --line
                         ---------- Action


 - table 종류

 

     filter  : 기본 테이블, 옵션이 없을 경우 자동으로 지정됨. 방화벽의 본 기능 테이블
     nat : 사설망, 공인망 분할 시 사용, MASQUERADE, DNAT, SNAT
     mangle : 방화벽을 라우터로 사용할 경우

 

 

# iptables -L : filter 테이블에 설정된 리스트 보기
# iptables -L --line : 테이블 정보 출력시 Rule의 번호 보기

# iptables -A Chain -p Protocol -j Rule-Policy(DROP, REJECT, ACCEPT) : Rule 설정
               -I

 

              -A : Append, Rule의 마지막 라인에 추가
              -I : Insert, Rule의 첫번째 라인에 추가
 

 

# iptables -A INPUT -p icmp -j DROP
# iptables - L INPUT --line

 

Chain는 방화벽에서 사용되는 Rule이 등록되는 곳이며, 다음과 같은 기본 Chain을 구성하고 있다.
 
   INPUT : 외부에서 내부로 들어오는 데이터에 대해서 감시
   OUTPUT : 내부에서 외부로 나가는 데이터에 대해서 감시
   FORWARD : 외부 -> 내부 네트워크 카드로, 내부 -> 외부 네트워크 카드로 전달

 


Ex1) iptables -A INPUT -p icmp -j DROP / REJECT


[root@snort ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps
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        
ACCEPT     all  --  anywhere             192.168.122.0/24    state RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere           
ACCEPT     all  --  anywhere             anywhere           
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited


Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

 


[root@snort ~]# iptables -A INPUT -p icmp -j REJECT
[root@snort ~]# iptables -L INPUT --line
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
2    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
3    ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps
4    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps
5    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
6    ACCEPT     icmp --  anywhere             anywhere
7    ACCEPT     all  --  anywhere             anywhere
8    ACCEPT     tcp  --  anywhere             anywhere          state NEW tcp dpt:ssh
9    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
10   REJECT     icmp --  anywhere             anywhere          reject-with icmp-port-unreachable  

 


[root@snort ~]# iptables -I INPUT -p icmp -j DROP
[root@snort ~]# iptables -L INPUT --line
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       icmp --  anywhere             anywhere   

2    ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
3    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
4    ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps
5    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps
6    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
7    ACCEPT     icmp --  anywhere             anywhere
8    ACCEPT     all  --  anywhere             anywhere
9    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
10   REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
11   REJECT     icmp --  anywhere             anywhere            reject-with icmp-port-unreachable

 

 

 - Rule 삭제

 

# iptables -L INPUT --line
# iptables -D INPUT RULE_NUMBER
# iptables -F -t filter  (-F : 테이블 내 규칙을 모두 삭제)

 


 - Policy 변경

 

# iptables -t filter -P INPUT DROP Chain의 Policy 변경
# iptables -L INPUT

    Policy와 Rule이 모드 존재할 경우 Rule을 적용함, Policy는 Rule보다 우선 순위가 낮다.
    Rule이 없을 경우에는 Policy가 사용됨

 

 


Ex2) ICMP 차단 및 허용

 

# iptables -L --line
# iptables -F -t filter
# iptables -P INPUT DROP <------------------------ Policy

 

 - window 명령어창에서 ping 명령어 사용(PC>ping 192.168.10.137)

 


# iptables -A INPUT -p icmp -j REJECT <------------- Rule

 

 - window 명령어창에서 ping 명령어 사용(PC>ping 192.168.10.137)

 


# iptables -I INPUT -p icmp -j ACCEPT <------------- Rule

 

 - window 명령어창에서 ping 명령어 사용(PC>ping 192.168.10.137)

 


# iptables -D INPUT 2 <----------------------------- num 2 Rule 삭제

 


[root@snort ~]# iptables -L --line
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
2    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
3    ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps
4    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps
5    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
6    ACCEPT     icmp --  anywhere             anywhere
7    ACCEPT     all  --  anywhere             anywhere
8    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
9    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
10   REJECT     icmp --  anywhere             anywhere            reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             192.168.122.0/24    state RELATED,ESTABLISHED
2    ACCEPT     all  --  192.168.122.0/24     anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
5    REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
6    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited


Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination        

 

 

[root@snort ~]# iptables -F -t filter
[root@snort ~]# iptables -L --line
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

 

 

[root@snort ~]# iptables -P INPUT DROP  <-------  Policy
[root@snort ~]# iptables -L --line
Chain INPUT (policy DROP)
num  target     prot opt source               destination     

   

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination    

    

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination     


C:\Users\Administrator>ping 192.168.10.137

Ping 192.168.10.137 32바이트 데이터 사용:
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.

192.168.10.137에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 0, 손실 = 4 (100% 손실),

 

 

 

[root@snort ~]#  iptables -A INPUT -p icmp -j REJECT  <------------- Rule
[root@snort ~]# iptables -L --line
Chain INPUT (policy DROP)
num  target     prot opt source               destination        
1    REJECT     icmp --  anywhere             anywhere            reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination   

     

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination        


C:\Users\Administrator>ping 192.168.10.137

Ping 192.168.10.137 32바이트 데이터 사용:
192.168.10.137의 응답: 대상 포트에 연결할 수 없습니다.
192.168.10.137의 응답: 대상 포트에 연결할 수 없습니다.
192.168.10.137의 응답: 대상 포트에 연결할 수 없습니다.
192.168.10.137의 응답: 대상 포트에 연결할 수 없습니다.

192.168.10.137에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),

 

 


[root@snort ~]# iptables -I INPUT -p icmp -j ACCEPT  <------------- Rule
[root@snort ~]# iptables -L --line
Chain INPUT (policy DROP)
num  target     prot opt source               destination        
1    ACCEPT     icmp --  anywhere             anywhere           
2    REJECT     icmp --  anywhere             anywhere            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination        


C:\Users\Administrator>ping 192.168.10.137

Ping 192.168.10.137 32바이트 데이터 사용:
192.168.10.137의 응답: 바이트=32 시간<1ms TTL=64
192.168.10.137의 응답: 바이트=32 시간=27ms TTL=64
192.168.10.137의 응답: 바이트=32 시간<1ms TTL=64
192.168.10.137의 응답: 바이트=32 시간=1ms TTL=64

192.168.10.137에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 0ms, 최대 = 27ms, 평균 = 7ms

 

 


[root@snort ~]# iptables -D INPUT 2
[root@snort ~]# iptables -L --line
Chain INPUT (policy DROP)
num  target     prot opt source               destination        
1    ACCEPT     icmp --  anywhere             anywhere     

      

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination    

    

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination    

    

C:\Users\Administrator>ping 192.168.10.137

Ping 192.168.10.137 32바이트 데이터 사용:
192.168.10.137의 응답: 바이트=32 시간<1ms TTL=64
192.168.10.137의 응답: 바이트=32 시간<1ms TTL=64
192.168.10.137의 응답: 바이트=32 시간<1ms TTL=64
192.168.10.137의 응답: 바이트=32 시간<1ms TTL=64

192.168.10.137에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 0ms, 최대 = 0ms, 평균 = 0ms

 

 


Ex3) SSH 접속 허용

 

[root@snort ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@snort ~]# iptables -L --line
Chain INPUT (policy DROP)
num  target     prot opt source               destination        
1    ACCEPT     icmp --  anywhere             anywhere           
2    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh

 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination      

  

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination        

 


 - Putty 접속 테스트

 

login as: root
root@192.168.10.137's password:
Last login: Sun Jan 31 11:12:23 2016 from 192.168.10.1
[root@snort ~]#

 

 

 

Ex4) HTTP 허용

 

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  외부에서 내부로 HTTP 접근 허용
# iptables -A INPUT -p tcp --sport 80 -j ACCEPT  내부에서 외부로 보냈다가 들어오는 HTTP 접근 허용

 

 


Ex5) DNS 응답 허용

 

[root@snort ~]# nslookup
> server
Default server: 192.168.10.2
Address: 192.168.10.2#53
> www.daum.net
;; connection timed out; trying next origin
;; connection timed out; no servers could be reached
> (ctrl+c)

[root@snort ~]#

 

[root@snort ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT
[root@snort ~]# iptables -L INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     udp  --  anywhere             anywhere            udp spt:domain

 

 

[root@snort ~]# nslookup
> server
Default server: 192.168.10.2
Address: 192.168.10.2#53
> www.daum.net
Server:         192.168.10.2
Address:        192.168.10.2#53

Non-authoritative answer:
www.daum.net    canonical name = www.g.daum.net.
Name:   www.g.daum.net
Address: 117.52.2.238
Name:   www.g.daum.net
Address: 117.52.2.237

> (ctrl+c)

[root@snort ~]#

 

 

 

Ex6) 특정 호스트 및 서브넷에 대해서만 허용할 경우

 

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

# iptables -A INPUT -p tcp --dport 22 -s 192.168.10.0/24 -j ACCEPT

 

 - 상태 정보 감시 규칙

 

# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

 


 - Chain 사용

 

# iptables -F -t filter
# iptables -L --line

# iptables -N ICMP
# iptables -L
# iptables -A ICMP -p icmp --icmp-type echo-request -j ACCEPT
# iptables -A ICMP -p icmp --icmp-type echo-reply - j ACCEPT
# iptables -A INPUT -j ICMP

 


 - Chain 해지

 

# iptables -L --line   (등록 된 신규 체인 번호 확인)
# iptables -D INPUT Rule_Number (등록 된 신규 체인 해지)

# iptables -D ICMP 2
# iptables -D ICMP 1
# iptables -X ICMP   (체인 삭제)
# iptables -L --line 

 

  - Default chain은 기본값이 삭제 불가능

 

 

 

Ex7) Statefule inspection

 

# iptables -A INPUT -p tcp --dport 22 -m state -- state ESTABLISHED,RELATED -j ACCEPT


 - m state   서비스 데이터에 대한 상태 검사
 -- state STATE-INFO

 

         NEW                   신규 연결
         ESTABLISHED     접속이 유지된 상태에서의 추가 연결
         RELATED            접속 된 상태에서 연관 된 다른 연결 (Ex : FTP)
         INVALID             상이한 접속 상황


# iptables -A INPUT -p tcp --dport 20:100 --tcp-flags SYN,ACK,RST RST -j DROP

# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP  TCP 포트 스켄 방지
# iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,ACK -j DROP 크리스마스 스켄 방지

 

 

 

Ex8) Log 정보 활성화

 

# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j LOG
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

 

 


Ex9) Log 정보 활성화

 

 - vi 편집기를 이용하여 다음 내용을 추가한다.

 

# vi /etc/rsyslog.conf

 

kern.*    /var/log/firewall

 


# touch /var/log/firewall
# service rsyslog restart

 

# iptables -A INPUT -p tcp --dport 20:80 --tcp-flags ALL NONE -j LOG       <--- 밑에보다 먼저 설정되어여 적용됨
# iptables -A INPUT -p tcp --dport 20:80 --tcp-flags ALL NONE -j ACCEPT

 


- Kali64에서 nmap 사용 (Null 스켄 실시)

 

# nmap -sN -Pn -p 20-80 192.168.10.137   (방화벽 IP 주소)

 


- CentOS에서 로그 정보 확인

 

# more /var/log/firewall
 

 

 

Posted by 김정우 강사(카카오톡 : kim10322)
,


Q