mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-11-04 11:06:22 +08:00 
			
		
		
		
	@@ -33,7 +33,7 @@ COPY docker_entrypoint.sh  /app/
 | 
			
		||||
 | 
			
		||||
COPY ./server/bridge-init.sh /app/
 | 
			
		||||
COPY ./server/conf  /app/conf
 | 
			
		||||
#COPY ./server/files  /app/conf/files
 | 
			
		||||
COPY ./LICENSE  /app/LICENSE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#TODO 本地打包时使用镜像
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								build.sh
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								build.sh
									
									
									
									
									
								
							@@ -42,6 +42,7 @@ cp -r server/bridge-init.sh $deploy
 | 
			
		||||
cp -r server/conf $deploy
 | 
			
		||||
 | 
			
		||||
cp -r systemd $deploy
 | 
			
		||||
cp -r LICENSE $deploy
 | 
			
		||||
 | 
			
		||||
tar zcvf ${deploy}.tar.gz $deploy
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,6 @@ case $var1 in
 | 
			
		||||
  iptables -t nat -A POSTROUTING -s "${IPV4_CIDR}" -o eth0+ -j MASQUERADE
 | 
			
		||||
  iptables -nL -t nat
 | 
			
		||||
 | 
			
		||||
  /app/anylink "$@"
 | 
			
		||||
  exec /app/anylink "$@"
 | 
			
		||||
  ;;
 | 
			
		||||
