heiher/natmap

添加docker支持

Opened this issue · 12 comments

Dockerfile:

FROM ubuntu:latest
ENV LANG        C.UTF-8
ENV LANGUAGE    C.UTF-8
ENV LC_ALL      C.UTF-8
RUN apt update \
    && apt upgrade -y \
    && apt install -y gcc git make curl
RUN git clone --recursive https://github.com/heiher/natmap.git \
    && cd natmap \
    && make \
    && cp ./bin/natmap /opt/natmap
ENTRYPOINT ["/opt/natmap"]

构建镜像

docker build -f ./dockerfiles/natmap/Dockerfile -t natmap .

docker-compose.yml

  natmap-wg:
    container_name: natmap-wg
    image: natmap
    command: -u -s stun.qq.com -b 30101 -t 127.0.0.1 -p 51820 -e /opt/cf_ip4p.sh -k 60
    volumes:
      - ./natmap/cf_ip4p.sh:/opt/cf_ip4p.sh
    cap_add:
      - NET_ADMIN
      - NET_RAW
    environment:
      - TZ=Asia/Shanghai
    network_mode: host
    restart: always

如果用python脚本的话,需要exec到容器内,再apt update && apt install python,其他的类似

Thanks. 不过有一些建议可以作为参考:

  1. 可以采用多阶段 (Multi-stage builds) 的方式构建,这样可以避免把整个 GCC 打进镜像里面,减少镜像体积;
  2. NATMap 目前还没有内置 iptables 转发(虽然我曾提过这个事),NET_ADMIN NET_RAW 这两个权限还暂时用不到。

@heiher 另外不知是否有构建 Docker 镜像的规划?如果有我可以帮忙提个 PR。

Thanks. 不过有一些建议可以作为参考:

1. 可以采用多阶段 (Multi-stage builds) 的方式构建,这样可以避免把整个 GCC 打进镜像里面,减少镜像体积;

2. NATMap 目前还没有内置 iptables 转发(虽然我曾提过这个事),`NET_ADMIN` `NET_RAW` 这两个权限还暂时用不到。

更新

FROM ubuntu:latest as builder
ENV LANG        C.UTF-8
ENV LANGUAGE    C.UTF-8
ENV LC_ALL      C.UTF-8
RUN apt update \
    && apt upgrade -y \
    && apt install -y gcc git make curl \
    && git clone --recursive https://github.com/heiher/natmap.git \
    && cd natmap \
    && make \
    && cp ./bin/natmap /opt/natmap
FROM ubuntu:latest
RUN apt update \
    && apt upgrade -y \
    && apt install -y curl
COPY --from=builder /opt/natmap /opt/natmap
ENTRYPOINT ["/opt/natmap"]

感觉有些常用的命令也得加上去

@heiher 另外不知是否有构建 Docker 镜像的规划?如果有我可以帮忙提个 PR。

感谢 @Lxeon @MikeWang000000

如果能提个PR就太好了~ 有没有可能直接根据arch下载发布页由github action构建出来的二进制?那样会不会依赖简单一些

不编译,直接下载最新Releases的对应架构文件到alpine镜像就行吧,做好启动脚本和对应环境变量就ok,这样体积应该非常小

放在docker中运行,会出现端口占用问题

放在docker中运行,会出现端口占用问题

具体是什么错误?可能需要给net_admin的capability才行。

放在docker中运行,会出现端口占用问题

具体是什么错误?可能需要给net_admin的capability才行。

natmap-natmap-ssh-1 | [E] hev_sock_client_tcp src/hev-sock.c:167 Address in use
natmap-natmap-ssh-1 | [E] tnsk_run src/hev-tnsk.c:107 Start TCP keep-alive service failed.
natmap-natmap-ssh-1 | [E] hev_sock_client_tcp src/hev-sock.c:167 Address in use
natmap-natmap-ssh-1 | [E] tnsk_run src/hev-tnsk.c:107 Start TCP keep-alive service failed.
natmap-natmap-ssh-1 | [E] hev_sock_client_tcp src/hev-sock.c:167 Address in use
natmap-natmap-ssh-1 | [E] tnsk_run src/hev-tnsk.c:107 Start TCP keep-alive service failed.
natmap-natmap-ssh-1 | [E] hev_sock_client_tcp src/hev-sock.c:167 Address in use
natmap-natmap-ssh-1 | [E] tnsk_run src/hev-tnsk.c:107 Start TCP keep-alive service failed.
一直报这个打印

放在docker中运行,会出现端口占用问题

具体是什么错误?可能需要给net_admin的capability才行。

在宿主机执行过一次"natmap -4 -s stunserver.stunprotocol.org -h qq.com -b 443 -e /opt/ddns.sh -k 60"命令之后,再启动docker就没问题,个人猜测是在docker内无法打开端口重用

放在docker中运行,会出现端口占用问题

具体是什么错误?可能需要给net_admin的capability才行。

在宿主机执行过一次"natmap -4 -s stunserver.stunprotocol.org -h qq.com -b 443 -e /opt/ddns.sh -k 60"命令之后,再启动docker就没问题,个人猜测是在docker内无法打开端口重用

很有可能,当docker容器没有授权net_admin或privileged模式。如果监听443端口的服务没有重启过,在宿主机上执行过一次natmap后端口重用将持续有效。

放在docker中运行,会出现端口占用问题

具体是什么错误?可能需要给net_admin的capability才行。

在宿主机执行过一次"natmap -4 -s stunserver.stunprotocol.org -h qq.com -b 443 -e /opt/ddns.sh -k 60"命令之后,再启动docker就没问题,个人猜测是在docker内无法打开端口重用

很有可能,当docker容器没有授权net_admin或privileged模式。如果监听443端口的服务没有重启过,在宿主机上执行过一次natmap后端口重用将持续有效。

授权过net_admin或privileged模式了,问题还在,应该不是权限的问题。我看了端口重用的代码,docker容器实现隔离,pid也是隔离的,应该无法通过pid控制端口重用

放在docker中运行,会出现端口占用问题

具体是什么错误?可能需要给net_admin的capability才行。

在宿主机执行过一次"natmap -4 -s stunserver.stunprotocol.org -h qq.com -b 443 -e /opt/ddns.sh -k 60"命令之后,再启动docker就没问题,个人猜测是在docker内无法打开端口重用

很有可能,当docker容器没有授权net_admin或privileged模式。如果监听443端口的服务没有重启过,在宿主机上执行过一次natmap后端口重用将持续有效。

授权过net_admin或privileged模式了,问题还在,应该不是权限的问题。我看了端口重用的代码,docker容器实现隔离,pid也是隔离的,应该无法通过pid控制端口重用

正解。忘记这个细节了