리눅스 iptables 실습하기 -2-

2016. 9. 26. 03:02카테고리 없음

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

iptables 2번째 시간입니다.


지난시간에 iptables 의 기본정책을 모두 DROP 시켜놓은 상태에서, 

원하는 특정 서비스만 통과 허용하는 정책을 확인해보았습니다.

이번시간에는 지난 시간(PING,DNS) 와 다른 서비스를 통과하는 것을 하는것보다 정책 설정에 관련된 

내용을 조금더 배워보도록 하겠습니다.


(사실 서비스 추가 허용은, 지난 시간 입력한 내용에 포트번호만 알맞게 지정하여 주시면 됩니다)


정책설정에 있어 정답은 없습니다. 

대중교통 을 예로 들어볼까요?

서울역에서 강남역을 가는길을 찾아 보았습니다.

서울역에서 9호선을 타고,노량진에서 신 논현역에서 조금 걸어가면 강남역이 나오는군요.

역시, 421번 버스를 타고 강남역에서 하차하는 방법이 있습니다.

가는 방법은 다양하고, 결국에는 강남역에 하차하여 도착하게 됩니다.


하지만 우리가 이러한 네이버 등 포털이 제공하는 가는길 찾기 서비스나, 네비게이션을 이용하여

다양한 경로를 탐색하는 이유는 '가장 빠르게 목적지에 도달' 하는 목표가 있기 때문입니다.


방화벽 정책 역시 마찬가지 입니다. 

만약 모든 정책을 차단한다고 한다면,

첫번째로, 우리는 세상의 존재하는 모든 TCP,UDP 포트 번호를 하나하나씩 차단하는 방법이 있고

두번째로, 지난시간 iptables 서비스를 시작하고 입력한 

root@localhost 바탕화면]# iptables -t filter -P INPUT DROP

[root@localhost 바탕화면]# iptables -t filter -P OUTPUT DROP

[root@localhost 바탕화면]# iptables -t filter -P FORWARD DROP


3줄을 입력할수 있습니다.


결과는? 동일합니다. 첫번째 방식으로 입력하거나, 두번째 방식으로 입력하거나

centos 는 모든 패킷을 차단하게 될 것입니다.


과연 이 글을 읽으신 여러분은 어느 방법을 사용하시겠습니까?


이번시간에는, 지난시간에 입력한 명령어들을 기초하여 조금 더 '덜' 입력하고

빠르게 정책적용할수 있도록 확인해 보겠습니다.


(운영 망도는 지난시간과 동일한 네트워크라고 생각하시면 됩니다)



iptables 서비스를 사용하시고, 초기화 한후 기본 정책은 DROP로 설정합니다.


이번시간에 사용할 것은 -m state 입니다. 

iptables 의 존재하는 확장모듈을 로드하기 위해, -m 옵션을 사용할것이고,

이중 state 로 상태옵션을 사용합니다.

가장 먼저 입력할 명령어는

root@localhost 바탕화면]# iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

입니다. 


간단하게 '상태기억' 옵션이라고 할수 있습니다.

CentOS 를 FORWARD 하는 패킷에 대하여, ESTABLISHED 하는 패킷 (양쪽에서 연결이 완료된

패킷과 관련되어 있는 패킷) , RELATED 하는 패킷 (새 연결이지만 ~ 이전에 연결했었던 패킷)

은 ACCEPT 해준다는 명령어 입니다. 


즉, 지난 시간에는 외부에서 -> CentOS 를 지나 -> DNS서버 까지 가는 패킷을 허용해주고,

DNS서버에서 -> CentOS를 지나 -> 외부로 나가는 패킷도 허용 해 주어야지 통신이 연결됩니다.


하지만, 위 명령어를 통해서, 

외부에서 -> CentOS 를 지나 -> DNS서버 까지 가는 패킷을 허용해준다면,

DNS서버에서 -> Centos를 지나 -> 외부로 나가는 패킷은, 별도의 명령어로 허용을 해주지 않아도,

CentOS 에서 ESTABLISHED,RELATED 정책이 적용되어 자동으로 나가도록 해주는 것입니다.


2줄의 명령어를 각기 입력해주었어야 하는데

1줄의 명령어로 끝낼수 있게 됩니다. 


또한, 위 명령어로 지정해 주었기때문에, FORWARD 체인에서는 모두 저 정책을 따르게 됩니다.


그렇다면 이제 PING 을 허용해주는것은

[root@localhost 바탕화면]# iptables -t filter -A FORWARD -p -icmp -j ACCEPT

한줄을 입력하여, PING 통신이 가능하도록 설정하였습니다.


두번째로, DNS 허용입니다.


지난번에 입력했던 DNS서비스 허용 방법입니다.

[root@localhost 바탕화면]# iptables -t filter -A FORWARD -p udp --sport 53 -d 10.10.10.20 -j ACCEPT

[root@localhost 바탕화면]# iptables -t filter -A FORWARD -p udp --dport 53 -d 10.10.30.10 -j ACCEPT 


똑같은 FORWARD 체인을 사용하여, 한번 연결되었던 내용은 상태기억 되므로,


외부 -> 내부 명령어 만 입력하면, 되겠습니다.

root@localhost 바탕화면]# iptables -t filter -A FORWARD -p udp --sport 53 -d 10.10.10.20 -j ACCEPT


DNS의 경우, 지난번에 udp포트만 허용해주었는데, tcp포트도 사용할수 있으므로, tcp역시 개방해줍니다.

root@localhost 바탕화면]# iptables -t filter -A FORWARD -p tcp --sport 53 -d 10.10.10.20 -j ACCEPT


아까 위에서, 다른 서비스를 허용하려면 포트번호만 변경해주면 된다고 하였는데,

만약 10.10.10.20 번이 dns서버가 아니고 DHCP서버 라고 한다면, udp포트번호를 변경해주면 가능합니다. (dhcp 서비스는 67, 68번)


root@localhost 바탕화면]# iptables -t filter -A FORWARD -p udp --sport 67 -d 10.10.10.20 -j ACCEPT

root@localhost 바탕화면]# iptables -t filter -A FORWARD -p udp --sport 68 -d 10.10.10.20 -j ACCEPT


특정 ip대역만 허용하고 싶으면 -s 로 ip 대역을 추가해주시면 되구요.

옵션값 내에서 본인이 원하는 정책을 적용하시면 됩니다.


iptables를 어려워 하는 이유는 명령어 입력보다 적시적절한 명령어 사용을 어려워하는게 대다수 입니다. 또한 정답이 정해져 있지 않아 같은 정책을 3줄로 끝내는 사람이 있으면, 10줄 20줄을 입력하는 사람도 있습니다. 


물론 20줄을 입력하여 입력하여도 잘못된 것은 아닐겁니다.

하지만 30분이면 갈 곳을, 빙빙 돌고 돌아 2시간에 걸쳐 가는사람은 없습니다.

효율의 문제이고, 추후 문제 발생하거나 수정할때 간단한 명령어를 더 선호할것이구요.


iptables는 다양한 상황을 적용하여 여러번 복습해 보시기 바랍니다.

그럼 오늘도 즐거운 하루 되세요!