linux - ntpd client 간단 설정 및 트러블 슈팅

1. ntpd 설치

#yum -y install ntp
위 명령어를 통해 ntp를 설치해 줍니다.

2. ntpd clinet 서버 주소 입력

#vi /etc/ntp.conf
위 파일을 실행 시킨 후 아래의 빨간색 부분에

server (ntp server hostname) 을 입력해 줍니다.
(아래의 ntp.postech.ac.kr은 포항공대의 ntp서버입니다.)


     20 # Use public servers from the pool.ntp.org project.
     21 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
     22 server ntp.postech.ac.kr
     23 #server 0.rhel.pool.ntp.org
     24 #server 1.rhel.pool.ntp.org
     25 #server 2.rhel.pool.ntp.org
     26
     27 #broadcast 192.168.1.255 autokey        # broadcast server
     28 #broadcastclient                        # broadcast client
     29 #broadcast 224.0.1.1 autokey            # multicast server
     30 #multicastclient 224.0.1.1              # multicast client
     31 #manycastserver 239.255.254.254         # manycast server
     32 #manycastclient 239.255.254.254 autokey # manycast client

3. ntpd를 재시작 해줍니다.

#service ntpd restart

4. ntpd 상태 확인

#ntpq -pn을 통해 아래와같이 ntp의 상태를 확인 할 수 있습니다.
poll이 갱신 타임으로 ntp.conf에서 설정 가능 합니다.
     remote           refid          st t when  poll  reach  delay    offset   jitter
==========================================================
*141.223.182.106    .GPS.         1 u   58    64    377   8.643  -63.180  92.177





5. ntp 서버 통신 오류

#ntpd -pn

 remote        refid           st t when poll reach   delay   offset  jitter
=====================================================
 1.1.1.1         .INIT.          16 u    -   64    0    0.000    0.000   0.000

 no server suitable for synchronization found

위와 같이 통신이 안될 때 확실히 통신이 안되는지 아래 명령어를 통해 확인합니다.

#ntpd -d 1.1.1.1
아래와 같이

transmit(1.1.1.1)
transmit(1.1.1.1)
transmit(1.1.1.1)
transmit(1.1.1.1)
transmit(1.1.1.1)

전송만 하고 리시브 받지 못하면 ntp서버가 열려있지 않은 겁니다.

transmit(141.223.182.106)
receive(141.223.182.106)
transmit(141.223.182.106)
receive(141.223.182.106)
transmit(141.223.182.106)
receive(141.223.182.106)
transmit(141.223.182.106)
receive(141.223.182.106)
transmit(141.223.182.106)
server 141.223.182.106, port 123

정상적인 서버는 위와같이 receive 받습니다.

6. ntp time 강제로 맞추기

 ㄱ. ntpd 실행 상태에서 시간 맞추기
 
  # ntpdate -u 141.223.182.106
  13 Oct 14:59:06 ntpdate[51466]: adjust time server 141.223.182.106 offset 0.005536 sec

 위 명령어 -u는 ntpd 소켓인 123번 소켓이 아닌 다른 소켓을 사용하여 ntp서버 time을 받아옵니다.

 ㄴ. ntpd 서버 종료 후 시간 맞추기

  #service ntpd stop
  #ntpdate -b 141.223.182.106
  #service ntpd start

  위와 같은 방법을 사용하면 ntp서버를 멈춘 뒤 123번 포트를 이용해 date를 받아옵니다.

Python make port scanner(use nmap) #3 - make port scanner (파이썬 포트스캐너 만들기 #3 - port scanner)

앞서 두 과정을 통해 optparse의 사용과 nmap을 설치하였습니다.
이제 파이썬과 nmap 통해 port scanner를 제작 해보도록 하겠습니다.

참조 - 해커의언어, 치명적 파이썬 / TJ오코너

1. optparse 제작

먼저 optparse를 통해 아래와같은 소스를 제작해 보도록 하겠습니다.


-H와 -p -A 옵션을 통해 각각 아래의 기능을 구현합니다.

