Go 语言编写 TCP 扫描器
TCP
- TCP,也就是传输控制协议(Transmission Control Protocol)。
TCP握手
客户端 -> 端口打开 ->服务器
- syn (请求建立新连接)
- syn-ack (同意创建新连接)
- ack (表示响应)
- 服务端端口关闭 Closed Port
- client -syn-> Server
- Server -rst-> Client
- 如果存在防火墙 Filtered Port
- Client —syn (Timeout)— Firewall Server
非并发的 TCP 扫描器
创建目录并在该目录创建main.go 文件
~/Code/go via golang 转到TCP代理/端口转发示例(https://zupzup.org/go-port-forwarding/)
package main
import (
"flag"
"fmt"
"io"
"log"
"net"
"os"
"os/signal"
)
var (
target string
port int
)
func init() {
flag.StringVar(&target, "target", "", "the target (<host>:<port>)")
flag.IntVar(&port, "port", 7757, "the tunnelthing port")
}
func main() {
flag.Parse()
signals := make(chan os.Signal, 1)
stop := make(chan bool)
signal.Notify(signals, os.Interrupt)
go func() {
for _ = range signals {
fmt.Println("\nReceived an interrupt, stopping...")
stop <- true
}
}()
incoming, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
log.Fatalf("could not start server on %d: %v", port, err)
}
fmt.Printf("server running on %d\n", port)
client, err := incoming.Accept()
if err != nil {
log.Fatal("could not accept client connection", err)
}
defer client.Close()
fmt.Printf("client '%v' connected!\n", client.RemoteAddr())
target, err := net.Dial("tcp", target)
if err != nil {
log.Fatal("could not connect to target", err)
}
defer target.Close()
fmt.Printf("connection to server %v established!\n", target.RemoteAddr())
go func() { io.Copy(target, client) }()
go func() { io.Copy(client, target) }()
<-stop
}
以上是关于Go语言(Golang)编写 TCP 端口扫描器的主要内容,如果未能解决你的问题,请参考以下文章