✨ HTTP 内网穿透
This commit is contained in:
parent
e674ee7177
commit
f220134e5b
@ -52,7 +52,7 @@ type AgentCliParam struct {
|
||||
Version bool // 当前版本号
|
||||
IPReportPeriod uint32 // 上报IP间隔
|
||||
UseIPv6CountryCode bool // 默认优先展示IPv6旗帜
|
||||
UseGiteeToUpgrade bool // 强制从Gitee获取更新
|
||||
UseGiteeToUpgrade bool // 强制从Gitee获取更新
|
||||
}
|
||||
|
||||
var (
|
||||
@ -222,7 +222,7 @@ func run() {
|
||||
// 上报服务器信息
|
||||
go reportState()
|
||||
// 更新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 {
|
||||
@ -388,8 +388,10 @@ func doTask(task *pb.Task) {
|
||||
case model.TaskTypeTerminalGRPC:
|
||||
handleTerminalTask(task)
|
||||
return
|
||||
case model.TaskTypeKeepalive:
|
||||
case model.TaskTypeNAT:
|
||||
handleNATTask(task)
|
||||
return
|
||||
case model.TaskTypeKeepalive:
|
||||
default:
|
||||
println("不支持的任务:", task)
|
||||
return
|
||||
@ -668,7 +670,7 @@ func handleTerminalTask(task *pb.Task) {
|
||||
|
||||
go func() {
|
||||
for {
|
||||
buf := make([]byte, 1024)
|
||||
buf := make([]byte, 10240)
|
||||
read, err := tty.Read(buf)
|
||||
if err != nil {
|
||||
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{}) {
|
||||
util.Println(agentConfig.Debug, v...)
|
||||
}
|
||||
|
@ -10,8 +10,14 @@ const (
|
||||
TaskTypeUpgrade
|
||||
TaskTypeKeepalive
|
||||
TaskTypeTerminalGRPC
|
||||
TaskTypeNAT
|
||||
)
|
||||
|
||||
type TerminalTask struct {
|
||||
StreamID string
|
||||
}
|
||||
|
||||
type TaskNAT struct {
|
||||
StreamID string
|
||||
Host string
|
||||
}
|
||||
|
@ -55,9 +55,9 @@ var (
|
||||
)
|
||||
|
||||
// UpdateIP 按设置时间间隔更新IP地址与国家码的缓存
|
||||
func UpdateIP(logging bool, useIPv6CountryCode bool, period uint32) {
|
||||
func UpdateIP(useIPv6CountryCode bool, period uint32) {
|
||||
for {
|
||||
util.Println(logging, "NEZHA_AGENT>> 正在更新本地缓存IP信息")
|
||||
util.Println(agentConfig.Debug, "正在更新本地缓存IP信息")
|
||||
var primaryIP, secondaryIP geoIP
|
||||
if useIPv6CountryCode {
|
||||
primaryIP = fetchGeoIP(geoIPApiList, true)
|
||||
|
Loading…
x
Reference in New Issue
Block a user