esac
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,11 @@ func StartAdmin() {
 | 
			
		||||
	r := mux.NewRouter()
 | 
			
		||||
	r.Use(authMiddleware)
 | 
			
		||||
 | 
			
		||||
	// 监控检测
 | 
			
		||||
	r.HandleFunc("/status.html", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		w.Write([]byte("ok"))
 | 
			
		||||
	}).Name("index")
 | 
			
		||||
 | 
			
		||||
	r.Handle("/", http.RedirectHandler("/ui/", http.StatusFound)).Name("index")
 | 
			
		||||
	r.PathPrefix("/ui/").Handler(
 | 
			
		||||
		// http.StripPrefix("/ui/", http.FileServer(http.Dir(base.Cfg.UiPath))),
 | 
			
		||||
 
 | 
			
		||||
@@ -3,5 +3,5 @@ package base
 | 
			
		||||
const (
 | 
			
		||||
	APP_NAME = "AnyLink"
 | 
			
		||||
	// 修复前端bug
 | 
			
		||||
	APP_VER = "0.7.1"
 | 
			
		||||
	APP_VER = "0.7.2"
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,7 @@ var (
 | 
			
		||||
type ServerConfig struct {
 | 
			
		||||
	// LinkAddr      string `json:"link_addr"`
 | 
			
		||||
	Conf           string `json:"conf"`
 | 
			
		||||
	Profile        string `json:"profile"`
 | 
			
		||||
	ServerAddr     string `json:"server_addr"`
 | 
			
		||||
	ServerDTLSAddr string `json:"server_dtls_addr"`
 | 
			
		||||
	ServerDTLS     bool   `json:"server_dtls"`
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ type config struct {
 | 
			
		||||
 | 
			
		||||
var configs = []config{
 | 
			
		||||
	{Typ: cfgStr, Name: "conf", Usage: "config file", ValStr: "./conf/server.toml", Short: "c"},
 | 
			
		||||
	{Typ: cfgStr, Name: "profile", Usage: "profile.xml file", ValStr: "./conf/profile.xml"},
 | 
			
		||||
	{Typ: cfgStr, Name: "server_addr", Usage: "服务监听地址", ValStr: ":443"},
 | 
			
		||||
	{Typ: cfgBool, Name: "server_dtls", Usage: "开启DTLS", ValBool: false},
 | 
			
		||||
	{Typ: cfgStr, Name: "server_dtls_addr", Usage: "DTLS监听地址", ValStr: ":4433"},
 | 
			
		||||
 
 | 
			
		||||
@@ -6,10 +6,11 @@
 | 
			
		||||
#数据文件
 | 
			
		||||
db_type = "sqlite3"
 | 
			
		||||
db_source = "./conf/anylink.db"
 | 
			
		||||
#证书文件
 | 
			
		||||
#证书文件 使用跟nginx一样的证书即可
 | 
			
		||||
cert_file = "./conf/vpn_cert.pem"
 | 
			
		||||
cert_key = "./conf/vpn_cert.key"
 | 
			
		||||
files_path = "./conf/files"
 | 
			
		||||
profile = "./conf/profile.xml"
 | 
			
		||||
#日志目录,为空写入标准输出
 | 
			
		||||
#log_path = "./log"
 | 
			
		||||
log_path = ""
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,8 @@ import (
 | 
			
		||||
	"github.com/bjdgyc/anylink/sessdata"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var profileHash = ""
 | 
			
		||||
 | 
			
		||||
func LinkAuth(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	// 判断anyconnect客户端
 | 
			
		||||
	userAgent := strings.ToLower(r.UserAgent())
 | 
			
		||||
@@ -89,7 +91,7 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	other := &dbdata.SettingOther{}
 | 
			
		||||
	_ = dbdata.SettingGet(other)
 | 
			
		||||
	rd := RequestData{SessionId: sess.Sid, SessionToken: sess.Sid + "@" + sess.Token,
 | 
			
		||||
		Banner: other.Banner}
 | 
			
		||||
		Banner: other.Banner, ProfileHash: profileHash}
 | 
			
		||||
	w.WriteHeader(http.StatusOK)
 | 
			
		||||
	tplRequest(tpl_complete, w, rd)
 | 
			
		||||
	base.Debug("login", cr.Auth.Username)
 | 
			
		||||
@@ -125,6 +127,7 @@ type RequestData struct {
 | 
			
		||||
	SessionId    string
 | 
			
		||||
	SessionToken string
 | 
			
		||||
	Banner       string
 | 
			
		||||
	ProfileHash  string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var auth_request = `<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
@@ -176,8 +179,8 @@ var auth_complete = `<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
        <vpn-profile-manifest>
 | 
			
		||||
            <vpn rev="1.0">
 | 
			
		||||
                <file type="profile" service-type="user">
 | 
			
		||||
                    <uri>/files/profile.xml</uri>
 | 
			
		||||
                    <hash type="sha1">A8B0B07FBA93D06E8501E40AB807AEE2464E73B7</hash>
 | 
			
		||||
                    <uri>/profile.xml</uri>
 | 
			
		||||
                    <hash type="sha1">{{.ProfileHash}}</hash>
 | 
			
		||||
                </file>
 | 
			
		||||
            </vpn>
 | 
			
		||||
        </vpn-profile-manifest>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"log"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/bjdgyc/anylink/base"
 | 
			
		||||
@@ -26,14 +27,14 @@ func startTls() {
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// 判断证书文件
 | 
			
		||||
	//_, err = os.Stat(certFile)
 | 
			
		||||
	//if errors.Is(err, os.ErrNotExist) {
 | 
			
		||||
	// _, err = os.Stat(certFile)
 | 
			
		||||
	// if errors.Is(err, os.ErrNotExist) {
 | 
			
		||||
	//	// 自动生成证书
 | 
			
		||||
	//	certs[0], err = selfsign.GenerateSelfSignedWithDNS("vpn.anylink")
 | 
			
		||||
	//} else {
 | 
			
		||||
	// } else {
 | 
			
		||||
	//	// 使用自定义证书
 | 
			
		||||
	//	certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
 | 
			
		||||
	//}
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
	certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -77,9 +78,10 @@ func initRoute() http.Handler {
 | 
			
		||||
	r.HandleFunc("/", LinkAuth).Methods(http.MethodPost)
 | 
			
		||||
	r.HandleFunc("/CSCOSSLC/tunnel", LinkTunnel).Methods(http.MethodConnect)
 | 
			
		||||
	r.HandleFunc("/otp_qr", LinkOtpQr).Methods(http.MethodGet)
 | 
			
		||||
	// r.HandleFunc("/profile.xml", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	// 	w.Write([]byte(auth_profile))
 | 
			
		||||
	// }).Methods(http.MethodGet)
 | 
			
		||||
	r.HandleFunc("/profile.xml", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		b, _ := os.ReadFile(base.Cfg.Profile)
 | 
			
		||||
		w.Write(b)
 | 
			
		||||
	}).Methods(http.MethodGet)
 | 
			
		||||
	r.PathPrefix("/files/").Handler(
 | 
			
		||||
		http.StripPrefix("/files/",
 | 
			
		||||
			http.FileServer(http.Dir(base.Cfg.FilesPath)),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,10 @@
 | 
			
		||||
package handler
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/sha1"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/bjdgyc/anylink/admin"
 | 
			
		||||
	"github.com/bjdgyc/anylink/base"
 | 
			
		||||
	"github.com/bjdgyc/anylink/dbdata"
 | 
			
		||||
@@ -22,6 +26,14 @@ func Start() {
 | 
			
		||||
		base.Fatal("LinkMode is err")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 计算profile.xml的hash
 | 
			
		||||
	b, err := os.ReadFile(base.Cfg.Profile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	ha := sha1.Sum(b)
 | 
			
		||||
	profileHash = hex.EncodeToString(ha[:])
 | 
			
		||||
 | 
			
		||||
	go admin.StartAdmin()
 | 
			
		||||
	go startTls()
 | 
			
		||||
	go startDtls()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user