go-portScan
go-portScan copied to clipboard
只探测单个端口不出结果,这个端口混在很多端口里一起探测才能探测出来结果
我直接用示例的代码,对单个端口,比如说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))