Rails Insights

루비로 포트 스캐너 만들기

포트 스캐너는 네트워크 보안 및 관리에서 중요한 도구입니다. 이 도구는 특정 호스트의 열려 있는 포트를 확인하여 해당 시스템의 보안 상태를 평가하는 데 사용됩니다. 이번 글에서는 루비를 사용하여 간단한 포트 스캐너를 만드는 방법을 알아보겠습니다. 루비는 간결하고 읽기 쉬운 문법 덕분에 초보자에게 적합한 프로그래밍 언어입니다.

포트 스캐너란?

포트 스캐너는 네트워크의 특정 IP 주소에 대해 열려 있는 포트를 탐색하는 프로그램입니다. 포트는 네트워크 통신에서 특정 서비스나 애플리케이션을 식별하는 데 사용됩니다. 예를 들어, 웹 서버는 일반적으로 80번 포트를 사용합니다. 포트 스캐너를 사용하면 다음과 같은 정보를 얻을 수 있습니다:

  • 열려 있는 포트 목록
  • 각 포트에서 실행 중인 서비스
  • 네트워크의 보안 취약점

루비 환경 설정하기

루비를 사용하여 포트 스캐너를 만들기 위해서는 먼저 루비 환경을 설정해야 합니다. 루비는 다양한 플랫폼에서 사용할 수 있으며, 설치 방법은 다음과 같습니다:

# macOS에서 Homebrew를 사용하여 루비 설치
brew install ruby

# Ubuntu에서 APT를 사용하여 루비 설치
sudo apt-get install ruby-full

루비가 설치되면, 터미널에서 다음 명령어를 입력하여 설치가 제대로 되었는지 확인할 수 있습니다:

ruby -v

포트 스캐너 코드 작성하기

이제 포트 스캐너의 기본 코드를 작성해 보겠습니다. 아래 코드는 주어진 IP 주소에 대해 지정된 포트 범위를 스캔하는 간단한 포트 스캐너입니다.

require 'socket'

def port_scanner(ip, start_port, end_port)
  puts "스캔 중: #{ip} (포트 #{start_port} ~ #{end_port})"
  
  (start_port..end_port).each do |port|
    begin
      socket = Socket.new(:INET, :STREAM)
      socket.connect(Socket.sockaddr_in(port, ip))
      puts "포트 #{port}는 열려 있습니다."
    rescue Errno::ECONNREFUSED
      puts "포트 #{port}는 닫혀 있습니다."
    rescue => e
      puts "오류 발생: #{e.message}"
    ensure
      socket.close if socket
    end
  end
end

# 사용 예시
ip_address = '127.0.0.1' # 스캔할 IP 주소
start_port = 1            # 시작 포트
end_port = 100            # 끝 포트

port_scanner(ip_address, start_port, end_port)

코드 설명

위 코드는 다음과 같은 기능을 수행합니다:

  • Socket 라이브러리: 루비의 Socket 라이브러리를 사용하여 네트워크 소켓을 생성합니다.
  • 포트 범위 설정: 사용자가 지정한 포트 범위에 대해 반복합니다.
  • 소켓 연결: 각 포트에 대해 소켓을 생성하고 연결을 시도합니다.
  • 예외 처리: 연결이 거부되거나 다른 오류가 발생할 경우 이를 처리합니다.

포트 스캐너 개선하기

기본 포트 스캐너는 작동하지만, 몇 가지 기능을 추가하여 더 유용하게 만들 수 있습니다. 다음은 몇 가지 개선 사항입니다:

  • 멀티스레딩: 여러 포트를 동시에 스캔하여 속도를 높일 수 있습니다.
  • 결과 저장: 스캔 결과를 파일에 저장하여 나중에 분석할 수 있습니다.
  • 사용자 인터페이스: 명령줄 인터페이스를 개선하여 사용자 친화적으로 만들 수 있습니다.

멀티스레딩 구현하기

멀티스레딩을 사용하여 포트 스캐너의 성능을 향상시킬 수 있습니다. 아래는 멀티스레딩을 추가한 코드 예시입니다:

require 'socket'
require 'thread'

def port_scanner(ip, start_port, end_port)
  puts "스캔 중: #{ip} (포트 #{start_port} ~ #{end_port})"
  threads = []

  (start_port..end_port).each do |port|
    threads << Thread.new do
      begin
        socket = Socket.new(:INET, :STREAM)
        socket.connect(Socket.sockaddr_in(port, ip))
        puts "포트 #{port}는 열려 있습니다."
      rescue Errno::ECONNREFUSED
        puts "포트 #{port}는 닫혀 있습니다."
      rescue => e
        puts "오류 발생: #{e.message}"
      ensure
        socket.close if socket
      end
    end
  end

  threads.each(&:join) # 모든 스레드가 완료될 때까지 대기
end

# 사용 예시
ip_address = '127.0.0.1' # 스캔할 IP 주소
start_port = 1            # 시작 포트
end_port = 100            # 끝 포트

port_scanner(ip_address, start_port, end_port)

결론

이번 글에서는 루비를 사용하여 간단한 포트 스캐너를 만드는 방법을 알아보았습니다. 포트 스캐너는 네트워크 보안 및 관리에 유용한 도구이며, 루비의 간결한 문법 덕분에 쉽게 구현할 수 있습니다. 기본적인 포트 스캐너를 만든 후에는 멀티스레딩, 결과 저장, 사용자 인터페이스 개선 등 다양한 방법으로 기능을 확장할 수 있습니다.

이제 여러분도 루비로 포트 스캐너를 만들어 보세요! 네트워크 보안에 대한 이해를 높이고, 프로그래밍 실력을 향상시키는 좋은 기회가 될 것입니다.

Published: August 12, 2024

© 2024 RailsInsights. All rights reserved.