跨城区局域网的搭建(基于Docker)

概述:

管理复杂网络内的系统,有时候需要突破网络限制.有比较多的方案,比如ss5,Shadowsocks,vpn等. 这里提供一种方案是利用 docker-openvpn 实施多重复杂网络内的主机互联,实现利用nginx反向代理各类服务.

概念图:

具体流程:

  • 购买云服务器部署docker

    建议购买支持systemctl的Linux系统,比较好管理,并部署docker:

    1. 外挂存储格式化为xfs分区;
    1
    2
    
      # mkfs.xfs /dev/vdb5
      # echo "/dev/vdb5 /mnt/data xfs defaults 1 1" |tee -a /etc/fstab
    
    1. 调整docker的目录,两种方法;
    • 挂载/var/lib/docker目录:
    1
    2
    3
    4
    5
    6
    
      # systemctl stop docker
      # mkdir -p /mnt/data/docker
      # rsync -aXS /var/lib/docker/.  /mnt/data/docker/
      # echo "/mnt/data/docker /var/lib/docker none bind 0 0"|tee -a /etc/fstab
      # mount -a
      # systemctl start docker
    
    • 指定具体目录: 在/etc/systemd/system/multi-user.target.wants/docker.service里面修改如下:
    1
    
      ExecStart=/usr/bin/dockerd --storage-driver=overlay2 -g /mnt/hhd/docker
    
  • 安装docker-openvpn服务:

    docker-openvpn

    • Pick a name for the $OVPN_DATA data volume container, it will be created automatically.
    1
    
      # OVPN_DATA="ovpn-data"
    
    • Initialize the $OVPN_DATA container that will hold the configuration files and certificates
      1
      2
      3
      4
      5
      6
      
      # docker volume create --name $OVPN_DATA
      # docker run -v $OVPN_DATA:/etc/openvpn \
        --rm kylemanna/openvpn ovpn_genconfig \
        -u udp://VPN.SERVERNAME.COM
      # docker run -v $OVPN_DATA:/etc/openvpn \
        --rm -it kylemanna/openvpn ovpn_initpki
      
      如果使用tcp
      1
      2
      3
      
      # docker run -v $OVPN_DATA:/etc/openvpn \
        --rm kylemanna/openvpn ovpn_genconfig \
        -u tcp://VPN.SERVERNAME.COM:1443
      
    • Start OpenVPN server process
      1
      2
      3
      
      # docker run -v $OVPN_DATA:/etc/openvpn -d \
        -p 1194:1194/udp \
        --cap-add=NET_ADMIN kylemanna/openvpn
      
      OR
      1
      2
      3
      
      # docker run -v $OVPN_DATA:/etc/openvpn -d \
        -p 1443:1194/tcp \
        --cap-add=NET_ADMIN kylemanna/openvpn
      
      Running a Second Fallback TCP Container
      1
      2
      3
      4
      
      # docker run -v $OVPN_DATA:/etc/openvpn \
        --rm -p 1443:1194/tcp \
        --privileged kylemanna/openvpn ovpn_run \
        --proto tcp
      
    • Generate a client certificate without a passphrase . Retrieve the client configuration with embedded certificates, “CLIENTNAME"可自定义;
    1
    2
    3
    4
    
      # docker run -v $OVPN_DATA:/etc/openvpn \
        --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
      # docker run -v $OVPN_DATA:/etc/openvpn \
        --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn
    
    • 增加路由规则 在docker主机上增加一条路由规则,目的是使其他容器可以通过默认的网络来访问到openvpn客户端的节点:
    1
    
      # ip route add 192.168.255.0/24 via $DOCKER_OPENVPN_IP
    
    • 给客户端配置静态内外IP。
    1
    2
    
    # cat ccd/CLIENTNAME
    ifconfig-push 192.168.255.10 192.168.255.9
    
  • 部署前端代理

1
2
3
4
5
6
7
docker run -d \
  -v $(pwd)/Caddyfile:/etc/Caddyfile \
  -v $HOME/.caddy:/root/.caddy \
  -p 80:80 -p 443:443 \
  --name caddy \
  --link openvpn:openvpn \
  abiosoft/caddy
  • CADDY的配置参考:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  http://git.mickeybee.cn {
    redir https://git.mickeybee.cn{url}
  }
  https://git.mickeybee.cn {
    gzip
    proxy / 192.168.xxx.xx:3000
    tls [email protected] {
      max_certs 10
      key_type  p256
    }
  }
  • 部署TCP代理

    1
    2
    3
    4
    5
    6
    
    docker run -d \
      -v $(pwd)/haproxy:/usr/local/etc/haproxy:ro \
      -p xxx:xxx -p yyy:yyy \
      --name haproxy \
      --link openvpn:openvpn \
      haproxy
    
    • 映射后端端口。