이 글은 다른 접속에 영향을 주지 않고 특정 TCP 접속만 끊을 수 있는 tcpdrop 유틸리티에 대해 설명합니다.

요약
종종 관리자들이 현재 연결되어 있는 TCP 세션을 강제로 끊어줄 필요가 있을때가 있습니다. 그러나 관리자가 이미 연결된 세션을 드롭하는 쉬운 방법은 없습니다. 즉 클라이언트의 모든 트래픽을 null 라우팅 하고, ipfilter 룰을 추가(필요한것 이상의 트래픽을 블럭시킴) 혹은 관계된 서버사이드의 프로세스들을 종료 하는 등의 과도한 수작업이 필요합니다.

필자는 tcpdrop 을 BSD 프로젝트로 부터 포팅하였습니다. tcpdrop 은 관리자가 다른 어떠한 영향도 없이 어떠한 TCP 접속도 손쉽게 드롭 할 수 있도록 도와 줍니다. 이 테크팁은 솔라리스의 tcpdrop 사용에 대해 설명 합니다. 이것은 솔라리스 8, 9, 10에서 테스트 되었습니다.


소개

무슨 이유든지 간에 여러분의 솔라리스 OS 호스트로 부터 원격 클라이언트를 쫓아내기를 원한다고 상상해 봅시다. 아마도 여러분은 접속이 리소스 이슈를 유발한다고 생각할 수도 있고 혹은 어플리케이션의 갑작스런 접속해제에 대한 반응을 디버깅 하길 원할 수도 있습니다.

만약 유저가 보안 쉘(SSH) 로 접속했습니다. 그러면 유저의 쉘을 찾아내서 관계된 sshd(1M) 프로세스를 죽이는 것은 상대적으로 간단합니다. 그러나 만약 공유되고 있는 서버 프로세스, 즉 데이타베이스 디스패쳐 혹은 쓰레드화된 웹서버를 다룰때는 다른 클라이언트에 영향을 주지 않고 프로세스를 죽인다는 것은 매우 어렵거나 혹은 거의 불가능하기 까지 합니다. 만약 여러분의 어플리케이션이 클라이언트 세션을 종료할 수단을 제공해 주지 않는다면 여러분은 네트워크 레벨에서 몇가지 액션을 취함으로써 클라이언트의 접속을 드롭시킬 수 있습니다.


대상 물색하기

현재 연결된 TCP 소켓은 아래와 같은 4가지 항목에 의해 unique 하게 구분될 수 있습니다:

 
  {local IP address, local port, remote IP address, remote port}

여러분은 그러므로 netstat(1M) 같은 툴을 이용해서 드롭하고자 하는 접속을 구분해 낼 수 있습니다. 예를 들어 192.168.4.25 에서의 TCP 접속을 드롭하길 원하고 이것은 172.20.3.75 서버에 있는 웹서버에 접속되어 있다고 했을때 여러분은 아래와 같이 포트 번호를 통해서 구분해 내실 수 있습니다:

 
# netstat -n -Ptcp | egrep 172.20.3.75.\*192.168.4.25
  172.20.3.75.80  192.168.4.25.33062  49640  0  49640  0 ESTABLISHED

결과는 연결된 TCP 접속이 포트 80번의 IP 주소 172.20.3.7 에 IP 주소 192.168.4.25, 포트 33062 를 이용하여 접속하고 있음을 다음의 4가지 정보를 통해서 {172.20.3.75, 80, 192.168.4.25, 33062} 구분해 내실 수 있습니다.


Null 라우트

IP 트래픽을 드롭하는 가장 유명한 방법은 원격 머신을 null 라우트, 혹은 블랙 홀 화 시키는 것입니다. 이전의 예제의 원격 머신 192.168.4.25 에서 다음의 커맨드는 모든 IP 트래픽을 드롭되도록 합니다:

 
# route add -host 192.168.4.25 127.0.0.1 -blackhole

이제 호스트에서 생성되는 응답은 클라이언트에 도달하지 못하고 그러므로 TCP 세션들은 모두 타임아웃 될 것입니다. 그러나 클라이언트의 몇몇 패킷들은 여전히 어플리케이션에 의해 처리되고 있을 것입니다.

