그림 12 LOOF 함수


과제에서 요구되사항은 1 시간에 1 번씩 도메인의 IP 주소를 수집하는 것이었다

그래서 사용한 방법은 Python time 모듈을 이용한 time.sleep()이었다

이 방법을 이용하면 원하는 시간만스크립트의 동작을 멈춘 뒤 다시 실행하도록 할 수 있다

11를의미하는1시간은그3600가된다.loof 함수에는 while 로 작성된 무한루프가 어있고 이 함수는 도메인 질의의 주기가 되는 시간과 도메인을 매개변수로 받는다


[그림 12]17 에서 3600 과 도메인 ‘fl0ckfl0ck.info’달받은 loof 함수는 4 에서 [그림 2]dns_query 함수에 실행 결과를 5 data 리스트로 정리해 6 [그림 4]write_csv 함수에게 결과값을 csv 로 기입하도록 한9 에서 3600 시간 정지에 어간다

3600 그러1 시간이 지이후 3 while 문에 따라 해당 동작을 반복하게 된다.

12 ~15 write_csv 함수에서 결과를 기입하기 에 항목의 이 되는 부분을 작성해준 코드이다.


터미널이 종료되고 서도 스크립트를 실행한 프로세스가 백그라운드에서 동작하도록 하자. 음에는 단하게 명령어 ‘&’여 백그라운드로 리는 방법을 시도해보았다

하지만 터미널이 종료된 다음 jobs 명령어와 ps –ef 명령어로 확인해보백그라운드 동작이 멈춰있었다. 그래서 찾은 방법은 ‘nohup’ 을 이용하는 것이었다.


‘nohup’ 리눅스, 스에서 스크립트파일 (*.sh)데몬형태로 실행시. 따라서 터미널 세션이 겨도 실행을 추지 않고 동작하도록 한다

여기서 주의사항은 ‘nohup’ 을 실행할 스크립트는 미션이 755 상태여야 한다는 것이다


‘&’는 백그라운드로 프로세스를 실행하기 때문에 터미널의 세션이 기면 프로세스의 실행이 종료된다. ‘nohup’은 프로세스 실행시 hang-up signal 이 와도 프로세스가 계속 동작하기 때문에 터미널 세션이 도 실행을 추지 않는 차이점이 있다.






그림 7 NOHUP 으로 스크립트 실행


[그림 7]에서 nohup python3 dns_ip.py & 명령어를 통해 스크립트를 실행시켰다.




그림 8[그림8] 명령어 실행 이후


[그림 7]의 명령어에서 실행한 스크립트가 있는 더에 nohup.out 파일과 dns_result.csv 파일이 생성된 것을 [그림 11]를 통해 확인할 수 있었다. nohup.out 파일에는 스크립트 동작 중 출되는 내용이 기록된다.



그림 9 NOHUP.OUT 파일


Python 스크립트에 결과를 출하는 소스코드가 nohup.out 에 기록되는 것을

확인할 수 있었다.
프로세스가 정로 터미널 세션이 끊긴 뒤에도 동작하는지 확인해보았다.



그림 10 터미널 종료 프로세스 동작 확인


[그림 10]과 같이 터미널을 종료하기 [그림 7]에서 실행한 프로세스가 동작하고

있는지 확인했다. 2:11am 에 프로세스가 실행된 것을 수 있다.



그림 11 터미널 종료 후 프로세스 동작 확인


터미널을 종료하고 2:15:10am 에 터미널을 다시 프로세스의 동작 여부를 확인해보았다


그리고 [그림 11]와 같이 2:11am 에 실행시프로세스가 계속 동작 중인 것을 수 있었다


게 백그라운드에서 동작 중인 프로세스를 종료하기 위해선 [그림11]와 같이 “ps–ef|grep‘실행파일 명’”을 통해 PID 를 확인한 ‘kill PID’라고 명령어를 면 된다.



[그림 4]의 결과값을 과제 제출용 CSV 파일로 만어주는 과정이 요했다.




그림 5 WRITE_CSV 함수


그래서 [그림 5]와 같이 기입결과값을 인자로 넘겨받아 CSV 파일에 작성하는 함수를 만었다. 이때 이 함수는 ‘a’ 션으로 파일을 여는그 이유는 계속되는 질의 응답의 결과를 이어서 CSV 파일에 계속 기입해야 하기 때문이다.


그림 6 CSV 파일에 결과 기입


