메뉴 건너뛰기

Linux
2016.02.17 23:24

iptables 분석

조회 수 77 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

iptables는 리눅스를 설치하면 보통 기본적으로 설치되므로
설치방법은 따로 설명하지 않으며 예제 위주로 간단히 사용법을 알아 보겠습니다.
아래 명령어는 모두 root권한으로 실행해야 됨을 미리 알려 드립니다.

1. 리눅스에서 부팅시 자동으로 iptables 서비스 시작하기:
아래 2가지 방법 중에 하나로 보통 서비스를 자동실행하도록 등록한다.
1) 쉘창에서 3, 5 모드에서 재부팅시 자동으로 iptables 서비스가 시작되도록 하는 명령어
# chkconfig –level 35 iptables on
–> 3: multi console 모드 , 5: X윈도우즈 모드
2) ntsysv 에서 iptalbes 서비스 체크
# ntsysv

2. 먼저 iptables 의 옵션은 아래와 같다.
iptables 에는 3가지 chain 이 존재: INPUT, OUTPUT, FORWARD
1) 필터링 사슬 전체 조작 옵션
-N : 새로운 사슬 만들기
-L : 사슬의 규칙을 보여주기
-X : 비어 있는 사슬을 없애기
-P : 사슬의 규칙을 바꾸기
-F : 사슬에 있는 모든규칙을 지우기

2) 사슬의 규칙을 조작하는 옵션
-A : 사슬에 새로운 규칙을 추가하기(맨아래에 추가됨)
-I : 사슬에 규칙을 삽입하기(맨앞쪽에 삽입됨)
-R : 사슬에 있는 규칙을 다른 규칙과 교환하기
-D : 사슬에 있는 규칙을 없애기

3) 규칙을 정의하는데 필요한 하위옵션
-s : 출발지 주소
-d : 목적지 주소
–sport : 출발지(source) 포트번호
–dport : 목적지 포트번호
-p : 프로토콜(tcp, udp, icmp ..)
-i : 패킷이 들어오는 네트워크 인터페이스(inbound interface)
-o : 패킷이 나가는
-f : 분절된(fragment) packet
-j : 규칙을 지정(jump)

3. 기본정책을 ACCEPT로 설정하는 법:
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

4. 현재 자신의 방화벽 규칙을 볼 수 있는 명령:
# iptables –list 또는 iptables -L
처음으로 명령을 실행하면 아래와 같이 아무 정책도 설정되어 있지 않는 것을 볼 수 있다.
# iptables -L
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 RH-Firewall-1-INPUT (0 references)

5. 규칙 추가 후에 저장하기 :
현재 규칙을 저장하는 명령어는 아래와 같다.
# /etc/rc.d/init.d/iptables save
-> /etc/sysconfig/iptables 에 저장됨
위 명령어로 저장후에 실제 저장된 파일을 확인해 보면 아래와 같이 아무 설정이 안된것을 알 수 있다.
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Thu Jun 25 18:25:02 2009
*filter
:INPUT ACCEPT [11:764]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [320:65885]
:RH-Firewall-1-INPUT – [0:0]
COMMIT
# Completed on Thu Jun 25 18:25:02 2009

이제 간단한 규칙을 추가해 보자.
예를 들어 ip= 192.168.0.111 를 입력단에서 패킷을 drop하는 규칙을 추가하고 현재 정책을 확인한다.
# iptables -A INPUT -s 192.168.0.111 -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  —  192.168.0.111       anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (0 references)

이제 저장을 한 후에 저장된 파일을 확인해 보면 아래와 같이 규칙이 저장되어 있는것을
볼 수 있다.
# /etc/rc.d/init.d/iptables save
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <— 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

6. 현재 iptables 규칙을 초기화 하기:
# iptables -F
위 명령어를 실행하고 정책을 보면 아래와 같이 초기화 되어 있는 것을 알 수 있다
# iptables -L
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 RH-Firewall-1-INPUT (0 references)

