LINUX
2016.02.01 10:14

iptables 명령어 - 방화벽 설정

조회 수 12628 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
1. iptables 란? 
  
iptables는 리눅스상에서 방화벽을 설정하는 도구로서 커널 2.4 이전 버전에서 사용되던 ipchains를 대신하는 방화벽 도구이다. 
iptables는 커널상에서의 netfilter 패킷필터링 기능을 사용자 공간에서 제어하는 수준으로 사용할 수 있다. 
  
패킷필터링이란 지나가는 패킷의 해더를 보고 그 전체 패킷의 운명을 결정하는 것을 말한다. 
일반적으로 패킷은 해더와 데이터를 가진다. 
해더에 필터링할 정보인 출발지IP:PORT, 도착지IP:PORT, checksum, 프로토콜 옵션등을 가지며 데이터는 각각의 전송데이터가 들어간다. 
  
특정 조건을 가지고 있는 패킷에 대해 허용(ACCEPT)과 차단(DROP)등을 지정할 수 있으며, 특정 조건등을 통해 다양한 방식의 패킷 필터링과 처리 방식을 지원한다. 
  
iptables 정책은 여러 구분으로 나눠지며 중요한 부분은 Chain이다. 
Chain은 패킷이 조작될 상태를 지정하며 iptables에 내장된 기본 Chain은 다음과 같다. 
(기본 Chain은 영구적이며 삭제가 불가능하다. 이외에 -N 옵션으로 지정하는 사용자 정의 Chain이 있다.) 
  
Chain INPUT : 서버로 들어오는 기본 정책 
Chain FORWARD : 서버에서 forwarding 기본 정책 
Chain OUTPUT : 서버에서 나가는 기본 정책 
------> INPUT ------> Linux Server ------> OUTPUT ------> 
    |          |  
    +------------- FORWARD ---------------+  
  

Linux Server를 목적지로 삼는 모든 패킷은 INPUT Chain을 통과하고 
Linux Server에서 생성되 외부로 보내지는 모든 패킷은 OUTPUT Chain을 통과하게 된다. 
FORWARD Chain의 경우 현재의 Linux Server가 목적지가 아닌 패킷이 통과하는 Chain이다. 
(FORWARD Chain은 NAT(네트워크 공유) 기능 사용을 위해 사용된다.) 
  
  
2 iptables의 구조 
  
먼저 iptables에 대해 살펴보도록 하자. 
iptables는 다음의 구조로 구성된다. 
iptables -A INPUT -s [발신지] --sport [발신지 포트] -d [목적지] --dport [목적지 포트] -j [정책] 
  
iptables 명령 
-A : 새로운 규칙을 추가한다. 
-D : 규칙을 삭제한다. 
-C : 패킷을 테스트한다. 
-I : 새로운 규칙을 삽입한다. 
-R : 새로운 규칙으로 교체한다. 
-L : 새로운 규칙을 출력한다. 
-F : 체인의 모든 규칙을 삭제한다. 
-Z : 모든 체인의 패킷과 바이트 카운터 값을 0으로 만든다. 
-N : 새로운 체인을 만든다. 
-X : 체인을 삭제한다. 
-P : 기본 정책을 변경한다. 
  
iptables 옵션 
-p : 패킷의 프로토콜의 포트번호 또는 이름을 명시한다. (ex : tcp, udp, 21, 22) 
-s : 패킷의 발신지를 명시한다. (ex : address[/mask]) 
-d : 패킷의 도착지를 명시한다. 
-i : 규칙을 적용할 인터페이스 이름을 명시한다. (ex : eth0, eth1) 
-j : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다. 
-y : 접속 요청 패킷인 SYN 패킷을 허용하지 않는다. 
-f : 두 번째 이후의 조각에 대해 규칙을 명시한다. 

  
  
3 iptables 규칙 추가 
  
예를 들어 만약 127.0.0.1 즉, 로컬에서 요청하는 모든 ICMP 패킷에 대해 무시하고자 할 때 어떻게 하면 될까? 
ping 요청에 사용되는 프토토콜은 ICMP 프로토콜이며, 발신 주소는 127.0.0.1이다. 
패킷 필터의 목표는 폐기(DROP)이며, 사용하는 프로그램은 ping이다. 
이를 기반으로 룰을 만들면 다음과 같다. 
// 체인을 추가하기 전 iptables 
# 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 
  
// 127.0.0.1 로 ping이 정상적으로 허용됨을 알 수 있다. 
# ping -c 3 127.0.0.1 
  PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 
  64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.029 ms 
  64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.028 ms 
  64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.026 ms 
  --- 127.0.0.1 ping statistics --- 
  3 packets transmitted, 3 received, 0% packet loss, time 1998ms 
  rtt min/avg/max/mdev = 0.026/0.027/0.029/0.006 ms 