[그림 5]write_csv 함수를 사용한 결과를 [그림 6]에서 확인할 수 있다. [그림 6]3 에 한번씩 도메인의 IP 주소를 는 질의에 DNS 서버의 응답을 정리해 CSV 파일로 기입한 것이다. 사실 이 과정에서 CSV 파일에서 Time 항목에서 잘린 채 값이 보여서 음에 코못되었나 헤맸었다.



그림 7 CSV 파일


확인결과 에서 사용자 지정으로 까지 보이게 하는 방법이 있다는 것을 게되었고 까지 보이도록 설정해 문제를 해결하였다.

[그림 2]에서 도메인 질의를 할 DNS 서버를 지정할 수 있었다. 하지만 1 시간에 한번씩 도메인의 IP 주소를 확인해야 하는 과제 특성상 도메인 질의 당시 DNS 서버가 응답을 주지 않는다면 원하는 정보를 수집할 수 없게 된다. 따라서 보조적으로 도메인 질의에 응답을 DNS 서버 설정이 요했다. 그래서 생3 개 정도 DNS 서버를 Python 리스트에 저장해고 하의 서버가 동작하지 않았을 때 응답하는 DNS 서버를 찾기 위해 3개의 DNS서버에 질의를 하는 for 문을 만고 최종적으로 도메인에 대한 IP 주소를 받을 때까지 질의를 계속하는 While 문을 for 는 구조를 생했다.



그림 보조 DNS 서버 설정 소스코드


[그림 3]Python dns.resolver 모듈을 이용한 보조 DNS 서버 설정 소스코드이다. 서 설명했것과 같이 [그림 3]3 을 보면 저 국외 DNS 서버의 IP 주소 를 foreign_dns 리스트에 저장했다. 그리고 7 for 문을 사용해 3 의 리스트에서 국외 DNS 서버 인자를 하빼오도록 하였고 8 에서는 DNS 서버에 질의할 때 트워크 연결이 겨서 오류는 것과 같은 상을 염try, except 문을 사용하였다. 그리고 10 에서 7 for 문의 인자인 국외 서버 DNS 를 가와 질의를 한질의를 한 시간을 11 에서 now 변수에 설정해for 문을 가도록 했다.


내가 정한 3개의 국외 DNS 서버에서 한 번의 for문을 거치는 것으로 도메인에 해당하는 IP 주소를 확인할 수 있다면 좋겠지만 만약의 경우에 for 문을 한 번 거치로는 원하는 응답을 못을 수 있다고 생6 while 문을 무한루프를 돌려 16 IP 주소 변수에 값이 있을 때까지 도메인 질의를 하는 for 문을 반복하도록 하였다. 그리고 23 에서는 질의를 한 시간, 도메인의 IP 주소, 질의에 사용된 DNS 서버를 함수 동작 결과값으로 보내주도록 하였다



그림 4 DNS_QUERY 함수 결과값


[그림 3]dns_query 함수를 3 에 한번씩 질의하게 한 결과를 터미널에 출되도록 하였다. 그 결과 [그림 4]와 같이 과제의 결과로 요한 항목되는 것을 확인하였다.


mac 운영체제에서 수행했으며 사용한 언어는 Python3.6 이다. 우선, domain 으로 IP 주소를 확인하는 방법을 검색하다가 Python socket 모듈을 이용한 방법을 발견했다.



그림 1 SOCKET 모듈을 이용한 DNS QUERY


[그림 1]Python socket 모듈의 gethostbyname() 함수를 통해 매개변수로 넘겨준 도메인의 IP 주소 를 확인할 수 있다. 매우 간단한 명령어로 수행할 수 있었다. 하지만 국내 서버가 아닌 해외 DNS 서버를 지정해 수행해야 하기 때문에 해당 스크립트로 해결할 수 없었다. 그래서 다음으로 내가 지정한 DNS 서버에 DNS 쿼리를 질의하는 방법을 찾아보았다.



그림 2 DNS.RESOLVER 모듈을 이용한 DNS QUERY


[그림 2][그림 1]socket 모듈을 이용할 때와는 다르게 Python 외장 라이브러리 dnspython dns.resolver 모듈을 이용하여 DNS 서버 지정해 도메인을 질의한다. [그림 2]를 보면 r.nameservers = [‘8.8.8.8’] 와 같이 DNS 서버를 지정할 수 있다. 과제에서 요구 조건으로 국외 DNS 서버에 질의하고, 해당 DNS 서버에서 응답을 받지 못하는 경우를 생해 보조 DNS 를 고해야 하므로 [그림 2]의 방으로 수행하기로 하였다.


+ Recent posts