在docker里面运行openfortivpn


问题

公司使用fortinet的vpn,不想所有电脑都安装,并且不想每次都要输入密码,最重要的一点是不想把电脑上面的所有流量都导到公司去,所以想到了在docker里面运行openfortivpn。

解决方案

目前有开源的openfortivpn, 并且家里面有r5c的arm机器,因为vpn会route所有流量,所以需要在docker里面运行,这样就不会影响到其他的流量。然后我们需要把一个接收vpn流量的口,目前是直接使用clash的socks5代理,其它机器想用的话,可以直接使用这个socks5代理,而且可以在家里面的旁路由的clash里面配置规则,只有公司的流量才走这个socks5代理。使用clash的socks5代理的好处是可以暴露出dns, 有些公司的域名只有内部的dns才能解析,所以可以把内部域名的dns指向这个clash的dns端口就行。

网络拓扑图

配置

  1. Dockerfile

    FROM alpine:3.11
    ARG OPENFORTIVPN_VERSION=v1.17.1
    
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories &&\
      apk add --no-cache autoconf automake build-base ca-certificates curl git openssl-dev ppp && \
      update-ca-certificates && \
      # build openfortivpn
      mkdir -p /usr/src/openfortivpn && \
      curl -sL https://github.com/adrienverge/openfortivpn/archive/${OPENFORTIVPN_VERSION}.tar.gz \
        | tar xz -C /usr/src/openfortivpn --strip-components=1 && \
      cd /usr/src/openfortivpn && \
      ./autogen.sh && \
      ./configure --prefix=/usr --sysconfdir=/etc && \
      make -j$(nproc) && \
      make install
    
    RUN apk add --no-cache ca-certificates openssl ppp oath-toolkit-oathtool && echo lcp-echo-interval 60 >> /etc/ppp/options
    
    COPY vpn.conf /etc/openfortivpn/config
    
    COPY config.yaml /root/.config/clash/
    COPY Country.mmdb /root/.config/clash/
    COPY clash /usr/bin/
    RUN chmod a+x /usr/bin/clash
    
    COPY entrypoint.sh /usr/local/bin/
    RUN chmod a+x /usr/local/bin/entrypoint.sh
    
    ENTRYPOINT ["entrypoint.sh"]
  2. docker-compose.yml

    version: '3'
    services:
      vpn:
        build: ./
        image: fortivpn-socks5
        # restart: always
        restart: on-failure:2
        container_name: fortivpn
        #ports:
        #  - 7000:7000
        #  - 7000:7000/udp
        volumes:
          - ./config.yaml:/root/.config/clash/config.yaml
          - ./Country.mmdb:/root/.config/clash/Country.mmdb
          - ./vpn.conf:/etc/openfortivpn/config
        devices:
          - /dev/ppp:/dev/ppp
        cap_add:
          - NET_ADMIN
        networks:
          mynet:
            ipv4_address: "192.168.50.123"
    
    networks:
      default:
        external: true
        name: mynet
      mynet:
        external: true
  3. entrypoint.sh

    totp的key需要从公司的okta或者其它的地方获取,然后放到这个脚本里面。比如okta,可以在设计二次认证的google authenticator的时候,不扫描二维码,而是直接复制key。

    #!/bin/sh
    
    echo "clash start at :7891"
    /usr/bin/clash &
    
    sleep 5
    
    TOTP_KEY='xxxxx'
    a=`oathtool --totp -b $TOTP_KEY`
    /usr/bin/openfortivpn -c /etc/openfortivpn/config  --otp=$a
  4. vpn.conf

    host = vpn.company.com
    port = 443
    username = username
    password = password
    trusted-cert = 1bab7e42984704be042da7668a58631f6cd82bc2bc87029412bfd2acd7ae4307
    half-internet-routes = 1
  5. config.yml

socks-port: 7000
allow-lan: true
log-level: warning

dns:
  enable: true
  listen: 0.0.0.0:53
  - "公司dns"

profile:
 store-fakeip: true

文章作者: Payne Fu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Payne Fu !
评论