간단한 서버와 클라이언트 구현과 응용
실습하는 책의 저자가 데비안(칼리와 우분투가 파생된 리눅스 계열)에서 FTP 서버를 사용하는 것을 숙지하고 실습으로 들어가서 필자의 랩탑에 있는 우분투로 FTP 서버를 구축하고 접속하는데 30여분 삽질하다가 먼저 서버와 클라이언트의 통신과 응용을 복습한다.
위의 UDP 소켓 구현에서 socket 함수의 AF_INET은 ipv4 사용을 의미한다. 이어 SOCK_DGRAM은 데이터그램의 약자로 UDP 통신에서의 패킷 단위다. 다음 예제에서 SOCK_STREAM은 연결 지향(connection oriented) 속성을 가진 TCP 통신의 패킷 단위다. 즉 각각의 소켓 통신 패킷 유니트(단위)를 사용하는 인자를 호출하고 뒤이어 그 프로토콜인 IPPROTO_UDP를 호출한 값을 sock 변수에 대입했다. 그리고 여기서는 ‘recvfrom’이라는 함수를 통해 가져올 수 있는 데이터 공간(버퍼)을 할당했다.
아래는 ‘sendto’ 함수를 이용해 UDP 소켓 통신을 구현한 코드다. 위와 동일한 소스에 이어 함수 setsockopt 함수를 통해 주소 재사용을 허용했고(그런데 프로그램을 재실행하면 주소를 재사용했다고 에러가 뜰까?), 메시지라는 변수에 아스키코드 기반의 바이트 타입의 문자열(20 bytes)을 저장한 값을 출력시키는 소스를 구현한다.
위의 예제 두 개를 응용해서 프로세서(parent, child)를 활용한 TCP 소켓 서버를 구현한 게 아래 소스다. 그 아래는 해당 소스를 백그라운드로 실행시켜 객체 값을 확인한 결과 화면이다.
각각의 TCP, UDP 프로토콜에서 데이터 송수신 시 사용 가능한 함수를 알아보고 구글 DNS 서버에 접속하는 응용 예제까지 구현하는 것을 통해 다음 섹션의 포트 스캐닝과 FTP 클라이언트 구현까지 응용하는 단계로 실습을 구성한 아래 책 저자의 의도가 느껴졌다.
참조
오동진, 박재유. (2020). 모의 침투 입문자를 위한 파이썬 3 활용 (pp. 75-77). n.p.: 에이콘