그러나 실제 저장되어 있는 내용을 보면 아래와 같이 초기화가 되어 있지 않는 것을 볼 수 있다.
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <— 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

즉, 초기화 명령어는 현재상태에만 적용되며,
iptables 서비스가 재시작되거나 서버가 리부팅되면 /etc/sysconfig/iptables 에 저장되었던
규칙이 다시 적용된다는 것을 알 수 있다.

7. 정책을 빠르게 수정하여 적용하는 법 :
6 에서와 같이 정책을 초기화 하고 서비스를 재시작해야 하는 방법은 상당히 비효율적인것을 알 수 있다.
따라서 현재 적용되는 정책을 특정파일(날짜별)로 저장해서 수정사항이 있다면
바로 그 저장된 파일을 수정한후 바로 정책에 적용하는 방법은 아래와 같다.

1) 현재 적용되고 있는 정책을 읽기 가능한 텍스트파일 형태로 저장하는 명령어는 아래와 같다.
# iptables-save > /root/iptable_091207.save

확인해 보면 똑같이 저장되어 있는것을 볼 수 있다.
# cat  /root/iptable_091207.save
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <— 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

2) 이제 저장되어 있는 iptables 파일을 바로 편집기로 수정 한후 저장한다.
# vi /root/iptable_091207.save
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -s 192.168.0.199 -j DROP  <— 편집기에서 111 -> 199 로 변경
-A INPUT -s 222.222.222.222 -j DROP <— 편집기에서 새로 정책 추가
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

3) 저장된 정책을 바로 적용하는 명령어는 다음과 같다.
# cat /root/iptable_091207.save | iptables-restore

확인해 보면 편집기로 수정했던 부분이 아래와 같이 바로 iptables 정책이 적용되어 있는 것을 알 수 있다
# iptables -L
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -s 192.168.0.199 -j DROP  <— 편집기에서 111 -> 199 로 변경했던 부분
-A INPUT -s 222.222.222.222 -j DROP <— 편집기에서 새로 정책 추가했던 부분
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

8. iptables 사용예 :
마지막으로 사용예를 몇개 알아보면 아래와 같다.

예1) 소스 ip가 192.168.0.111 인 접속의 모든 접속 포트를 막아라.
# iptables -A INPUT -s 192.168.0.111 -j DROP

예2) INPUT 사슬에 출발지 주소가 127.0.0.1(-s 127.0.0.1) 인 icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는
정책을 추가(-A)하라
# iptables -A INPUT -p icmp -s 127.0.0.1 -j DROP

예3) INPUT 사슬에 목적지 포트가 23번(–dport23)인 tcp 프로토콜(-p tcp) 패킷을 거부하는(-j DROP)규칙을
추가(-A) 하라.
# iptables -A INPUT -p tcp –dport 23 -j DROP

예4) INPUT 사슬에 목적지 포트 번호가 80번(–dport 80)인 tcp 프로토콜(-p tcp)패킷을 받아들이는(-j ACCEPT)
규칙을 추가(-A) 하라
# iptables -A INPUT -p tcp –dport 80 -j ACCEPT

예5) INPUT 사슬에 목적지 포트번호가 1023번 보다 작은 모든 포트(–dport :1023)인 tcp프로토콜(-p tcp)패킷을
거부하는(-j DROP)규칙을 추가(-A)하라
# iptables -A INPUT -p tcp –dport :1023 -j DROP

예6) ftp포트를 열어라
# iptables -I INPUT -p tcp –dport 21 -j ACCEPT

예7) imap 서비스를 방화벽에서 열어라
# iptables -I INPUT -s 192.168.0.0/255.255.255.0 -p udp –dport 143 -j ACCEPT

예8) 웹서버 방화벽 열어라
# iptables -I INPUT -p tcp –dport 80 -j ACCEPT

