이번에는 Network 모니터링이다. network 모니터링이라기 보단 netstat
커맨드를 좀 깊게 살펴보는 글이 될 것 같다. netstat
커맨드를 사용하면 포트를 사용하는 서비스, 포트에 접근한 세션 주소, 상태 등등 네트워크 전반적 상황을 확인할 수 있다.
netstat
커맨드를 구석 구석 살펴보고 실제로 모니터링 상황에서는 grep
을 활용해서 원하는 부분을 추출해서 보면 좋을 것 같다.
일단 한번 netstat
을 입력해서 어떤 정보가 나오는지 확인하자
NETSTAT
위의 출력을 보면 크게 2가지 파트로 나누어 볼 수 있다.
- Active Internet connections
- Active UNIX domain sockets
Internet connections은 말그대로 외부와의 통신 상태이고 domain sockets은 반대로 내부 프로세스간의 통신 상태를 보여준다. UDS를 보면 현재 통신을 하는 내부 프로세스를 확인할 수 있는데, path를 참고하면 이를 확인할 수 있다.
내가 주로 확인하는 부분은 상단부분 즉, Active Internet connections 부분이다. 현재 나는 VM에 SSH를 이용하여 접속한 상태로 다루고 있기 때문에 외부 통신 상태가 1개가 있음을 확인할 수 있다. Local Address와 Foreign Address를 살펴보면 통신이 어디서부터 어디로 이어지는지 볼 수 있다. 지금 현재 상태같은 경우에는
- Local Address : localhost.localdomain:ssh
- Foreign Address : 192.168.32.1:51857
VM의 ssh 서비스를 사용하는 포트와 192.168.32.1의 51857 포트가 연결이 된 것이라고 보면 된다. 내가 호스트네임을 지정하지 않아 localhost.localdomain으로 기재된다.
옵션없이 netstat
을 입력했을 때 나오는 정보는 이정도이고, 이제 옵션을 줘서 한번 살표보자.
- - a : 모든 정보 표시
- - n : 도메인명을 숫자로 표시
- - p : PID, Program 이름 표시
- - u : udp 통신중인 정보 표시
- - t : tcp 통신중인 정보 표시
- - i : 네트워크 I/O 상태를 표시
u,t 옵션은 말그대로 Active Internet connections 중에서 udp, tcp로 통신을 하고 있는 네트워크 연결을 필터링 해주는 옵션이다. 내가 주로 사용하는 옵션은 a, n, p옵션인데 netstat -anp
와 같이 옵션을 주어서 사용한다. 이렇게 옵션을 주어 커맨드를 입력해보자.
이처럼 출력이 되어있는데 현재 ssh말고는 사용중인 통신이 없기 때문에 특별히 모니터링 할만한 것은 없다. 이상태에서 아파치를 기동하고 PC에서 브라우저로 접속했을때 어떻게 변하는지 살펴보자.
우선 httpd를 다운받자.
yum install httpd
httpd를 기동하고 netstat -anp
를 입력해서 살펴보면 (편의상 | grep http
를 하여 http 내용만 표시했다)
http 데몬이 80포트를 LISTEN 중인 상태로 확인된다. 그리고 unix로 시작하는 내부 프로세스 상태도 커넥티드로 확인된다. 이제 PC에서 브라우저로 접속을 하면 어떻게 달라지는지 확인해보자
ESTABLISHED 세션이 하나 생겼다. 현재 tcp 통신으로 192.168.32.20의 80포트와 192.168.32.1의 58887포트가 연결되었다. 로컬의 80포트는 http를 띄운 아파치가 사용중인 포트이다. 따라서 PC의 브라우저를 통해 http에 접속하였기에 세션이 1개 생긴 것이다. 이러한 방식으로 ESTABLISHED를 grep
하여 wc -l
로 라인을 카운트하면 http를 사용중인 세션을 카운트도 가능하다. 지금 보이는 LISTEN 과 ESTABLISHED와 같은 상태 이외에도 다음과 같은 상태가 더 존재한다.
- CLOSE_WAIT : TCP소켓이 최상위의 응용 프로그램의 연결 종료를 기다리는 상태
- FIN_WAIT : 1, 2로 두가지 상태가 있는데 각각 순서대로 클라이언트가 서버에 연결을 끊고자 요청을 하는 상태, 서버가 클라이언트로부터 연결 종료 응답을 기다리는 상태이다.
- TIME_WAIT : 연결이 종료되고 잠시 소켓이 오픈된 상태 설정값에 따라 조절할 수 있다.
- LISTEN : 소켓이 오픈되어 연결을 기다리는 상태
- ESTABLISHED : 세션이 연결되어 서버와 클라이언트간 통신이 이루어진 상태
이처럼 netstat
을 이용하여 특정 서비스를 누가 사용하는지 어떤 포트에서 사용중인지 등 네트워크 연결과 관련된 모니터링을 netstat
커맨드를 이용하여 할 수 있다.
만약 패킷이 서버에 얼마나 오가는지 모니터링을 하고 싶다면 위에서 말한 옵션들 가운데 i 옵션을 부여하면 모니터링 할 수 있다.
netstat -i
ifconfig를 입력하여 확인 할 수 있는것 처럼 네트워크 인터페이스의 현재 RX와 TX 패킷량 그리고 에러와 드랍된 패킷을 수치로 확인할 수 있다.
이번 포스팅에서 netstat을 내가 아는한은 다 정리를 한 것 같다. 나는 주로 서비스의 포트와 어떤 세션이 접속이 제대로 되었는지 상태는 어떤지 확인할 때 주로 사용한다. 네트워크 모니터링에는 또 bmon 이나 몇몇 패키지들이 있는 것 같은데 이를 활용하는 것도 좋은 대안일 것 같다.