우연치 않게 A 프로그램의 프로세스와 B 프로그램의 프로세스가 포트 충돌이 발생하여 B 프로세스가 기동이 안되는 현상 발생으로 해당 스크립트를 이용하여 포트사용 현황을 파악함.

A 프로그램은 OS 커널 파라메터의 ephemeral port (40000 ~ 50000) 기준으로 프로세스의 port를 랜덤하게 사용.

이슈가 발생할 때 A 프로그램은 50022 포트를 사용하여 기동됨.

B 프로세스는 50022 port를 바인딩하여 기동하는데 A 프로세스가 50022 port를 선점하여 프로세스 기동에 문제 발생.

 

이것을 해결하기 위한 방법은 몇가지가 있다.

  1. Local Address IP를 프로세스 별로 다르게 사용하여 동일 포트를 사용해도 문제가 없게 IP별로 분리.
    (netstat 로 확인 시 0.0.0.0 이나 ::: 표기되는 경우 특정 IP로 변경이 필요함. 해당 표기로 된것은 ALL IP 임.)
  2. ephemeral port 범위 변경
  3. net.ipv4.ip_local_reserved_ports 커널 파라메터에 예외 포트 추가(50022 포트를 추가하여 다른 AP에서 랜덤포트로 사용하지 못하게 함)
  4. B 프로세스의 바인딩 포트들 변경

 

해당 이슈의 시스템들은 4번 방법을 이용하기로 함. 그런데 변경하고자 하는 새로운 포트들이 시스템에서 사용되는지 확인이 필요했다.

여러 업무 프로세스가 수 많은 포트들을 사용하는 환경인데 인프라측에서는 서비스 포트 리스트를 정확히 파악하지 못하고 있어서 해당 스크립트를 통해 수일에 걸쳐 모니터링하게 됨.

 

  • Local Address의 특정 포트들의 netstat 현황을 로깅하는 간단한 스크립트 임.
  • portmonitor.sh, portmonitor.port - 2개의 파일로 구성
  • port_monitor.sh -h 하면 기본적인 사용법이 출력됨.
  • port 변경은 portmonitor.port 파일을 수정

 

1. 스크립트 파일

# vim portmonitor.sh

 

 

2. 포트 설정 파일

# vim portmonitor.port 

 

 

3. 실행하기

portmonitor.sh 와 portmonitor.port 파일을 특정 디렉토리에 위치 시킨 후 portmonitor.sh에 실행권한을 주고 실행한다.

1) 기본 실행 :

인터벌 600초(10분) 간격으로 현재시각에서 1일 후 까지 Local Address 의 설정한 포트를 감시하며 로깅한다. (기본값)

 

2) 옵션 지정 실행 1 :

인터벌 10초 간격으로 2018.06.14.  16시 까지 수행

 

3) 옵션 지정 실행 2 :

인터벌 60초 간격으로 수행, 스크립트가 구동 되는 시각은 실행 시각으로 부터 1일 후(기본값)

 

4) 옵션 지정 실행 3 :

스크립트가 구동 되는 시각은 2018.06.14.  15시 까지. 인터벌 600초 간격(기본값)

 

4) help

 

 

4. 로그 확인

# cat /var/log/log_portmonitor_testserver.log

로그는 스크립트를 수행한 위치의 디렉토리에 생성된다.
만약 필터링되는 포트가 없으면 로그파일은 생성되지 않는다.

 

아래는 커맨드는 Local Address의 포트 12000 ~ 12900 사이의 포트중에서 현재 사용중인 포트를 출력함.

 

portmonitor script

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Solve : *
20 − 5 =