예9) 웹서버 포트 80 -> 8880으로 교체하라( 웹서비스 포트 변경시 /etc/services 에서도 변경 해줘야 함)
# iptables -R INPUT 2 -p tcp –dport 8880 -j ACCEPT

예10) domain-access_log 파일에 있는 모든 ip의 모든 접속 포트를 막아라(DOS공격 방어시 사용)
# cat domain-access_log |awk ‘{print $1}’|sort |uniq |awk ‘{print “iptables -A INPUT -s “$1″ -j DROP”}’|/bin/bash

note:http://blog.blueweb.co.kr/i/entry/185
# Generated by iptables-save v1.3.5 on Sun Jul 29 05:39:42 2012
*nat
#외부의 공인 IP가 라우터를 거쳐 내부 IP로 들어롤수 있는 것
: PREROUTING ACCEPT [3465:769364]
#내부의 사설 IP가 라우터를 거쳐 고인 IP를 가지고 외부로 나갈수 있는 것이며 eth0에 설정된 공인IP로 변환
: POSTROUTING ACCEPT [194:11943]
: OUTPUT ACCEPT [193:11903] #1024-65535 사이의 tcp, udp 를 할당받아 나간다.
-A POSTROUTING -s 192.168.122.0/255.255.255.0 -d ! 192.168.122.0/255.255.255.0 -p tcp -j MASQUERADE –to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/255.255.255.0 -d ! 192.168.122.0/255.255.255.0 -p udp -j MASQUERADE –to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/255.255.255.0 -d ! 192.168.122.0/255.255.255.0 -j MASQUERADE
COMMIT
# Completed on Sun Jul 29 05:39:42 2012
# Generated by iptables-save v1.3.5 on Sun Jul 29 05:39:42 2012
*filter
: INPUT ACCEPT [0:0] #INPUT 필터설정
: FORWARD ACCEPT [0:0] #FORWARD 필터설정
: OUTPUT ACCEPT [2871:1707973] #OUTPUT 필터설정
: RH-Firewall-1-INPUT – [0:0] #Firewall 필터설정
-A INPUT -i virbr0 -p udp -m udp –dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp –dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp –dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp –dport 67 -j ACCEPT
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -d 192.168.122.0/255.255.255.0 -o virbr0 -m state –state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/255.255.255.0 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT –reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT –reject-with icmp-port-unreachable
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp –icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp –dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp –dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp –dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -s 111.111.143.0/24 -p tcp –dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -s 111.111.143.0/24 -p tcp –dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 23 -j ACCEPT
-A RH-Firewall-1-INPUT -s 111.111.143.0/24 -p tcp –dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state –state NEW -m udp –dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state –state NEW -m udp –dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 445 -j ACCEPT
-A RH-Firewall-1-INPUT -s 210.182.143.0/24 -p tcp –dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -s 210.182.143.0/24 -p tcp –dport 6689 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Jul 29 05:39:42 2012

————–다른 데이블 처음부터 drop——————-