// 127.0.0.1 로 가는 ping을 거부하는 체인 추가 
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP 
  
// iptables에 체인이 추가됨을 확인할 수 있다. 
# iptables -L  // 현재 iptables에 icmp DROP 룰이 적용되어 있다. 
  Chain INPUT (policy ACCEPT) 
  target      prot opt source                      destination 
  DROP      icmp --  SUNSYSTEM            anywhere 
  
  Chain FORWARD (policy ACCEPT) 
  target      prot opt source                    destination 
  
  Chain OUTPUT (policy ACCEPT) 
  target      prot opt source                    destination 
  
// ping이 거부됨을 확인할 수 있다. 
# ping -c 3 127.0.0.1 
  PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 
  
  --- 127.0.0.1 ping statistics --- 
  3 packets transmitted, 0 received, 100% packet loss, time 2008ms 
  


  
4 iptables 규칙 제거 
  
iptables의 체인 입력과 마찬가지로 삭제를 할 때에도 동일하게 입력하면 된다. 
iptables -D INPUT -s [발신지] --sport [발신지 포트] -d [목적지] --dport [목적지 포트] -j [정책] 
iptables -D INPUT [필터링 번호] 
(필터링 번호는 service iptables stat을 통해 확인할 수 있다.) 
※ iptables -F INPUT 을 입력할 경우 모든 체인이 삭제된다. 
  
그러면 위에 입력했던 체인을 제거해보도록 하자. 
  
# iptables -L 
  Chain INPUT (policy ACCEPT) 
  target      prot opt source                      destination 
  DROP      icmp --  SUNSYSTEM            anywhere 
  
  Chain FORWARD (policy ACCEPT) 
  target      prot opt source                      destination 
  
  Chain OUTPUT (policy ACCEPT) 
  target      prot opt source                      destination 

# iptables -D INPUT 1 
// iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP를 사용해서 삭제할 수도 있다. 
  
# iptables -L 
  Cain 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 

  
  
5. iptables 정책 순서 
  
모든 방화벽은 순차적 실행이다. 
즉 등록 순서에 있어서 먼저 등록한 대해서 효력이 유효하기 때문에 등록시에는 순서가 매우 중요하다. 
모든 입출력 패킷에 대해 거부하는 설정이 먼저 등록되면 그 이후에 포트를 열어주는 설정을 하여도 효과가 없다. 
그러므로 허용하는 정책을 먼저 정의한 다음 거부하는 정책을 설정해야 한다. 
  
// 아래와 같이 설정하면 우선적으로 22번 포트가 열린 후 나중에 22번~30번 포트가 막히기 때문에 SSH 접속이 가능하다. 
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT 
# iptables -A INPUT -p tcp --dport 22:30 -j DROP 
  
# iptables -L 
  Chain INPUT (policy ACCEPT) 
  target        prot opt source                destination 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh 
  DROP        tcp  --  anywhere            anywhere            tcp dpts:ssh:30 

// 아래와 같이 설정하면 우선적으로 22번~30번 포트가 막히기 때문에 뒤에서 아무리 22번 포트를 열어도 외부에서 SSH로 
접속할 수 없게 된다. 
// iptables로 입력할 경우 바로 적용이 되기 때문에 원격에서 작업할 경우엔 주의하자. 
# iptables -A INPUT -p tcp --dport 22:30 -j DROP 
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT 
  

  
  
6. 서비스를 위한 기본 설정 
  
