搭建IPv6签到服务器
首页 > 网络通信   作者:皮皮华  2022年8月8日 17:47 星期一  热度:996°  字号:   评论:0 条
时间:2022-8-8 17:47   热度:996°  评论:0 条 

一、目录说明

不同平台的FRP程序可在https://github.com/fatedier/frp获取。

.
├── frpc_0.44.0_linux_arm   //FRP客户端相关
│   ├── frpc                    //FRP客户端程序
│   └── frpc.ini                //配置文件
├── frps_0.29.0_linux_amd64 //FRP服务端相关
│   ├── 404.html                //404页面
│   ├── frps                    //FRP服务端程序
│   └── frps.ini                //配置文件
├── IPv6                    //IPv6服务
│   ├── IPv6                    //IPv6程序
│   └── main.go             //GO源码
├── IPv6.sh                 //一键运行服务脚本
├── pushFRP.bat             //一键推送脚本
└── Readme.md               //使用说明 

二、搭建

1、服务端部署

将frps_0.29.0_linux_amd64目录全部推送至FRP服务器并配置开机自启。配置开机自启的方法主要是修改rc.local文件。

sudo vi /etc/rc.local 

增加以下内容,根据自己实际推送的目录修改。

cd /home/public/frp_0.29.0_linux_amd64/
nohup ./frps -c ./frps.ini >/dev/null 2>&1 & 

2、客户端部署

执行pushFRP.bat一键推送脚本,将自动推送相关文件到设备,并自动启动相关服务,完成IPv6服务器搭建。

三、通讯原理

四、详解

1、FRP服务端配置参数

 [common]
#FRP服务端口
bind_port = 7376
#客户端秘钥
token = pipihua
#404页面
custom_404_page = /home/public/frp_0.29.0_linux_amd64/404.html
#FRP后台管理端口
dashboard_port = 7377
#FRP后台管理账号
dashboard_user = admin
#FRP后台管理密码
dashboard_pwd = admin
#日志文件
#log_file = ./log.log
#日志等级:debug, info, warn, error
#log_level = debug 

2、FRP客户端配置参数

 [common]
#FRP服务器地址
server_addr = 120.234.66.171
#服务端口,与frps.ini里设置对应
server_port = 7376
# 连接认证token,与frps.ini里设置对应
token = pipihua

#服务名称
[IPv6]
#协议类型,可选 tcp udp http https等
type = tcp
#本地ip,不用修改
local_ip = 127.0.0.1
#本地端口
local_port = 7275
#外网访问端口
remote_port = 7375 

3、IPv6执行脚本

#!/bin/bash
#后台启动签到服务 7274端口签到 7275端口HTTP服务
nohup /mtd0/app0/IPv6 -d >/dev/null 2>&1 &
#后台启动内网穿透服务 外网7375转发至本地7275端口
nohup /mtd0/app0/frpc -c /mtd0/app0/frpc.ini >/dev/null 2>&1 & 

4、push.bat脚本

#!/bin/bash
mode con cols=120 lines=50
@title=一键推送并启动FRP
@color 02
adb devices
::推送相关程序至设备
adb push %~dp0\frpc_0.44.0_linux_arm\frpc /mtd0/app0
adb push %~dp0\frpc_0.44.0_linux_arm\frpc.ini /mtd0/app0
adb push %~dp0\IPv6 /mtd0/app0
adb push %~dp0\IPv6.sh /os/
::修改权限
adb shell chmod -R 777 /os/
adb shell chmod -R 777 /mtd0/app0
::执行程序
adb shell /os/IPv6.sh
pause 

5、IPv6服务

IPv6服务采用go语言编写,主要是主要负责启动一个本地IPv6签到的服务端口7274及一个HTTP服务端口7275用于查看IPv6信息,源码如下:

package main

import (
    "fmt"
    "net"
    "net/http"
    "os"
    "os/exec"
    "runtime"
    "strings"
)

