Files
proxy/server/mnt/mnt.go

66 lines
1.4 KiB
Go
Raw Normal View History

package mnt
2025-02-19 14:23:58 +08:00
import (
"context"
"log/slog"
2025-02-19 14:23:58 +08:00
"github.com/google/gopacket"
"github.com/google/gopacket/pcap"
"github.com/pkg/errors"
2025-02-27 18:07:00 +08:00
"golang.org/x/text/encoding/simplifiedchinese"
2025-02-19 14:23:58 +08:00
)
func Start(ctx context.Context, errCh chan error) {
// 打开一个网络接口
device, err := pcap.OpenLive("WLAN", 1600, true, pcap.BlockForever)
if err != nil {
2025-02-27 18:07:00 +08:00
gbk := simplifiedchinese.GBK.NewDecoder()
errMsg, err := gbk.String(err.Error())
if err != nil {
errMsg = err.Error()
}
errCh <- errors.Wrap(err, "打开网络接口失败, "+errMsg)
2025-02-19 14:23:58 +08:00
return
}
defer device.Close()
err = device.SetBPFFilter("tcp")
if err != nil {
errCh <- errors.Wrap(err, "设置 BPF 过滤器失败")
return
}
err = device.SetDirection(pcap.DirectionIn)
if err != nil {
errCh <- errors.Wrap(err, "设置捕获方向失败")
return
}
// 创建一个数据包源
source := gopacket.NewPacketSource(device, device.LinkType())
source.NoCopy = true
source.Lazy = true
for {
select {
case <-ctx.Done():
slog.Debug("monitor 被动结束")
errCh <- nil
return
case packet := <-source.Packets():
handle(packet)
}
}
}
func handle(packet gopacket.Packet) {
slog.Debug("Packet: ", packet)
slog.Debug("Layers: ", packet.Layers())
slog.Debug("Application: ", packet.ApplicationLayer())
slog.Debug("Transport: ", packet.TransportLayer())
slog.Debug("Network: ", packet.NetworkLayer())
slog.Debug("Link: ", packet.LinkLayer())
}