처음 설치시 방화벽을 설정하면 /etc/sysconfig/iptables 파일이 생성된다. 
디폴트 iptables 파일을 삭제한 후 아래의 포트를 추가하도록 하자 
// 기존 iptables 파일 제거 
# rm -rf /etc/sysconfig/iptables 
  rm: remove 일반 파일 `/etc/sysconfig/iptables'? y 
  
// iptables 정책 추가 
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT  // ftp-data 
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT  // ftp 
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT  // ssh 
# iptables -A INPUT -p udp --dport 53 -j ACCEPT  // named 
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  // http 
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT  // pop3 
# iptables -A INPUT -p tcp --dport 143 -j ACCEPT  //imap 
# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT  // mysql 
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP // ping에 대한 응답 거부 
# iptables -A INPUT -p tcp --dport 1:65335 -j DROP // 서비스포트 모두 거부 
  
// iptables 확인 
# iptables -L 
  Chain INPUT (policy ACCEPT) 
  target    prot opt source              destination 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ftp-data 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ftp 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh 
  ACCEPT    udp  --  anywhere            anywhere            udp dpt:domain 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:http 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:pop3 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:imap 
  ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:mysql 
  DROP        icmp --  anywhere            anywhere            icmp echo-request 
  DROP        tcp  --  anywhere            anywhere            tcp dpts:tcpmux:65335 
  
  Chain FORWARD (policy ACCEPT) 
  target    prot opt source              destination 
  
  Chain OUTPUT (policy ACCEPT) 
  target    prot opt source              destination 

// iptables 를 저장 
# service iptables save 
  방화벽 규칙을 /etc/sysconfig/iptables에 저장 중:          [  OK  ] 
  
# ls /etc/sysconfig/iptables* 
  /etc/sysconfig/iptables  /etc/sysconfig/iptables-config 

// iptables 재시작 
# service iptables start 
  방화벽 규칙을 삭제하는 중:                                              [  OK  ] 
  chains를 ACCEPT 규칙으로 설정함: filter                          [  OK  ] 
  iptables 모듈을 제거하는 중:                                            [  OK  ] 
  iptables 방화벽 규칙들을 적용하는 중:                              [  OK  ] 
  추가 iptables 모듈을 읽어오는 중: ip_conntrack_netbios_ns  [  OK  ] 

// iptables 상태 
# service iptables status 
  테이블: filter 
  Chain INPUT (policy ACCEPT) 
  num  target    prot opt source              destination 
  1    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:20 
  2    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:21 
  3    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:22 
  4    ACCEPT    udp  --  0.0.0.0/0            0.0.0.0/0          udp dpt:53 
  5    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:80 
  6    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:110 
  7    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:143 
  8    ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:3306 
  9    DROP        icmp --  0.0.0.0/0            0.0.0.0/0          icmp type 8 
  10  DROP        tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpts:1:65335 
  
  Chain FORWARD (policy ACCEPT) 
  num  target    prot opt source              destination 
  
  Chain OUTPUT (policy ACCEPT) 
  num  target    prot opt source              destination 

// nmap 포트 스캔 
# nmap localhost 
  Starting Nmap 4.11 ( http://www.insecure.org/nmap/) at 2009-04-14 13:45 KST 
  Interesting ports on SUNSYSTEM (127.0.0.1): 
  Not shown: 1673 filtered ports 
  PORT    STATE  SERVICE 
  20/tcp  closed ftp-data 
  21/tcp  closed ftp 
  22/tcp  open  ssh 
  80/tcp  closed http 
  110/tcp  open  pop3 
  143/tcp  closed imap 
  3306/tcp open  mysql 

  

  
  
7. iptables의 확장 
1초동안 80포트에 똑같은 IP가 10번 이상의 SYN가 들어오면 드랍시킨다. 
(즉, 정상적인 요청이 아닌 웹서비스 공격으로 간주하여 요청패킷을 폐기시켜 응답하지 않도록 한다.) 
이외의 자세한 사항은 http://netfilter.org의 HOWTO를 읽어보길 바란다. 
# iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 1 --hitcount 10 --name HTTP -j DROP 

Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
401 JAVA [Java] 자바에서 콜백(Callback) 구현하기 2017.03.15 25884 0
400 Android json 데이터 다루기 - GSon 사용법 2017.03.15 8428 0
399 Python json 데이터 핸들링 2017.03.09 8623 0
398 Pi 라즈베리파이 gpio utility 2017.02.15 6207 0
397 C++ STL queue 사용법 2017.02.14 28476 0
396 C++ C++ string 정리 (C++ 문자열) 2017.02.14 13054 0
395 Pi 라즈베리파이 3, Spec & PIN Map file 2017.02.06 30528 0
394 일반 Anet A8 Prusa i3: tips and tricks 2017.02.04 22588 0
393 MFC [Collection] ArrayList 예제 2017.01.25 6514 0
392 MFC [Collection] CArray Class 사용법 2017.01.25 15822 0
391 업무 ABS / PLA 2017.01.18 5925 0
390 Pi NodeMCU PIN 정보 file 2017.01.09 8925 0
389 Pi SD Memory 카드 SPI 3.3V/5.0V 인터페이스 모듈 Atmega2560 제어 예제 2016.12.27 6796 0
388 Pi ATTINY85 PIN정보, Data sheet 2 file 2016.12.10 8971 0
387 Pi 키르히호프의 법칙 2016.12.05 10360 0
목록
Board Pagination ‹ Prev 1 ... 3 4 5 6 7 8 9 10 11 12 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5