menu XUJINKAI 的个人主页
create settings
home
主页
list
全部博文
  • Collection
  • About
  • assistant_photo
    个人项目
    tag_faces
    捐赠
    person
    关于

    利用OpenVPN + HTTP代理访问公司内网

    Tags: Linux

    领导发话,公司内部资料不能出外网,端口映射都不行,OpenVPN+代理可以接受,于是我就开始折腾了

    服务器:CentOS 8 不带桌面

    网上教程多如牛毛,以下简单记录下思路和常用到的命令。

    安装

    整体思路是连进OpenVPN的网段,再用squid弄一个http代理跳到其他服务器。
    需要注意的是firewalld防火墙和squid的代理规则。

    • 把内网vpn服务器的一个端口映射到外网

    • 安装OpenVPN和squid

    sudo yum update -y
    sudo yum install epel-release -y
    sudo yum update -y
    sudo yum install -y openvpn wget
    sudo yum -y install squid
    
    • 安装easyrsa

    这里我用的这个 https://github.com/OpenVPN/easy-rsa,有的教程是老版本的

    怎么安装easyrsa就没有命令了,我直接sftp拷进去了…

    总之,连带着openvpn的文件夹,最后的目录结构是这样的:

     - etc
        - openvpn
            - client
            - server
            - easyrsa
    
    • 客户端

    Windows的客户端推荐社区版,简单易用 https://openvpn.net/community-downloads/

    配置

    • 生成证书和其他文件

    参考easyrsa的教程,先生成ca,再签一个server证书和一个client证书。

    ./easyrsa init-pki
    ./easyrsa build-ca                              # 得到ca.crt和ca.key
    
    SERVER=server
    echo | ./easyrsa gen-req $SERVER nopass
    echo yes | ./easyrsa sign-req server $SERVER    # 得到server.crt和server.key
    
    CLIENT=client
    echo | ./easyrsa gen-req $CLIENT nopass
    echo yes | ./easyrsa sign-req client $CLIENT    # 得到client.crt和client.key
    

    另外,你还得生成dh文件和ta.key文件。

    ./easyrsa gen-dh                    # 得到dh.pem
    openvpn --genkey --secret ta.key    # 得到ta.key
    

    ca.key是要保管好的,这个丢了整个vpn就毫无安全可言了。

    服务端和客户端都要有的文件:ca.crt, ta.key
    服务端还需要的:server.crt, server.key, dh.pem, server.conf
    客户端还需要的:client.crt, client.key, client.ovpn

    把服务端需要的文件拷到/etc/openvpn/server文件夹中即可。

    • 编辑配置文件

    配置文件的样板可以从/usr/share/doc/packages/openvpn里拷,具体的配置就不说了,没几行也挺简单。

    启动OpenVPN

    systemctl enable [email protected]
    systemctl start [email protected]
    systemctl status [email protected]
    

    最后一行命令来查看openvpn服务是否启动成功

    遗憾的是,启动以后九成还是连不上,你得继续往后看。

    防火墙

    保存以下这个脚本,比如名字是 firewalledit.sh

    假设你openvpn用的端口是9527,协议是udp,那么执行

    ./firewalledit.sh add 9527/udp
    

    将对应端口放行。

    #!/bin/bash
    
    if [ $1 = "add" ]; then
        firewall-cmd --add-port=$2
    fi
    
    if [ $1 = "rm" ]; then
        firewall-cmd --remove-port=$2
    fi
    
    echo Restarting...
    
    firewall-cmd --runtime-to-permanent
    firewall-cmd --reload
    
    systemctl restart firewalld
    systemctl status firewalld
    
    firewall-cmd --list-all
    

    如果你网关的端口映射和防火墙也都配置正确,那么客户端应该就能连上服务器了。

    不过这个时候你没法访问内网的其他服务器,因为vpn给你分配的网段和内网网段不同,而且也是为了安全起见,这时候还需要http代理。

    Http代理

    编辑squid配置vi /etc/squid/squid.conf

    squid配置文件就不说了,把你需要的规则添加进去就行。

    然后启动squid代理程序。

    systemctl enable squid
    systemctl start squid
    systemctl status squid
    

    还要记得设置防火墙把squid的监听端口放行(假设监听12345端口)

    ./firewalledit.sh add 12345/tcp
    

    然后,在你的电脑上设置http代理,地址是vpn的内网地址,默认为10.8.0.1,端口是squid的端口(12345)。

    利用这个http代理,就可以访问内网其他机器的服务了。

    Socks5代理

    http代理能力还是弱了些,于是我又弄了个ssserver,本地起一个ss(主要是为了他的socks5代理),然后又用proxifier实现了全局无缝切换。

    这里就不多说了,为了这一点体验的提升请自行折腾。

    吊销证书

    吊销证书需要生成一个crl.pem吊销列表,然后配置openvpn客户端读取这个文件。

    #!/bin/bash
    
    if [ -z "$1" ]
    then
        echo "ERROR: input revoke NAME."
        exit 1
    fi
    
    cd /etc/openvpn/easyrsa
    
    echo yes | ./easyrsa revoke $1
    ./easyrsa gen-crl
    
    cp ./pki/crl.pem ../server/crl.pem
    
    systemctl restart [email protected]
    

    将这个脚本保存为revoke.sh,假设你要吊销xujinkai的证书,那么执行以下命令:

    ./revoke.sh xujinkai
    

    crl.pem会拷入/etc/openvpn/server文件夹,记得编辑server.conf添加一行crl-verify crl.pem,最后重启openvpn即可。


    Disqus评论加载中。。。