do not ignore FIN tcp packet

This commit is contained in:
hebo 2019-09-27 16:48:47 +08:00
parent e2a924c776
commit b79e9f6867
3 changed files with 35 additions and 17 deletions

View File

@ -20,13 +20,13 @@ import (
var ( var (
DeviceName string DeviceName string
snifferPort int snifferPort int
inParallel bool // inParallel bool
) )
func init() { func init() {
flag.StringVar(&DeviceName, "interface", "eth0", "network device name. Default is eth0") flag.StringVar(&DeviceName, "interface", "eth0", "network device name. Default is eth0")
flag.IntVar(&snifferPort, "port", 3306, "sniffer port. Default is 3306") flag.IntVar(&snifferPort, "port", 3306, "sniffer port. Default is 3306")
flag.BoolVar(&inParallel, "in_parallel", false, "if capture and deal package in parallel. Default is false") // flag.BoolVar(&inParallel, "in_parallel", false, "if capture and deal package in parallel. Default is false")
} }
// networkCard is network device // networkCard is network device
@ -93,21 +93,27 @@ func initEthernetHandlerFromPacp() (handler *pcap.Handle) {
} }
func (nc *networkCard) Listen() (receiver chan model.QueryPiece) { func (nc *networkCard) Listen() (receiver chan model.QueryPiece) {
if inParallel { // if inParallel {
nc.listenInParallel() // nc.listenInParallel()
//
} else { // } else {
nc.listenNormal() // nc.listenNormal()
} // }
nc.listenNormal()
return nc.receiver return nc.receiver
} }
func isFINPacket(data []byte) (isFIN bool) {
return
}
// Listen get a connection. // Listen get a connection.
func (nc *networkCard) listenNormal() { func (nc *networkCard) listenNormal() {
go func() { go func() {
aliveCounter := 0 aliveCounter := 0
handler := initEthernetHandlerFromPacpgo() handler := initEthernetHandlerFromPacp()
for { for {
var data []byte var data []byte
var ci gopacket.CaptureInfo var ci gopacket.CaptureInfo
@ -120,6 +126,18 @@ func (nc *networkCard) listenNormal() {
continue continue
} }
// packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy)
packet := gopacket.NewPacket(data, handler.LinkType(), gopacket.NoCopy)
m := packet.Metadata()
m.CaptureInfo = ci
// send FIN tcp packet to avoid not complete session cannot be released
tcpPkt := packet.TransportLayer().(*layers.TCP)
if tcpPkt.FIN {
nc.parseTCPPackage(packet)
continue
}
// capture packets according to a certain probability // capture packets according to a certain probability
tcpCapturePacketRate := communicator.GetTCPCapturePacketRate() tcpCapturePacketRate := communicator.GetTCPCapturePacketRate()
if tcpCapturePacketRate <= 0 { if tcpCapturePacketRate <= 0 {
@ -140,10 +158,6 @@ func (nc *networkCard) listenNormal() {
} }
aliveCounter = 0 aliveCounter = 0
packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy)
m := packet.Metadata()
m.CaptureInfo = ci
m.Truncated = m.Truncated || ci.CaptureLength < ci.Length
nc.parseTCPPackage(packet) nc.parseTCPPackage(packet)
} }
}() }()

View File

@ -13,7 +13,6 @@ const (
var ( var (
communicatePort int communicatePort int
// capturePacketRate float64
router = mux.NewRouter() router = mux.NewRouter()
) )
@ -21,15 +20,14 @@ var (
configMapLock sync.RWMutex configMapLock sync.RWMutex
configMap map[string]configItem configMap map[string]configItem
catpurePacketRate *capturePacketRateConfig catpurePacketRate *capturePacketRateConfig
catpurePacketRateVal float64
) )
func init() { func init() {
catpurePacketRate = newCapturePacketRateConfig() catpurePacketRate = newCapturePacketRateConfig()
flag.IntVar(&communicatePort, "communicate_port", 8088, "http server port. Default is 8088") flag.IntVar(&communicatePort, "communicate_port", 8088, "http server port. Default is 8088")
var cpr float64 flag.Float64Var(&catpurePacketRateVal, CAPTURE_PACKET_RATE, 0.01, "capture packet rate. Default is 0.01")
flag.Float64Var(&cpr, CAPTURE_PACKET_RATE, 0.01, "capture packet rate. Default is 0.01")
_ = catpurePacketRate.setVal(cpr)
configMap = make(map[string]configItem) configMap = make(map[string]configItem)
} }

View File

@ -11,6 +11,8 @@ import (
) )
func Server() { func Server() {
initConfig()
server := &http.Server{ server := &http.Server{
Addr: "0.0.0.0:" + strconv.Itoa(communicatePort), Addr: "0.0.0.0:" + strconv.Itoa(communicatePort),
IdleTimeout: time.Second * 5, IdleTimeout: time.Second * 5,
@ -22,6 +24,10 @@ func Server() {
} }
} }
func initConfig() {
_ = catpurePacketRate.setVal(catpurePacketRateVal)
}
func outletCheckAlive(resp http.ResponseWriter, req *http.Request) { func outletCheckAlive(resp http.ResponseWriter, req *http.Request) {
mp := hu.NewMouthpiece(resp) mp := hu.NewMouthpiece(resp)
defer func() { defer func() {