From d3f16eb2ade1b37b1c2c92383706c84dab6c40db Mon Sep 17 00:00:00 2001 From: bjdgyc Date: Mon, 25 Dec 2023 14:31:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20modprobe=20=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_docker.sh | 5 ++- doc/README.md | 60 +++++++++++++++++----------------- docker/Dockerfile | 34 +++++++++++-------- server/base/app_ver.go | 2 +- server/base/mod.go | 65 +++++++++++++++++++++++++++++++++++++ server/base/start.go | 1 + server/handler/link_tun.go | 13 +++----- server/handler/link_vtap.go | 5 +-- 8 files changed, 130 insertions(+), 55 deletions(-) create mode 100644 server/base/mod.go diff --git a/build_docker.sh b/build_docker.sh index ec94d0f..ef8afac 100644 --- a/build_docker.sh +++ b/build_docker.sh @@ -6,10 +6,13 @@ echo $ver #docker login -u bjdgyc #docker build -t bjdgyc/anylink . -docker build -t bjdgyc/anylink -f docker/Dockerfile . + +docker build -t bjdgyc/anylink --build-arg GitCommitId=$(git rev-parse HEAD) -f docker/Dockerfile . docker tag bjdgyc/anylink:latest bjdgyc/anylink:$ver +exit 0 + docker push bjdgyc/anylink:$ver docker push bjdgyc/anylink:latest diff --git a/doc/README.md b/doc/README.md index a56d567..6953384 100644 --- a/doc/README.md +++ b/doc/README.md @@ -9,37 +9,39 @@ ## Donator > 感谢以下同学的打赏,AnyLink 有你更美好! -> +> > 需要展示主页的同学,可以在QQ群 直接联系我添加。 -| 昵称 | 主页 | -|---------| ---------------------------- | -| 代码 oo8 | | -| 甘磊 | https://github.com/ganlei333 | -| Oo@ | https://github.com/chooop | -| 虚极静笃 | | -| 请喝可乐 | | -| 加油加油 | | -| 李建 | | -| lanbin | | -| 乐在东途 | | -| 孤鸿 | | -| 刘国华 | | -| 改名好无聊 | | -| 全能互联网专家 | | -| JCM | | -| Eh... | | -| 沉 | | -| 刘国华 | | -| 忧郁的豚骨拉面 | | -| 张小旋当爹地 | | -| 对方正在输入 | | -| Ronny | | -| 奔跑的少年 | | -| ZBW | | -| 悲鸣 | | -| 谢谢 | | -| 云思科技 | | +| 昵称 | 主页 / 留言 | +|-----------|------------------------------| +| 代码 oo8 | | +| 甘磊 | https://github.com/ganlei333 | +| Oo@ | https://github.com/chooop | +| 虚极静笃 | | +| 请喝可乐 | | +| 加油加油 | | +| 李建 | | +| lanbin | | +| 乐在东途 | | +| 孤鸿 | | +| 刘国华 | | +| 改名好无聊 | | +| 全能互联网专家 | | +| JCM | | +| Eh... | | +| 沉 | | +| 刘国华 | | +| 忧郁的豚骨拉面 | | +| 张小旋当爹地 | | +| 对方正在输入 | | +| Ronny | | +| 奔跑的少年 | | +| ZBW | | +| 悲鸣 | | +| 谢谢 | | +| 云思科技 | | +| 哆啦A伟(张佳伟) | | +| nobody | 开源不易,感谢分享 | diff --git a/docker/Dockerfile b/docker/Dockerfile index 9abbcac..e703090 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,42 +1,48 @@ +#node:16-bullseye +#golang:1.20-bullseye +#debian:bullseye-slim + # web -FROM node:16.17.1-alpine3.15 as builder_node +FROM node:16-alpine3.18 as builder_node WORKDIR /web COPY ./web /web RUN yarn install \ && yarn run build \ && ls /web/ui + # server -FROM golang:1.19-alpine as builder_golang +FROM golang:1.20-alpine3.18 as builder_golang #TODO 本地打包时使用镜像 -ENV GOPROXY=https://goproxy.io +ENV GOPROXY=https://goproxy.cn ENV GOOS=linux +ARG GitCommitId="gitCommitId" + WORKDIR /anylink -COPY . /anylink -COPY --from=builder_node /web/ui /anylink/server/ui +COPY server /anylink +COPY --from=builder_node /web/ui /anylink/ui #TODO 本地打包时使用镜像 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories -RUN apk add --no-cache git gcc musl-dev -RUN cd /anylink/server;go mod tidy;go build -o anylink -ldflags "-X main.CommitId=$(git rev-parse HEAD)" \ - && /anylink/server/anylink tool -v +RUN apk add gcc musl-dev +RUN cd /anylink;go mod tidy;go build -o anylink -ldflags "-s -w -X main.CommitId=${GitCommitId}" \ + && /anylink/anylink tool -v + # anylink -FROM alpine +FROM alpine:3.18 LABEL maintainer="github.com/bjdgyc" -#ENV IPV4_CIDR="192.168.10.0/24" +ENV ANYLINK_IN_CONTAINER=true WORKDIR /app -COPY --from=builder_golang /anylink/server/anylink /app/ +COPY --from=builder_golang /anylink/anylink /app/ COPY docker/docker_entrypoint.sh /app/ - -#COPY ./server/bridge-init.sh /app/ +COPY ./server/bridge-init.sh /app/ COPY ./server/conf /app/conf COPY ./LICENSE /app/LICENSE COPY ./home /app/home - #TODO 本地打包时使用镜像 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories RUN apk add --no-cache bash iptables \ diff --git a/server/base/app_ver.go b/server/base/app_ver.go index e3556a6..fa9e89f 100644 --- a/server/base/app_ver.go +++ b/server/base/app_ver.go @@ -3,5 +3,5 @@ package base const ( APP_NAME = "AnyLink" // app版本号 - APP_VER = "0.9.4" + APP_VER = "0.10.1" ) diff --git a/server/base/mod.go b/server/base/mod.go new file mode 100644 index 0000000..0f85830 --- /dev/null +++ b/server/base/mod.go @@ -0,0 +1,65 @@ +package base + +import ( + "bufio" + "fmt" + "log" + "os" + "os/exec" + "strings" +) + +const ( + procModulesPath = "/proc/modules" + inContainerKey = "ANYLINK_IN_CONTAINER" +) + +var ( + inContainer = false + modMap = map[string]struct{}{} +) + +func initMod() { + container := os.Getenv(inContainerKey) + if container == "true" { + inContainer = true + } + log.Println("inContainer", inContainer) + + file, err := os.Open(procModulesPath) + if err != nil { + err = fmt.Errorf("[ERROR] Problem with open file: %s", err) + panic(err) + } + defer file.Close() + scanner := bufio.NewScanner(file) + scanner.Split(bufio.ScanLines) + for scanner.Scan() { + splited := strings.Split(scanner.Text(), " ") + if len(splited[0]) > 0 { + modMap[splited[0]] = struct{}{} + } + } +} + +func CheckModOrLoad(mod string) { + log.Println("CheckModOrLoad", mod) + + if _, ok := modMap[mod]; ok { + return + } + + if inContainer { + err := fmt.Errorf("Linux modules %s is not loaded, please run `modprobe %s`", mod, mod) + panic(err) + } + + cmdstr := fmt.Sprintln("modprobe", mod) + + cmd := exec.Command("sh", "-c", cmdstr) + b, err := cmd.CombinedOutput() + if err != nil { + log.Println(string(b)) + panic(err) + } +} diff --git a/server/base/start.go b/server/base/start.go index a2354c6..c25d202 100644 --- a/server/base/start.go +++ b/server/base/start.go @@ -4,6 +4,7 @@ func Start() { execute() initCfg() initLog() + initMod() } func Test() { diff --git a/server/handler/link_tun.go b/server/handler/link_tun.go index d01b5f5..5ba65f2 100644 --- a/server/handler/link_tun.go +++ b/server/handler/link_tun.go @@ -22,9 +22,10 @@ func checkTun() { defer ifce.Close() // 测试ip命令 - cmdstr0 := fmt.Sprintln("modprobe -i tun") + base.CheckModOrLoad("tun") + cmdstr1 := fmt.Sprintf("ip link set dev %s up mtu %s multicast off", ifce.Name(), "1399") - err = execCmd([]string{cmdstr0, cmdstr1}) + err = execCmd([]string{cmdstr1}) if err != nil { base.Fatal("testTun err: ", err) } @@ -41,12 +42,8 @@ func checkTun() { } // 修复 rockyos nat 不生效 - cmdstr0 := fmt.Sprintln("modprobe -i iptable_filter") - cmdstr1 := fmt.Sprintf("modprobe -i iptable_nat") - err = execCmd([]string{cmdstr0, cmdstr1}) - if err != nil { - base.Fatal("testTun err: ", err) - } + base.CheckModOrLoad("iptable_filter") + base.CheckModOrLoad("iptable_nat") natRule := []string{"-s", base.Cfg.Ipv4CIDR, "-o", base.Cfg.Ipv4Master, "-j", "MASQUERADE"} forwardRule := []string{"-j", "ACCEPT"} diff --git a/server/handler/link_vtap.go b/server/handler/link_vtap.go index 9536fca..fa2c5b0 100644 --- a/server/handler/link_vtap.go +++ b/server/handler/link_vtap.go @@ -33,13 +33,14 @@ func checkMacvtap() { ifName := "anylinkMacvtap" // 加载 macvtap - cmdstr0 := fmt.Sprintln("modprobe -i macvtap") + base.CheckModOrLoad("macvtap") + // 开启主网卡混杂模式 cmdstr1 := fmt.Sprintf("ip link set dev %s promisc on", base.Cfg.Ipv4Master) // 测试 macvtap 功能 cmdstr2 := fmt.Sprintf("ip link add link %s name %s type macvtap mode bridge", base.Cfg.Ipv4Master, ifName) cmdstr3 := fmt.Sprintf("ip link del %s", ifName) - err := execCmd([]string{cmdstr0, cmdstr1, cmdstr2, cmdstr3}) + err := execCmd([]string{cmdstr1, cmdstr2, cmdstr3}) if err != nil { base.Fatal(err) }