-H = Host name (ex. 127.0.0.1)
-p = port number (ex. 22)
-A = 직접 명시해 놓은 port (21,22,23,25,42,53,70,79,80,88,110,118,156,161,220,8080)을 스캐닝 합니다.

line 15: 15번 라인을 통해 -H옵션이 없거나 -p나 -A옵션중 하나가 쓰이지 않았다면 프로그램을 종료하도록 처리합니다.

line 19, 22: 19번 라인과 22번 라인을 통해 각 각 -p옵션과 -A옵션을 처리합니다.
-A옵션이 있을 때엔 위에 port변수에 명시한 port들을 scanning하는 분기를 처리하고
-A옵션이 없고 -p옵션이 있을 때에는 -p옵션에 명시한 port들을 scanning하는 분기를 처리합니다.

2. portscanner 제작

nmap을 통해 아래와 같은 함수를 제작해 줍니다.


line 4: 4번 라인을 통해 nmap.PortScanner를 load해 줍니다.
line 5: 5번 라인을 통해 함수 호출때 입력받은 인자(ip주소, 포트넘버)를 load 합니다.
line 6: 6번 라인을 통해 nmScan을 통해 현재 상태 state값을 받아옵니다.
line 7: 7번 라인을 통해 값을 print 해 줍니다.

3. portscanner 완성 및 실행

위에 제작한 1, 2번을 아래와 같이 합쳐줍니다.


27, 32번 line의 if else문도 수정 합니다.


------------------------------------------실행 모습---------------------------------------
# python3 TCPportscanner -H 127.0.0.1 -p 22
 [*] 127.0.0.1 tcp/22 open


# python3 TCPportscanner -H 127.0.0.1 -A
 [*] 127.0.0.1 tcp/21 closed
 [*] 127.0.0.1 tcp/22 open
 [*] 127.0.0.1 tcp/23 open
 [*] 127.0.0.1 tcp/25 closed
 [*] 127.0.0.1 tcp/42 closed
 [*] 127.0.0.1 tcp/53 closed
 [*] 127.0.0.1 tcp/70 closed
 [*] 127.0.0.1 tcp/79 closed
 [*] 127.0.0.1 tcp/80 closed
 [*] 127.0.0.1 tcp/88 closed
 [*] 127.0.0.1 tcp/110 closed
 [*] 127.0.0.1 tcp/118 closed
 [*] 127.0.0.1 tcp/156 closed
 [*] 127.0.0.1 tcp/161 closed
 [*] 127.0.0.1 tcp/220 closed
 [*] 127.0.0.1 tcp/8080 closed


( httpd 80번 포트 서비스 오픈 후 실행)
# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for 500009674769
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]

# python3 TCPportscanner -H 127.0.0.1 -A
 [*] 127.0.0.1 tcp/21 closed
 [*] 127.0.0.1 tcp/22 open
 [*] 127.0.0.1 tcp/23 open
 [*] 127.0.0.1 tcp/25 closed
 [*] 127.0.0.1 tcp/42 closed
 [*] 127.0.0.1 tcp/53 closed
 [*] 127.0.0.1 tcp/70 closed
 [*] 127.0.0.1 tcp/79 closed
 [*] 127.0.0.1 tcp/80 open
 [*] 127.0.0.1 tcp/88 closed
 [*] 127.0.0.1 tcp/110 closed
 [*] 127.0.0.1 tcp/118 closed
 [*] 127.0.0.1 tcp/156 closed
 [*] 127.0.0.1 tcp/161 closed
 [*] 127.0.0.1 tcp/220 closed
 [*] 127.0.0.1 tcp/8080 closed
------------------------------------------실행 모습---------------------------------------




Python make port scanner(use nmap) #2 - install nmap (파이썬 포트스캐너 만들기 #2 - nmap)

파이썬 포트스캐너 두 번째로 nmap과 nmap 라이브러리를 설치하도록 하겠습니다.

먼저 nmap을 설치하기위해 아래 명령어를 실행합니다.

# yum install -y nmap 

설치가 완료되어지면 아래 명령어를 통해 파이썬용 nmap 라이브러리를 다운받습니다.

