使用 VPN 打通内网

作者: anyesu | 来源:发表于2019-02-12 22:23 被阅读151次

    前言


    上一篇文章中已经介绍了使用 SSH 隧道 的方式来打通内网环境,好处是极小依赖 ( 只要支持 ssh 即可 ) , 不过使用下来也有几点问题比较明显:

    • 无密码安全性很差,IP 变动或者换地方了设置防火墙白名单也比较麻烦

    • 浏览器可以通过设置全局的HTTP代理来访问,但在其他软件中就需要单独配置比较麻烦,比如我的 SSH 终端工具要连接几十台服务器,每台服务器的配置都要单独修改想想就头大

    • 只支持 TCP 及在它之上的协议,不支持 UDP

    使用 VPN 就可以很好的解决上面的几个问题

    方案


    1. 在内网搭建 VPN 服务器
    2. VPN服务 暴露到公网中
    3. 通过公网连接到 VPN 网络,通过 VPN 网络访问内网资源

    搭建 VPN 服务器


    • 在当前目录下新建 VPN 配置文件 vpn.env 用于管理 VPN 的帐号密码
      # 预共享密钥
      VPN_IPSEC_PSK='vpn'
      # 帐号
      VPN_USER='vpn'
      # 密码
      VPN_PASSWORD='vpn'
      
    • 为了方便,采用 docker 的方式来搭建
      docker run --name vpn \
      -d --privileged --restart=always \
      --env-file `pwd`/vpn.env \
      -p 500:500/udp -p 4500:4500/udp \
      -v /lib/modules:/lib/modules:ro hwdsl2/ipsec-vpn-server
      

    先测试下内网下是否能够连接 VPN ( 选择 使用预共享密钥的L2TP/IPsec )

    暴露VPN服务到公网


    由于 VPN 服务器搭建在内网环境,外部无法直接访问,所以按上一篇文章中的方式借助一台公网的服务器做跳板机VPN 服务的端口暴露在公网中。这里就遇到一个问题:VPN 服务的端口是 UDP 协议的,而 SSH 隧道是不支持 UDP 的,有点小尴尬啊。不过好在可以通过 TCP/UDP 互相转换的方式来"曲线救国",具体原理另外开文讲解,这里就只给最终的操作:

    • VPN 主机上执行

      # 将本机1337端口(TCP)接收到的数据转发到本机的500端口(UDP)
      docker run \
      --name vpn500 -p 1337:80 \
      -d --restart=always \
      alpine/socat tcp-listen:80,fork,reuseaddr udp-connect:172.17.0.1:500
      
      # 将本机1338端口(TCP)接收到的数据转发到本机的4500端口(UDP)
      docker run \
      --name vpn4500 -p 1338:80 \
      -d --restart=always \
      alpine/socat tcp-listen:80,fork,reuseaddr udp-connect:172.17.0.1:4500
      
      # 将本机1337端口通过ssh隧道暴露到跳板机的1337端口上,123.123.123.123改为跳板机的公网ip
      ssh -p 22 -Nf -R 0.0.0.0:1337:127.0.0.1:1337 root@123.123.123.123
      
      # 将本机1338端口通过ssh隧道暴露到跳板机的1338端口上
      ssh -p 22 -Nf -R 0.0.0.0:1338:127.0.0.1:1338 root@123.123.123.123
      
    • 跳板机上执行

      # 将本机500端口(UDP)接收到的数据转发到本机的1337端口(TCP)
      docker run --name vpn500 -p 500:80/udp \
      -d --restart=always \
      alpine/socat udp-listen:80,fork,reuseaddr tcp-connect:172.17.0.1:1337
      
      # 将本机4500端口(UDP)接收到的数据转发到本机的1338端口(TCP)
      docker run --name vpn4500 -p 4500:80/udp \
      -d --restart=always \
      alpine/socat udp-listen:80,fork,reuseaddr tcp-connect:172.17.0.1:1338
      

    测试下通过跳板机的公网 IP 是否能够连接 VPN ( 选择 使用预共享密钥的L2TP/IPsec )

    优化


    通过上面的步骤已经初步实现了本文的目的,但是由于使用了蛋疼的 TCP/UDP 转换的方式,性能非常差劲,网速最快也只有 20 kb/s 左右,远程连个服务器什么的还好说,开网页就算了吧。其实,除了这种蹩脚的转换方式,还可以用 frp(v0.24.1) 做内网穿透:

    • VPN 主机上执行

      # 写入frp客户端配置
      cat > frpc.ini <<EOF
      [common]
      server_addr = 119.27.177.81
      server_port = 7000
      # 与服务端的token一致才能认证通过
      token=123456
      
      [range:vpn]
      type = udp
      local_ip = 172.17.0.1
      local_port = 500,4500
      remote_port = 500,4500
      EOF
      
      docker run --name frpc \
      -d --restart=always \
      -v `pwd`/frpc.ini:/etc/frpc.ini \
      leonismoe/frpc
      
    • 跳板机上执行

      # 写入frp服务端配置
      cat > frps.ini <<EOF
      [common]
      server_port = 7000
      token=123456
      
      dashboard_port = 7500
      # dashboard 用户名密码,默认都为 admin
      dashboard_user = admin
      dashboard_pwd = admin
      EOF
      
      # 7000是frp的服务端口;400/4500是VPN的端口;7500是frp的web管理界面端口,可有可无;
      docker run --name frps \
      -d --restart=always \
      -p 7000:7000 -p 7500:7500 -p 500:500/udp -p 4500:4500/udp \
      -v `pwd`/frps.ini:/etc/frps.ini \
      leonismoe/frps
      

    连接 VPN 后,速度上有了明显的提升但还是很慢,不过上传能跑满跳板机的带宽,具体原因还有待研究。

    另外,frp 还支持点对点内网穿透,有空也可以试下。

    使用 SoftEther VPN


    出现上面的问题,主要还是因为搭建 SSH 隧道带来的"惯性思维",为什么非得远程转发 UDP 端口呢?搜寻了一圈就发现了非常强大的 SoftEther VPN ,它就提供 TCP 协议的连接方式,远程转发它的 TCP 端口就行了。

    1. VPN 主机上先关闭之前搭建的 VPN 服务

      docker rm -f vpn
      
    2. VPN 主机上搭建 SoftEther

      docker run --name=vpn2 \
      -d --privileged --restart=always --cap-add NET_ADMIN \
      -p 500:500/udp -p 4500:4500/udp -p 1701:1701/tcp \
      -p 1194:1194/udp \
      -p 5555:5555/tcp \
      -e USERS=vpn:vpn -e SPW=vpn123456 -e PSK=vpn \
      siomiz/softethervpn
      # USERS格式:username:password;user2:pass2;user3:pass3
      # PSK是预共享密钥,SPW是管理密钥(用于登录 SoftEther Server 管理器)
      
      # 将 VPN 主机的服务端口暴露到跳板机上
      ssh -p 22 -Nf -R 0.0.0.0:5555:127.0.0.1:5555 root@123.123.123.123
      
    3. 下载 SoftEther 的客户端,通过客户端连接 VPN 即可,此时的网速取决于跳板机公网带宽

    当然,也可以配合上面的内网穿透步骤使用系统自带的 VPN 客户端直连。

    所以,最终方案就是:SoftEther VPN + frp NAT

    转载请注明出处:https://www.jianshu.com/p/4801adfcd07e

    相关文章

      网友评论

        本文标题:使用 VPN 打通内网

        本文链接:https://www.haomeiwen.com/subject/qryleqtx.html