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.
Port | Serviço |
---|---|
22 | SSH |
443 | HTTPS |
80 | HTTP |
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