Go语言(Golang)编写 TCP 端口扫描器

Posted 小乔的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言(Golang)编写 TCP 端口扫描器相关的知识,希望对你有一定的参考价值。

Go 语言编写 TCP 扫描器

TCP

  • TCP,也就是传输控制协议(Transmission Control Protocol)。

TCP握手

  • 建立 TCP连接(或者叫打开端口),需要3次握手

客户端 -> 端口打开 ->服务器

  1. syn (请求建立新连接)
  2. syn-ack (同意创建新连接)
  3. 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 端口扫描器的主要内容,如果未能解决你的问题,请参考以下文章

golang高性能端口扫描

golang 转到TCP代理/端口转发示例(https://zupzup.org/go-port-forwarding/)

Golang✔️走进 Go 语言✔️ 第二十四课 TCP 高阶操作

Golang✔️走进 Go 语言✔️ 第二十四课 TCP 高阶操作

Golang✔️走进 Go 语言✔️ 第二十三课 UDP & TCP

Golang✔️走进 Go 语言✔️ 第二十三课 UDP & TCP