*filter RH-Firewall-1-INPUT -j DROP
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp –icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p udp –dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp –dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -s 211.181.141.0/24 -m state –state NEW -p tcp –dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -s 211.181.141.0/24 -m state –state NEW -p tcp –dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 211.181.141.0/24 -m state –state NEW -p tcp –dport 23 -j ACCEPT
-A RH-Firewall-1-INPUT -s 211.181.141.0/24 -m state –state NEW -p tcp –dport 4559 -j ACCEPT
-A RH-Firewall-1-INPUT -s 211.181.141.0/24 -m state –state NEW -p tcp –dport 17789 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 110 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -s 211.181.141.0/24 -m state –state NEW -p tcp –dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -s 211.181.141.0/24 -m state –state NEW -p tcp –dport 8080 -j ACCEPT
-A INPUT -i eth0 -s 10.0.0.0/8 -j LOG –log-prefix “IP DROP SPOOF ”
-A INPUT -i eth0 -s 172.16.0.0/12 -j LOG –log-prefix “IP DROP SPOOF ”
-A INPUT -i eth0 -s 192.168.0.0/16 -j LOG –log-prefix “IP DROP SPOOF ”
-A INPUT -i eth0 -s 224.0.0.0/4 -j LOG –log-prefix “IP DROP MULTICAST ”
-A INPUT -i eth0 -s 240.0.0.0/5 -j LOG –log-prefix “IP DROP SPOOF ”
-A INPUT -i eth0 -d 127.0.0.0/8 -j LOG –log-prefix “IP DROP LOOPBACK ”
-A INPUT -i eth0 -s 169.254.0.0/16 -j LOG –log-prefix “IP DROP MULTICAST ”
-A INPUT -i eth0 -s 0.0.0.0/8 -j LOG –log-prefix “IP DROP ”
-A INPUT -i eth0 -s 240.0.0.0/4 -j LOG –log-prefix “IP DROP ”
-A INPUT -i eth0 -s 255.255.255.255/32 -j LOG –log-prefix “IP DROP ”
-A INPUT -i eth0 -s 168.254.0.0/16 -j LOG –log-prefix “IP DROP ”
-A INPUT -i eth0 -s 248.0.0.0/5 -j LOG –log-prefix “IP DROP ”
#-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
128 Linux iptables 용어 맨하탄노숙자 2016.02.18 3454
127 Windows 윈도우10 정품인증을 확실하게 받을 수 있는 방법입니다 맨하탄노숙자 2016.05.01 2963
126 Linux iptables 용어 맨하탄노숙자 2016.02.18 1700
125 Linux /lib64/libc.so.6: version `GLIBC_2.14' not found 맨하탄노숙자 2015.06.21 1072
124 Linux CentOS 6 ISCSI 셋업 맨하탄노숙자 2015.04.11 1033
123 Linux ## 아파치 설치용으로 CSR을 생성하고, 발급받은 VeriSign(베리사인) SSL 인증서를 Tomcat 8 에 적용 맨하탄노숙자 2016.03.22 887
122 Linux DRBD + GFS2 + Heartbeat + MariaDB를 이용한 DB 서버 이중화 맨하탄노숙자 2015.05.22 793
121 사설 IP 대역 맨하탄노숙자 2015.04.23 793
120 Linux Install EPEL Repository On CentOS And RHEL 7 맨하탄노숙자 2016.01.15 710
119 Windows 원격 데스크톱의 접속 기록 지우는 방법 및 기록 초기화 프로그램 맨하탄노숙자 2015.04.20 608
118 Windows 윈도우7 원격데스크톱 2인 이상 동시 접속 (다중 사용자 모드) 설정 방법 file 맨하탄노숙자 2016.03.21 577
117 Linux sysbench를 이용한 MySQL(mariaDB) , DISK IO성능 테스트 맨하탄노숙자 2015.12.01 537
116 Linux CentOS7 네트워크 설정하기 맨하탄노숙자 2015.12.15 516
115 Windows Windows thin 맨하탄노숙자 2015.04.11 509
114 Linux Migration from CentOS-5 to CentOS-6 - CentOS Wiki ( CentOS Upgrade Tool ) 맨하탄노숙자 2015.05.06 497
113 Linux CentOS Linux: Add Static Routing 맨하탄노숙자 2015.04.13 493
112 Linux [CentOS 7] step1. 설치 후 기본설정 맨하탄노숙자 2016.01.21 484
111 Linux CentOS 7: Fixing Failed to start LSB error when importing/exporting a VM 맨하탄노숙자 2016.02.11 438
110 Linux CentOS 네트워크 본딩 맨하탄노숙자 2015.04.11 418
109 Linux vmstat 명령어(시스템 리소스 상황 확인 명령어) 맨하탄노숙자 2015.05.18 363
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7