정보보안(구버전)/작업중 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
'정보보안(구버전) > 작업중' 카테고리의 다른 글
setoolkit 구버전 디렉토리 (0) | 2016.12.09 |
---|---|
모의 해킹 I - 14. CentOS를 이용한 'snort' IDS (0) | 2016.01.31 |
모의 해킹 I - 02. Metasploit Tool을 이용한 스캐닝 및 공격 (0) | 2016.01.24 |
모의 해킹 I - 01. Information Gathering (0) | 2016.01.24 |