问题
公司使用fortinet的vpn,不想所有电脑都安装,并且不想每次都要输入密码,最重要的一点是不想把电脑上面的所有流量都导到公司去,所以想到了在docker里面运行openfortivpn。
解决方案
目前有开源的openfortivpn, 并且家里面有r5c的arm机器,因为vpn会route所有流量,所以需要在docker里面运行,这样就不会影响到其他的流量。然后我们需要把一个接收vpn流量的口,目前是直接使用clash的socks5代理,其它机器想用的话,可以直接使用这个socks5代理,而且可以在家里面的旁路由的clash里面配置规则,只有公司的流量才走这个socks5代理。使用clash的socks5代理的好处是可以暴露出dns, 有些公司的域名只有内部的dns才能解析,所以可以把内部域名的dns指向这个clash的dns端口就行。
网络拓扑图
配置
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"]
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
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
vpn.conf
host = vpn.company.com port = 443 username = username password = password trusted-cert = 1bab7e42984704be042da7668a58631f6cd82bc2bc87029412bfd2acd7ae4307 half-internet-routes = 1
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