/*
编译跨平台的只需要修改GOOS、GOARCH、CGO_ENABLED三个环境变量即可
GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
GOARCH:目标平台的体系架构32位还是64位(386、amd64、arm)
SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=arm
go build
*/
//参数识别
func Daemonize(args ...string) {
    sysType := runtime.GOOS
    if sysType == "linux" {
        var arg []string
        if len(args) > 1 {
            arg = args[1:]
        }
        fmt.Println("run in backMode")
        cmd := exec.Command(args[0], arg...)
        cmd.Env = os.Environ()
        cmd.Start()
    } else if sysType == "windows" {

    }
}
func HexToHexStr(buf []byte) string {
    len := len(buf)
    str := ""
    for i := 0; i < len; i++ {
        if i == 0 {
            str = fmt.Sprintf("%02X", buf[i])
        } else {
            str += fmt.Sprintf(" %02X", buf[i])
        }
    }
    return str
}

func process(con net.Conn) {
    defer con.Close()
    for {
        buf := make([]byte, 1024)
        n, err := con.Read(buf)
        if err != nil {
            fmt.Println("clien exit,err:", err)
            return
        } else {
            fmt.Printf("RECV len: %03d data: %s\n", n, HexToHexStr(buf[:n]))
            sendData := []byte("login success!")
            if len(sendData) != 0 {
                fmt.Printf("SEND: len: %03d data: %s\n", len(sendData), HexToHexStr(sendData))
                con.Write(sendData)
            }
        }
    }
}

type server int

func (h *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    IP4, IP6 := GetLocalIP("wlan0")
    res := fmt.Sprintf("[IPv4]\nIP:\t%s\nPort:\t7274\n\n[IPv6]\nIP:\t%s\nPort:\t7274\n", IP4, IP6)
    w.Write([]byte(res))
}

func GetLocalIP(InterfaceName string) (string, string) {
    var ip4 string
    var ip6 string
    netInterfaces, err := net.Interfaces()
    if err != nil {
        fmt.Println("net.Interfaces error:", err.Error())
        return "", ""
    }
    for i := 0; i < len(netInterfaces); i++ {
        if InterfaceName != netInterfaces[i].Name {
            continue
        }
        if (netInterfaces[i].Flags & net.FlagUp) != 0 {
            addr, _ := netInterfaces[i].Addrs()
            for _, address := range addr {
                if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
                    if strings.Contains(ipNet.IP.String(), ":") {
                        //获取IPv6
                        if ipNet.IP.To16() != nil && ipNet.IP.String()[:3] == "240" {
                            fmt.Println("IPv4:", netInterfaces[i].Name, ipNet.IP.String())
                            ip6 = ipNet.IP.String()
                        }
                    } else {
                        //获取IPv4
                        if ipNet.IP.To4() != nil {
                            fmt.Println("IPv6:", netInterfaces[i].Name, ipNet.IP.String())
                            ip4 = ipNet.IP.String()
                        }
                    }
                }
            }
        }
    }
    return ip4, ip6
}
func main() {
    args := os.Args
    daemon := false
    for k, v := range args {
        if v == "-d" {
            daemon = true
            args[k] = ""
        } else if v == "restart" {
            daemon = true
            args[k] = ""
        }
    }
    if daemon {
        Daemonize(args...)
        return
    }
    fmt.Println("start listen at TCP  0.0.0.0:7274")
    lister, err := net.Listen("tcp", "0.0.0.0:7274")
    if err != nil {
        fmt.Println("listen err: ", err)
        return
    }
    defer lister.Close()
    go func() {
        for {
            fmt.Println("wait for connect...")
            conn, err := lister.Accept()
            if err != nil {
                fmt.Printf("Accept() err: %s\n", err.Error())
            } else {
                fmt.Printf("Accept() suc conn=%v,IP=%v\n", conn, conn.RemoteAddr().String())
            }
            go process(conn)
        }
    }()
    GetLocalIP("pppoe-wan")
    GetLocalIP("br-lan")
    var s server
    http.ListenAndServe("0.0.0.0:7275", &s)
}

 您阅读这篇文章共花了: 
捐赠支持:如果觉得这篇文章对您有帮助,请“扫一扫”鼓励作者!
二维码加载中...
本文作者:皮皮华      文章标题: 搭建IPv6签到服务器
本文地址:http://huazai.eleuu.com/?post=60
版权声明:若无注明,本文皆为“皮皮华博客”原创,转载请保留文章出处。

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗

评论信息框


既然没有吐槽,那就赶紧抢沙发吧!