메뉴 건너뛰기

Linux
2016.02.18 08:01

Linux iptables 방화벽 설정

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

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
배경
 
o 네트워크에 연결되는 컴퓨터는 telnet, ftp, smtp 등 여러 프로토콜을 써서 데이터를 주고받거나 명령을 실행한다. 이때 서버 컴퓨터는 프로토콜에 대응하는 데몬을 띄우고 있다가 클라이언트의 요청을 받아 서비스를 제공하며, 서버는 사용자 이름과 암호를 입력하는 등 여러 방법으로 사용자 또는 호스트를 인증한다.
 
o 데몬이란: 시스템에 관련된 작업을 Background로 움직이는 프로그램을 말한다.
 
o 하지만 서버의 데몬들은 정도의 차이는 있지만 버그를 가지고 있다. 이 버그를 악용해서 데몬을 잘못 동작하게 하면 인증되지 않은 사용자가 서버의 서비스를 사용하거나 서버의 root를 얻어서 서버를 장악할 수 있다. 이것이 바로 해킹이다.

 
정의

o 네트워크 장치와 데몬 사이에서 패킷을 검사해서 서버에서 설정하지 않은 조건의 패킷을 데몬에 도달하기 전에 버리면 서버가 해킹 당할 위험은 줄어든다.
 
o 이러한 역할을 하는 것이 바로 방화벽(firewall)이다.

 
구조

o 리눅스에서는 방화벽 도구로 iptables를 사용한다.
 
o iptablesnetfilter가 제공하는 프레임워크를 이용하여 방화벽 기능을 구현하는데 사용하는 명령어이다.
 
o netfilter는 모든 종류의 패킷 필터링을 하는 도구의 공식적인 프로젝트명이다.


 
o iptables의 기능:

상태추적: 방화벽을 통과하는 모든 패킷에 대한 상태를 추적하여 메모리에 기억하고, 외부에서 들어오는 패킷을 메모리에 저장된 목록과 비교하여 통과 혹은 차단 기능을 수행한다.

매칭: 기본적인 매칭 정보의 IP와 포트 주소뿐만 아니라 세부적인 필터링이 가능하다

포트 포워딩: NAT기능을 자체적으로 포함하고 있고, 다양한 네트워크 구조를 지원한다.
 
o 현재 방화벽의 상태를 보려면 iptables -L또는 service iptables status를 입력한다.
 
 
o 위의 그림을 보면 iptables 아래에는 세 가지 chain이 존재한다.

- Chain INPUT: 외부에서 요청하는 모든 접속에 대한 설정
- Chain OUTPUT: 외부의 다른 컴퓨터로 나가는 모든 요청에 대한 설정
- Chian FORWARD: 외부에서 네트워크 접속 요청이 방화벽 시스템을 거쳐 다른 곳으로 나가는 라우팅 접속에 대한 설정
 
o Chain이란 사슬이란 뜻으로, 사슬 밑에 규칙들이 줄줄이 엮어져 있는 형태이기 때문에 기본 조건을 Chain(사슬)이라고 표현한다.
 
o 이와 같은 체인 밑에 네트워크로 들어오고 나가는 패킷에 대한 규칙을 추가하여 네트워크 접속을 설정할 수 있다.
 
o 규칙은 어떤 서비스는 접속을 허용하고 어떤 서비스는 접속을 막는 등 정책을 정의하는 것이다.
 
설정 실습
 
o 이제부터 클러스터에서 사용할 서비스들에 대해 수동으로 방화벽을 설정해보자
 
1. 먼저 다음과 같이 chian을 초기화한다

iptables F INPUT
iptables F OUTPUT
iptables F FORWARD
 
iptables L 로 확인하면 다음과 같다.
 

 
o 현재 Chain에는 아무 규칙도 없는 상황으로 Chain 옆에 policy ACCEPT란 설정이 있는데 이것은 모든 연결을 허용한다는 뜻이다.
 
o 아래와 같은 2가지 기본 정책 중 하나를 택할 수 있다.
- 1 규칙에 나열된 차단할 일부를 제외한 모든 패킷 허용
- 2 규칙에 나열된 허용된 일부를 제외한 모든 패킷 차단

o 1번은 서비스 가용성 측면에서 2번보다 장점이 있지만, 아직 알려지지 않은 위험 등에 노출되어 있을 수 있는 단점이 있다.
 
o 기본 정책을 변경할 때에는 다음과 같이 한다. DROP은 모든 접속을 차단하는 것이다.
 
iptables P INPUT DROP
 
o iptables명령어 구조

 




2. 일단 기본정책을 허용으로 놓고 설정을 시작하자. 먼저 eth0으로 들어오는 모든 연결을 차단한다.