이러한 접근의 단점중 하나는 원격 IP 주소의 모든 트래픽들을 블랙홀화 한다는 것입니다. 블랙홀은 원격 머신이 다음과 같을때에 몇가지 데미지들을 입힐 수 있습니다:

  • 멀티유저 호스트
  • JDBC 기술을 이용하는 컨넥션 풀의 종단
  • 로컬 머신에 어떠한 서비스든 제공하는 프로바이더

파이어월

패킷 필터인 IP Filter 는 솔라리스10과 함께 배포되며 트래픽 차단을 좀 더 세밀하게 할 수 있는 기능을 제공 합니다. 다음의 템플릿을 이용해서 특정 접속만을 드롭하도록 하는 룰을 만드실 수 있습니다. (이것은 모두 한줄에 입력 되어야 합니다.)

 
   block return-rst in quick proto tcp from /remote_addr/ port = \
 /remote_port/ to /local_addr/ port = /local_port/

여러분이 이전과 동일한 연결된 접속들을 가지고 있다고 가정하면 값들은 다음과 같이 될 것입니다:

 
  block return-rst in quick proto tcp from 192.168.4.25 port = 33062 to 172.20.3.75 port = 80

이 방법은 오직 여러분이 블럭하길 원하는 접속만 블럭할 수 있다는 장점이 있습니다. 그러나 이 룰은 /etc/ipf/ipf.conf 의 제일 앞에 추가되어야 합니다. 그리고 IP Filter 서비스는 반드시 다음의 커맨드를 이용해서 재시작 되어야 합니다:

 
svcadm restart ipfilter

만약 호스트간에 충분한 트래픽이 존재한다면 4개의 값은 즉시 재생될 것입니다. 그러므로 접속이 타임아웃되면 즉시 /etc/ipf/ipf.conf 에서 해당 라인을 제거하고 시스템을 재시작 시켜줘야 합니다.게다가 두 호스트 사이에 올바른 트래픽틀이 있다고 하고 이 룰이 재사용된다고 하면 항목을 제때 빼지 못함으로써 이러한 접속들을 끊어 버릴 수도 있습니다.


tcpdrop 유틸리티

TCP 패킷의 순서 문제에 대한 보안 fix 에 대해 작업하던 OpenBSD 프로젝트의 Markus Friedl 은 TCP 접속을 드롭하려면 많은 작업들이 필요하다는 것을 알게 되었습니다. 비록 물론 이전에 언급했었던 방법들이 있었지만, Marus 는 네가지 값을 받아서 OpenBSD 커널이 접속을 드롭하도록 하는 툴을 만들면 그의 작업이 훨씬 쉬워질 것이라고 생각하고 이러한 툴을 만들기로 결심 하였습니다. 그 툴 tcpdrop 은 빠르게 FreeBSD 로 포팅되었고 시스템 관리자가 사용할 수 있도록 릴리즈 되었습니다.

이전의 값들을 이용하여 tcpdrop 을 사용하는 예제는 아래와 같이 간단합니다:

 
  # tcpdrop 172.20.3.75 80 192.168.4.25 33062
  172.20.3.75 80 192.168.4.25 33062: dropped

컨넥션은 즉시 드롭되고 새로운 접속이나 혹은 이미 연결된 접속에 어떠한 영향도 주지 않습니다.

솔라리스 관리자들은 이 툴 없이 작업을 해야 했습니다. 최근에 유즈넷 group comp.unix.solaris 에서 토의가 됐었는데 솔라리스가 동일한 기능을 수행할 수 있는 문서화되지 않은 커널 인터페이스를 가지고 있음을 발견 하였습니다. tcpdrop 의 포팅이 즉시 이루어 졌고 이제 typo.submonkey.net 에서 다운로드 하실 수 있습니다.

참고: 커널 인터페이스가 문서화 되어 있지 않았기 때문에 이 툴은 솔라리스의 미래 버전에서는 동작하지 않을 수도 있습니다.


저자에 관하여

Ceri Davies (ceri [at] submonkey.net) 는 Welsh 대학의 UNIX 시스템 관리자이고 FreeBSD 개발자 입니다.


이 글의 영문 원본은
BigAdmin System Administration Portal / Community-Submitted Tech Tip 의 A Tool to Drop TCP Sessions for the Solaris OS: tcpdrop 에서 보실 수 있습니다.

"관리자코너" 카테고리의 다른 글

2008/12/24 16:53 2008/12/24 16:53

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/701

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 160 161 162 163 164 165 166 167 168  ... 806  Next ▶