✨ HTTP 内网穿透
This commit is contained in:
parent
e674ee7177
commit
f220134e5b
@ -52,7 +52,7 @@ type AgentCliParam struct {
|
|||||||
Version bool // 当前版本号
|
Version bool // 当前版本号
|
||||||
IPReportPeriod uint32 // 上报IP间隔
|
IPReportPeriod uint32 // 上报IP间隔
|
||||||
UseIPv6CountryCode bool // 默认优先展示IPv6旗帜
|
UseIPv6CountryCode bool // 默认优先展示IPv6旗帜
|
||||||
UseGiteeToUpgrade bool // 强制从Gitee获取更新
|
UseGiteeToUpgrade bool // 强制从Gitee获取更新
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -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...)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user