메뉴 건너뛰기

Linux
2016.02.18 08:01

Linux iptables 방화벽 설정

조회 수 184 추천 수 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:
 

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
127 Linux nmtui 맨하탄노숙자 2017.11.21 0
126 Linux xfs repair 맨하탄노숙자 2017.10.14 0
125 Linux RHEL7(CentOS7) 의 grub2 사용 해 보기 맨하탄노숙자 2017.07.26 3
124 Linux VMware ESXi SSD on RAID showing as non-ssd 맨하탄노숙자 2017.05.09 3
123 Windows Windows XP 의 윈도우에서 Visual Studio .net (2003) 설치시 옵션 맨하탄노숙자 2017.01.02 10
122 Windows 윈 10 인증 크랙 secret 맨하탄노숙자 2016.05.01 8
121 Windows 윈도우10 정품인증을 확실하게 받을 수 있는 방법입니다 맨하탄노숙자 2016.05.01 2464
120 Linux CentOS 7 CPU 퍼포먼스가 100% 안나올때 맨하탄노숙자 2016.03.25 152
119 Linux ## 아파치 설치용으로 CSR을 생성하고, 발급받은 VeriSign(베리사인) SSL 인증서를 Tomcat 8 에 적용 맨하탄노숙자 2016.03.22 210
118 Linux mysql old_password 설정 맨하탄노숙자 2016.03.22 84
117 Windows 윈도우7 원격데스크톱 2인 이상 동시 접속 (다중 사용자 모드) 설정 방법 file 맨하탄노숙자 2016.03.21 351
116 Linux rsync 맨하탄노숙자 2016.03.21 57
115 Linux Rsync 특정 기간(일정 기간) 이상 지난 컨텐츠 복사 (730일, 365일, 1주일) 맨하탄노숙자 2016.03.10 51
114 Linux iptables 용어 맨하탄노숙자 2016.02.18 320
113 Linux iptables 용어 맨하탄노숙자 2016.02.18 330
112 Linux Linux iptables 방화벽 설정 맨하탄노숙자 2016.02.18 60
» Linux Linux iptables 방화벽 설정 맨하탄노숙자 2016.02.18 184
110 Linux iptables 설정 두번째 맨하탄노숙자 2016.02.18 107
109 Linux iptables connlimit 모듈 활용 DDoS 맨하탄노숙자 2016.02.17 59
108 Linux iptables 분석 맨하탄노숙자 2016.02.17 23
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7