搭建IPv6签到服务器
时间: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)
}
.
├── 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 //使用说明
将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 &
四、详解
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)
}
捐赠支持:如果觉得这篇文章对您有帮助,请“扫一扫”鼓励作者!
相关文章
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!