검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Linux: Find Out Which Process Is Listening Upon a Port

  특정 포트를 열고 있는 프로세스를 찾거나 반대로 특정 프로세스가 열고 있는 포트를 찾는 방법입니다. 이 글에서는 3가지의 툴과 /proc 파일 시스템의 PID 디렉토리에 대해 설명합니다.
  1. netstat - 네트워크 연결, 라우팅 테이블, 네트워크 인터페이스 통계 수치를 보여주는 툴.
  2. fuser - 특정 파일이나 소켓을 사용하는 프로세스 검색.
  3. lsof - 모든 열린 파일과 그 파일을 연 프로세스를 보여주는 툴
  4. /proc/$pid/ 파일 시스템 - /proc에는 실행 중인 프로세스마다 /proc/PID 형태의 디렉토리가 하나씩 존재한다. 이 디렉토리에는 프로세스 이름, 열고 있는 포트 등의 정보가 들어 있다.
  이 글에서 나오는 명령어들은 루트 권한으로 실행해야 합니다.

1. netstat
$ sudo netstat -tulpn | grep :3306
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address State  PID/Program name
tcp        0      0 127.0.0.1:3306 0.0.0.0:*       LISTEN 5669/mysqld
[...이하 생략...]
  위 명령어는 (TCP)3306 포트를 열고 있는 프로세스가 PID 5669번인 mysqld라는 것을 보여줍니다. 이것은 아래처럼 /proc을 이용해서 재확인할 수 있습니다.
$ sudo ls -l /proc/5669/exe
lrwxrwxrwx 1 root root 0 2010-11-12 10:20 /proc/5669/exe -> /usr/sbin/mysqld


2. fuser
  TCP 3306번 포트를 열고 있는 프로세스의 PID를 찾는 방법은 아래와 같습니다.
$ sudo fuser 3306/tcp
3306/tcp:             5669
  이 PID 번호를 가진 프로세스의 이름을 찾는 방법은 바로 위에서 봤던 방법과 동일합니다.
$ sudo ls -l /proc/5669/exe
lrwxrwxrwx 1 root root 0 2010-11-12 10:20 /proc/5669/exe -> /usr/sbin/mysqld
  찾은 프로세스의 이름을 가지고 man이나 whatis 명령어를 사용하면 대충 어떤 프로세스인지 알 수 있습니다.

  PID를 가지고 프로세스의 현재 작업 디렉토리를 알아내는 방법은 2가지로 다음과 같습니다.
$ sudo ls -l /proc/5669/cwd
lrwxrwxrwx 1 root root 0 2010-11-17 22:53 /proc/5669/cwd -> /var/lib/mysql

$ sudo pwdx 5669
5669: /var/lib/mysql
  PID가 3306번인 프로세스의 주인을 찾는 방법은 아래와 같습니다.
$ ps aux | grep 3306
mirashi   2664  0.0  0.0   3044   784 pts/0    S+   10:19   0:00 grep 3306
mysql     5669  0.0  1.2 131512 24720 ?        Sl   Nov12  15:21 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
  참고로 위 결과를 보면 첫 번째 줄에 쉘 프로세스가 자신의 grep 명령어로 인해 같이 검색되서 나옵니다. 이걸 방지하는 간단한 방법은 위 명령어 대신 'ps aux | grep [3]306'을 사용하는 것이며 이에 대한 설명은 여기를 참고하시기 바랍니다.


3. lsof
  이 글의 목적에 해당하는 사용법은 아래와 같습니다.
lsof -i :portNumber
lsof -i tcp:portNumber
lsof -i udp:portNumber
  아래는 위의 사용법에 따라 3306 포트를 열고 있는 프로세스를 찾는 예제입니다.
mirashi@myservlab:~$ sudo lsof -i :3306
COMMAND  PID  USER FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  5669 mysql 11u  IPv4  16181     0t0  TCP localhost:mysql (LISTEN)


팁1. ps를 이용해 더 유용한 정보 얻기
  PID를 알고 있으면 ps를 통해 더 유용한 정보를 얻을 수 있습니다.
mirashi@myservlab:~$ ps -eo pid,user,group,args,etime,lstart | grep '[5]669'
 5669 mysql    mysql    /usr/sbin/mysqld --basedir= 20-04:46:18 Fri Nov 12 06:33:55 2010
  위 출력 결과에서 각 칼럼에 대한 내용은 아래와 같습니다.
  • 5669 : PID
  • mysql : 유저명(EUID)
  • mysql : 그룹명(EGID)
  • /usr/sbin/mysqld --basedir= : 명령어와 인수(정확히 보려면 pid와 args만 별도로 사용 추천)
  • 20-04:46:18 : 프로세스가 실행된 후로 지난 시간. 형식은 [[dd-]hh:]mm:ss
  • Fri Nov 12 06:33:55 2010 : 명령어가 실행된 시간


팁2. 모르는 포트가 열려진 걸 발견한 경우
  모르는 포트가 열려 있을 경우 일단 어떤 프로세스가 해당 포트를 사용하는지 알아봅니다. /etc/services 파일은 유명한 서비스들이 사용하는 포트 번호와 프로토콜을 담고 있으므로 'grep 포트 /etc/services' 명령어를 통해 해당 포트가 일반적으로 어떤 용도로 쓰이는지 확인할 수 있습니다.

  만약 열려 있을 리가 없는 포트가 열려 있다면 루트킷(시스템의 관리자 권한을 강탈하기 위한 해킹 툴을 총칭)이 있을 가능성이 있으므로 확인해보는 것이 좋습니다.

  특히 해킹당한 서버는 다른 컴퓨터에 대량의 스팸 메일 전송, 악성 코드 전송, DoS 계열의 공격을 하는 경우가 많기 때문에 갑자기 네트워크 사용량이 늘어나 그 상태를 유지하는 경우 의심할 필요가 있습니다.


2010/12/02 11:56 2010/12/02 11:56