iptables P INPUT ACCEPT
iptables A INPUT i eth0 p tcp j REJECT
iptables A INPUT i eth0 p udp j REJECT
 

 
o -AChain에 규칙을 추가하는 것으로 형식은 다음과 같다.

iptables A {chain} {조건} j {정책}

o 조건에는 ip주소, 접속의 종류(ssh, telnet, ftp )이 있고 네트워크장치(eth0, eth1 )도 구별할 수 있다.
 
o 네트워크 접속의 종류는 프로토콜과 포트로 구별한다. 포트 번호는 접속이 어느 서비스로 처리되는지 구별하는 번호이다.
 
o 예를 들어 ftp 서비스는 tcp 포트번호 21, sshtcp 22, telnettcp 23, httptcp 80, NFSudp 2049를 사용한다. 서비스의 프로토콜과 포트번호는 /etc/services 파일에 정리되어 있다.
o -j 는 앞의 조건에 대한 정책을 적용하라는 뜻으로 규칙을 설정할 때에는 꼭 있어야 한다.
 
o 여기서 REJECTDROP모두 접속을 차단하는 데 사용된다. 내부 시스템에서 보면 둘 다 접속을 거부하는 것으로 차이가 없지만 접속을 요청한 쪽에서는 다르다.
 
o REJECT로 설정하면 규칙 뒤에 reject-with icmp-port-unreachable이라는 주석이 붙는다. 이렇게 설정하면 외부에서 해당 서비스를 요청할 때 접속이 거부되었다는 오류가 뜬다. 방화벽은 패킷을 보낸 쪽으로 접속 거부를 알리는 ICMP패킷을 보낸다. 따라서 보내는 쪽은 즉시 접속이 거부되었다는 것을 알고 바로 접속 시도를 중단하고 오류를 표시한다.
 
o 하지만 DROP로 설정했을 경우 접속을 받는 시스템에서는 들어오는 패킷을 버리기만 하기 때문에 접속하는 쪽에서는 접속이 거부되었는지 알지 못한다. 그래서 timeout 될 때까지 계속 재접속을 시도한다.
 
o 그러면 어느 것을 쓰는 것이 더 좋은가?
- 이것은 시스템이 어떤 용도로 쓰이고 어떤 사용자에게 노출되었는지에 따라, 시스템 관리자의 보안 정책에 따라 다르다.
- 일반 사용자는 timeout이 발생할 때까지 기다리지 않아도 되므로 좋지만 많은 사람들에게 노출되고 해커들에게 표적이 되기 쉬운 경우에는 다르다.
- 접속에서 거부 메시지를 받으면 해커는 이 시스템이 방화벽의 보호를 받고 있다는 것을 알 수 있다.
- 따라서 접속 거부 메시지를 받지 않는 포트를 알아 내여 열려 있는 데몬이 어떤 것인지 알아낼 수 있고 그만큼 해킹이 쉬워질 수 있다.
- 때문에 DROP정책을 권장하는 보안 전문가들도 있다.
 



3. 앞에서 eth0에 대한 모든 접속을 차단했으므로 이제 필요한 서비스만 접속을 허용한다. 먼저 ssh 부터 허용한다.
 
iptables I INPUT 1 i eth0 p tcp --dport 22 j ACCEPT
 
o -IChain의 해당하는 줄에 새로운 규칙을 삽입한다. 첫째 줄에 규칙을 삽입하면 원래 첫째 규칙은 두번째로 밀려난다.
 
o 계속해서 ftp에 대한 규칙도 삽입한다.
 
iptables I INPUT 2 i eth0 p tcp --dport ftp j ACCEPT
 
o 주의할 점은 sshftp에 대한 접속을 허용하는 규칙을 I로 삽입하지 않고 A로 추가하면 접속이 되지 않는다. chain밑에 있는 규칙은 앞에서부터 순서대로 적용된다.
 
o 그러므로 규칙을 적용할 때에는 가장 일반적인 규칙을 밑에 두고 구체적이고 자주 사용되는 서비스부터 순서대로 규칙을 삽입해 나가야 한다.



 
4. 학교 내에 있는 컴퓨터 등 특정 주소만 접속 할 수 있도록 하려면
 
iptables I INPUT 2 i eth0 s [주소] p tcp dport ftp j ACCEPT
 
o 이렇게 입력하면 지정된 주소에서만 ftp를 허용한다. 접속을 요청하는 곳을 지정하는데 s를 사용한다.
 
o 반대로 컴퓨터에서 외부로 접속하는 연결을 필터링 하려면 d를 사용한다.
 
o 여러 주소를 지정하려면 s 147.46.0.0/255.255.0.0과 같이 하면 된다. 이렇게 하면 147.46. 으로 시작하는 IP를 의미한다. IP/netmask식으로 입력하면 된다. 0부분은 어떤 숫자라도 상관없는 부분이다.
 
