Segurança com Go - Desenvolvendo um port scanner em Go

Apesar do escaneamento de portas ser algo relacionado a segurança vira e mexe saber se algo está online ou não é bom. E ter talvez um teste de conectividade em um container pode resolver alguns problemas mais rapidamente.

E como estou muito interessado no Go acabei começando a fuçar em uma função que possa testar a conectividade em um container. E como já havia brincado com isto em C, até preciso achar isto no meu disco e depois atualizo aqui com o código fonte.

E agora vamos lá. Eu peguei 3 portas específicas de protocolos mais comuns com os quais nós vamos trabalhar nos exemplos.

PortServiço
22SSH
443HTTPS
80HTTP

Primeiro um exemplinho simples testando a porta 22

Por exemplo se precisamos testar a porta 22 de um container ou servidor antes de publicar uma aplicação ( até um banco de dados, por exemplo ).

Assim vamos perder um tempinho discutindo a principal função deste código. A biblioteca net contém boa parte do que iremos precisar aqui.

func scanPort(protocol, hostname string, port int) bool {    
	address := hostname + ":" + strconv.Itoa(port)    
	conn, err := net.DialTimeout(protocol, address, 60*time.Second)    
    
	if err != nil {    
		return false    
	}    
	defer conn.Close()    
	return true    
}    
package main    

import (    
	"fmt"    
	"net"    
	"strconv"    
	"time"    
)    
    
func scanPort(protocol, hostname string, port int) bool {    
	address := hostname + ":" + strconv.Itoa(port)    
	conn, err := net.DialTimeout(protocol, address, 60*time.Second)    
    
	if err != nil {    
		return false    
	}    
	defer conn.Close()    
	return true    
}    
    
func main() {    
	fmt.Println("Port Scanning")    
	open := scanPort("tcp", "localhost", 22)    
	fmt.Printf("Port Open: %t\n", open)    
}    

E quando rodamos o código temos o seguinte resultado, onde quando a porta está aberta mostra o resultado.

$ go run ~/ddd.go    
Port Scanning    
Port Open: true    

Security in Go - Build a Port Scanner in Go