go-portScan icon indicating copy to clipboard operation
go-portScan copied to clipboard

只探测单个端口不出结果,这个端口混在很多端口里一起探测才能探测出来结果

Open Ti0oik opened this issue 5 months ago • 1 comments

我直接用示例的代码,对单个端口,比如说22进行端口探测,探测不出来是否存活,但是用了top1000去探测就能探测出来22是存活的,大佬帮忙看看这是什么原因造成的,以下是我的代码:

import (
	"log"
	"net"
	"sync"
	"testing"
	"time"

	"github.com/XinRoom/go-portScan/core/port"
	"github.com/XinRoom/go-portScan/core/port/syn"
	"github.com/XinRoom/iprange"
	"github.com/panjf2000/ants/v2"
)

func TestMain(t *testing.T) {
	//single := make(chan struct{})
	retChan := make(chan port.OpenIpPort, 65535)
	// go func() {
	// 	//for ret := range retChan {
	// 	//	log.Println(ret)
	// 	//}
	// 	single <- struct{}{}
	// }()

	// 解析端口字符串并且优先发送 TopTcpPorts 中的端口, eg: 1-65535,top1000
	ports, err := port.ShuffleParseAndMergeTopPorts("22")
	if err != nil {
		log.Fatal(err)
	}

	log.Println(ports)

	// parse ip
	it, startIp, _ := iprange.NewIter("10.0.8.55")

	// scanner
	ss, err := syn.NewSynScanner(startIp, retChan, syn.DefaultSynOption)
	if err != nil {
		log.Fatal(err)
	}

	// port scan func
	portScan := func(ip net.IP) {
		for _, _port := range ports { // port
			ss.WaitLimiter()
			err := ss.Scan(ip, _port) // syn 不能并发,默认以网卡和驱动最高性能发包
			if err != nil {
				log.Println(err)
			}
		}
	}

	// Pool - ping and port scan
	var wgPing sync.WaitGroup
	poolPing, _ := ants.NewPoolWithFunc(50, func(ip interface{}) {
		_ip := ip.(net.IP)
		//if host.IsLive(_ip.String(), true, 800*time.Millisecond) {
		portScan(_ip)
		//}
		wgPing.Done()
	})
	defer poolPing.Release()

	start := time.Now()
	for i := uint64(0); i < it.TotalNum(); i++ { // ip索引
		ip := make(net.IP, len(it.GetIpByIndex(0)))
		copy(ip, it.GetIpByIndex(i)) // Note: dup copy []byte when concurrent (GetIpByIndex not to do dup copy)
		wgPing.Add(1)
		poolPing.Invoke(ip)
	}

	wgPing.Wait()
	ss.Close()
	//<-single
	log.Println(time.Since(start))
	log.Println(len(retChan))

Ti0oik avatar Sep 19 '24 10:09 Ti0oik