o 특정 조건만 배제하려면 주소앞에 ! 표시를 넣어주면 된다.



 
5. 외부 시스템에 호스트 이름으로 접속하려면 DNS로 해당 주소를 받아야 하는데 DNSudp53번 포트를 사용한다.
 
o 도메인 이름을 쓰기 위해서는 DNS포트를 열어줘야 한다.
 
iptables I INPUT 1 i eth0 p udp --sport 53 j ACCEPT
 
o 컴퓨터에서 다른 외부에 ftp접속을 하거나 ssh접속을 하려면 역시 --sport 를 열어야 한다.
 

 
6. 지금까지 설정한 방화벽 설정을 저장한다.
 
service iptables save
 

o 이 값은 /etc/sysconfig/iptables 파일에 저장된다




7. 방화벽을 재시작한다
 
service iptables restart
 

 
8. 다른 노드에서 서버에 접속할 수 있는지 테스트한다.
 
o 아래 그림은 node1에서 서버의 ssh에 접근한 것을 보여준다. 우에서 서버의 ssh포트를 열었기 때문에 ssh로 서버에 접속 할 수 있다.
 

 
o 아래 그림은 node1에서 telnet으로 서버에 접근하려고 한 것이다. 서버측에서 telnet접속은 허용하지 않고 거부하기 때문에, 접속이 거부되었다는 표시가 뜬다.
 




 
References:
 

  1. iptables 용어

  2. Linux iptables 방화벽 설정

  3. Linux iptables 방화벽 설정

  4. No Image 18Feb
    by 맨하탄노숙자
    2016/02/18 by 맨하탄노숙자
    in Linux
    Views 282 

    iptables 설정 두번째

  5. No Image 17Feb
    by 맨하탄노숙자
    2016/02/17 by 맨하탄노숙자
    in Linux
    Views 164 

    iptables connlimit 모듈 활용 DDoS

  6. No Image 17Feb
    by 맨하탄노숙자
    2016/02/17 by 맨하탄노숙자
    in Linux
    Views 122 

    iptables 분석

  7. No Image 17Feb
    by 맨하탄노숙자
    2016/02/17 by 맨하탄노숙자
    in Linux
    Views 122 

    25 Most Frequently Used Linux IPTables Rules Examples

  8. Linux: 20 Iptables Examples For New SysAdmins

  9. No Image 17Feb
    by 맨하탄노숙자
    2016/02/17 by 맨하탄노숙자
    in Linux
    Views 93 

    How to block, deny or redirect an IP address or website domain

  10. No Image 14Feb
    by 맨하탄노숙자
    2016/02/14 by 맨하탄노숙자
    in Linux
    Views 122 

    Predictable Network Interface Names

  11. No Image 11Feb
    by 맨하탄노숙자
    2016/02/11 by 맨하탄노숙자
    in Linux
    Views 621 

    CentOS 7: Fixing Failed to start LSB error when importing/exporting a VM

  12. No Image 11Feb
    by 맨하탄노숙자
    2016/02/11 by 맨하탄노숙자
    in Linux
    Views 213 

    CentOS 7 - nmtui d / nmtui c - 네트워크 장치 UUID 체크

  13. No Image 02Feb
    by 맨하탄노숙자
    2016/02/02 by 맨하탄노숙자
    in Linux
    Views 64 

    Kill Process list - sub process list

  14. No Image 23Jan
    by 맨하탄노숙자
    2016/01/23 by 맨하탄노숙자
    in Linux
    Views 224 

    CentOS7 본딩 구성

  15. No Image 23Jan
    by 맨하탄노숙자
    2016/01/23 by 맨하탄노숙자
    in Linux
    Views 159 

    [리눅스] CentOS 7 로케일 변경

  16. No Image 23Jan
    by 맨하탄노숙자
    2016/01/23 by 맨하탄노숙자
    in Linux
    Views 347 

    [리눅스] CentOS 7 타임존 변경

  17. No Image 23Jan
    by 맨하탄노숙자
    2016/01/23 by 맨하탄노숙자
    in Linux
    Views 315 

    CentOS 7 – hostname 변경

  18. No Image 21Jan
    by 맨하탄노숙자
    2016/01/21 by 맨하탄노숙자
    in Linux
    Views 142 

    [CentOS 7] step2. 기본 패키지 설치

  19. No Image 21Jan
    by 맨하탄노숙자
    2016/01/21 by 맨하탄노숙자
    in Linux
    Views 566 

    [CentOS 7] step1. 설치 후 기본설정

  20. No Image 20Jan
    by 맨하탄노숙자
    2016/01/20 by 맨하탄노숙자
    in Linux
    Views 119 

    In Place Upgrade CentOS 6.5 to 7.0 using preupg

Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7