# wget http://xael.org/pages/python-nmap-0.4.3.tar.gz 

다운받은 nmap의 압축을 풀어줍니다.

# tar -xvf python-nmap-0.4.3.tar.gz

압축 푼 python-nmap-0.4.3 디렉토리에 들어갑니다.

# cd python-nmap-0.4.3 

아래 명령어를 통해 라이브러리를 install 해줍니다.

# python setup.py install

위 과정을 통해 nmap의 설치화 python에서 nmap을 사용 할 수 있는 라이브러리의
준비가 완료되어집니다.

Python make port scanner(use nmap) #1 - optparse (파이썬 포트스캐너 만들기 #1 - optparse)

파이썬을 이용한 포트스캐너 제작에 앞서 python optparse 모듈에대해 알아보겠습니다.

optparse는 커맨드 라인 프로그램 실행에 이용된 option값을 parsing해주는 모듈입니다.

아래와 같은 커맨드를 가정해 보겠습니다.

python <%program> <%option> <%values>
python optparse.py -f TCPportscanner

위의 커맨드를 통해 program을 실행시킬때 option값을 통해 values를 가져오는 방식입니다.
optparse.py를 실행시킬 때 -f옵션을 통해 filename을 value로 가져오는 방식으로, 프로그램
내에서는 TCPportscanner의 파일명(경로)를 가져오게 됩니다.

아래 소스를 살펴보겠습니다.

line 3: parser = optarse.OptionParser() 를 통해 optparse모듈을 로드합니다.

line 4: parser.add_option()을 통해 받아올 옵션값에대한 정보를 가져옵니다.
a. "-f", "--file"는 사용할 옵션의 형태를 나타냅니다. 이를 통해 프로그램을 실행할 때
<%program> -f <%values>혹은 <%program> --file <%values>형태를 사용 할 수 있습니다.
b. dest="filename"을 통해 이후 변수에 값을 가져올 때 사용 할 도착지 이름입니다.
c. help="File name"을 통해 <%program> -h 명령어를 쳤을 때 불러올 help의 내용을 입력합니다.
d. metavar="FILE"을 통해 meta type을 정의해줍니다.

line 5: parser.add_option()
a. '-p'를 통해 옵션의 형태를 취합니다.
b. dest='port'를 통해 변수에 가져올 도착지 이름을 정합니다.
c. type='int'를 통해 변수의 type을 정의해 줍니다.
d.help=''를 통해 -h명령어에 대한 description을 정의합니다.

line 6: action='store_true', default=False
위 두 옵션은 Flag값을 정의할 때 쓰입니다.
기본적으로 parser.add_options()을 5번 라인과 같은 형태를 취했을 때엔
<%program> -p <%values> 형식으로 사용되어 지지만, flag형태를 취하면
<%program> -a 만으로도 불러 올 수 있고 -a옵션이 활성화되면 Flag가 True로 변하게 됩니다.

즉 action='store_true'를 통해 옵션을 불러왔을때 default=False로 설정되어있던 값을 True로 가져오게 됩니다.

line 8: (options, args) = parser.parse_args()
 parsing한 옵션 값들을 변수로 불러오기 위해 options에 집어넣어줍니다.

line 10, 11, 12: 기본적으로 option을 사용하지 않으면 값에 None가 들어있게 됩니다.
만약 필수 옵션이라면 if문을 통해 그 옵션값이 None일 때, 프로그램을 종료 시킬 수 있습니다.

line 14, 15, 16: 각각 받아온 옵션값을 변수에 저장해 줍니다.

line 18. 19. 20: 각각 받아온 옵션값을 출력합니다.

--------------------------------------------- 실행 모습------------------
# python3 optparse -f TCPportscanner
None
False
TCPportscanner



# python3 optparse -f TCPportscanner -p 22
22
False
TCPportscanner



# python3 optparse -f TCPportscanner -p 22 -a
22
True
TCPportscanner



#python3 optparse -h
Usage: optparse [options]

Options:
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  File name
  -p PORT               input port number

  -a                    flag tuto
--------------------------------------------- 실행 모습------------------