HTTP 内网穿透

This commit is contained in:
naiba 2024-07-14 19:41:13 +08:00
parent e674ee7177
commit f220134e5b
3 changed files with 71 additions and 6 deletions

View File

@ -222,7 +222,7 @@ func run() {
// 上报服务器信息 // 上报服务器信息
go reportState() go reportState()
// 更新IP信息 // 更新IP信息
go monitor.UpdateIP(agentConfig.Debug, agentCliParam.UseIPv6CountryCode, agentCliParam.IPReportPeriod) go monitor.UpdateIP(agentCliParam.UseIPv6CountryCode, agentCliParam.IPReportPeriod)
// 定时检查更新 // 定时检查更新
if _, err := semver.Parse(version); err == nil && !agentCliParam.DisableAutoUpdate { if _, err := semver.Parse(version); err == nil && !agentCliParam.DisableAutoUpdate {
@ -388,8 +388,10 @@ func doTask(task *pb.Task) {
case model.TaskTypeTerminalGRPC: case model.TaskTypeTerminalGRPC:
handleTerminalTask(task) handleTerminalTask(task)
return return
case model.TaskTypeKeepalive: case model.TaskTypeNAT:
handleNATTask(task)
return return
case model.TaskTypeKeepalive:
default: default:
println("不支持的任务:", task) println("不支持的任务:", task)
return return
@ -668,7 +670,7 @@ func handleTerminalTask(task *pb.Task) {
go func() { go func() {
for { for {
buf := make([]byte, 1024) buf := make([]byte, 10240)
read, err := tty.Read(buf) read, err := tty.Read(buf)
if err != nil { if err != nil {
remoteIO.Send(&pb.IOStreamData{Data: []byte(err.Error())}) remoteIO.Send(&pb.IOStreamData{Data: []byte(err.Error())})
@ -702,6 +704,63 @@ func handleTerminalTask(task *pb.Task) {
} }
} }
func handleNATTask(task *pb.Task) {
var nat model.TaskNAT
err := util.Json.Unmarshal([]byte(task.GetData()), &nat)
if err != nil {
println("NAT 任务解析错误:", err)
return
}
remoteIO, err := client.IOStream(context.Background())
if err != nil {
println("NAT IOStream失败", err)
return
}
// 发送 StreamID
if err := remoteIO.Send(&pb.IOStreamData{Data: append([]byte{
0xff, 0x05, 0xff, 0x05,
}, []byte(nat.StreamID)...)}); err != nil {
println("NAT 发送StreamID失败", err)
return
}
conn, err := net.Dial("tcp", nat.Host)
if err != nil {
println(fmt.Sprintf("NAT Dial %s 失败:%s", nat.Host, err))
return
}
defer func() {
err := conn.Close()
errCloseSend := remoteIO.CloseSend()
println("NAT exit", nat.StreamID, err, errCloseSend)
}()
println("NAT init", nat.StreamID)
go func() {
buf := make([]byte, 10240)
for {
read, err := conn.Read(buf)
if err != nil {
remoteIO.Send(&pb.IOStreamData{Data: []byte(err.Error())})
remoteIO.CloseSend()
return
}
remoteIO.Send(&pb.IOStreamData{Data: buf[:read]})
}
}()
for {
var remoteData *pb.IOStreamData
if remoteData, err = remoteIO.Recv(); err != nil {
return
}
conn.Write(remoteData.Data)
}
}
func println(v ...interface{}) { func println(v ...interface{}) {
util.Println(agentConfig.Debug, v...) util.Println(agentConfig.Debug, v...)
} }

View File

@ -10,8 +10,14 @@ const (
TaskTypeUpgrade TaskTypeUpgrade
TaskTypeKeepalive TaskTypeKeepalive
TaskTypeTerminalGRPC TaskTypeTerminalGRPC
TaskTypeNAT
) )
type TerminalTask struct { type TerminalTask struct {
StreamID string StreamID string
} }
type TaskNAT struct {
StreamID string
Host string
}

View File

@ -55,9 +55,9 @@ var (
) )
// UpdateIP 按设置时间间隔更新IP地址与国家码的缓存 // UpdateIP 按设置时间间隔更新IP地址与国家码的缓存
func UpdateIP(logging bool, useIPv6CountryCode bool, period uint32) { func UpdateIP(useIPv6CountryCode bool, period uint32) {
for { for {
util.Println(logging, "NEZHA_AGENT>> 正在更新本地缓存IP信息") util.Println(agentConfig.Debug, "正在更新本地缓存IP信息")
var primaryIP, secondaryIP geoIP var primaryIP, secondaryIP geoIP
if useIPv6CountryCode { if useIPv6CountryCode {
primaryIP = fetchGeoIP(geoIPApiList, true) primaryIP = fetchGeoIP(geoIPApiList, true)