Centos8安装配置openvpn实现服务器代理上网,Ubuntu使用docker安装配置

一、服务器(因为ubuntu没有虚拟网卡所以选择centos)

1.安装openvpn(服务器端)、easy-rsa(证书生成管理)、iptables-service(流量转发,服务器用作代理需要)

  1. dnf -y install openvpn easy-rsa iptables-service

第一步:生成服务器端证书

查看已安装的easy-rsa目录

  1. rpm -ql easy-rsa

复制一份easy-rsa到/etc/openvpn目录下,也可以直接在原目录修改生成证书

  1. cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa

复制easy-rsa配置文件到/etc/openvpn/easy-rsa/3.0.8目录下,并重命名为vars

  1. cp -r /usr/share/doc/easy-rsa/vars.example /etc/openvpn/easy-rsa/3.0.8/vars

查看/etc/openvpn目录结构

  1. tree /etc/openvpn

修改证书配置文件vars,其他的默认就好,主要是修改个人信息,也可以不改

  1. vim /etc/openvpn/easy-rsa/3.0.8/vars
  2. set_var EASYRSA_REQ_COUNTRY "CN"
  3. set_var EASYRSA_REQ_PROVINCE "SICHUAN"
  4. set_var EASYRSA_REQ_CITY "CHENGDU"
  5. set_var EASYRSA_REQ_ORG "geren"
  6. set_var EASYRSA_REQ_EMAIL "407906638@qq.com"
  7. set_var EASYRSA_REQ_OU "tpc"

初始化,如果以前的证书不要了,要从头开始创建证书就要从这一步开始

  1. cd /etc/openvpn/easy-rsa/3.0.8
  2. /usr/share/easy-rsa/3/easyrsa init-pki

创建根证书,会提示设置密码,此处我用nopass参数选择不要密码,如果有密码服务器每次启动都要求输入密码,还需要自己写脚本启动(ps:脚本我不会写)

  1. /usr/share/easy-rsa/3/easyrsa build-ca nopass

创建server端证书和私钥文件

  1. /usr/share/easy-rsa/3/easyrsa gen-req server nopass

给server端证书签名,提示confirm request details:时,输入yes

  1. /usr/share/easy-rsa/3/easyrsa sign server server

创建dh文件,秘钥交换算法

  1. /usr/share/easy-rsa/3/easyrsa gen-dh

创建tls认证秘钥

  1. openvpn --genkey tls-auth ta.key

查看当前生成的文件目录结构

  1. tree pki

拷贝证书文件到openvpn目录下

  1. mkdir /etc/openvpn/certs
  2. cp ./pki/ca.crt /etc/openvpn/certs/
  3. cp ./pki/dh.pem /etc/openvpn/certs/
  4. cp ./pki/issued/server.crt /etc/openvpn/certs
  5. cp ./pki/private/server.key /etc/openvpn/certs
  6. cp ta.key /etc/openvpn/certs

第二步:创建server配置文件

拷贝配置文件模板

  1. cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/

修改配置文件

  1. cd /etc/openvpn
  2. vim server.conf
  1. #监听本机ip地址
  2. local 0.0.0.0(这里填本机地址)
  3. #监控本机端口号
  4. port 1194
  5. #指定采用的传输协议,可以选择tcp或udp
  6. proto tcp
  7. #指定创建的通信隧道类型,可选tun或tap,window服务器必须是tap
  8. dev tun
  9. #指定CA证书的文件路径
  10. ca /etc/openvpn/certs/ca.crt
  11. #指定服务器端的证书文件路径
  12. cert /etc/openvpn/certs/server.crt
  13. #指定服务器端的私钥文件路径
  14. key /etc/openvpn/certs/server.key
  15. #指定迪菲赫尔曼参数的文件路径
  16. dh /etc/openvpn/certs/dh.pem
  17. #指定虚拟局域网占用的IP地址段和子网掩码,不能和服务器eth0同网段
  18. server 10.8.0.0 255.255.255.0
  19. #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次 分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
  20. ifconfig-pool-persist ipp.txt
  21. #自动推送客户端上的网关及DHCP,此项开启了流量转发,有这项才能使用服务器代理上 网
  22. push "redirect-gateway def1 bypass-dhcp"
  23. #OpenVPN的DHCP功能为客户端提供指定的 DNS、WINS 等
  24. push "dhcp-option DNS 114.114.114.114"
  25. #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
  26. client-to-client
  27. 允许同一个客户端证书多次登录,看需配置
  28. #duplicate-cn
  29. #每10秒ping一次,连接超时时间设为120秒
  30. keepalive 10 120
  31. #开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
  32. tls-auth /etc/openvpn/certs/ta.key 0
  33. #加密认证算法,2.4之前是AES-256-CBC
  34. cipher AES-256-GCM
  35. #使用lzo压缩的通讯,服务端和客户端都必须配置
  36. comp-lzo
  37. #最大连接用户
  38. max-clients 100
  39. #定义运行的用户和组,openvpn用户是安装的时候系统自动创建的
  40. user openvpn
  41. group openvpn
  42. #重启时仍保留一些状态
  43. persist-key
  44. persist-tun
  45. #输出短日志,每分钟刷新一次,以显示当前的客户端
  46. status /var/log/openvpn-status.log
  47. #日志保存路径
  48. log /etc/openvpn/log/openvpn.log
  49. log-append /etc/openvpn/log/openvpn.log
  50. #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
  51. verb 3
  52. #相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
  53. mute 20
  54. #下面这项只能udp连接开启
  55. #explicit-exit-notify 1
  56. #设置tls最低版本为1.3,连接的客户端如果是2.4以下则配置为1.0
  57. tls-version-min 1.3

第三步:配置系统转发,需要代理上网的必须配置

允许转发

  1. echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

配置立即生效

  1. sysctl -p

关闭firewall

  1. systemctl stop firewalld
  2. systemctl disable firewalld

启动iptables

  1. systemctl enable iptables
  2. systemctl start iptables

配置iptables转发流量,代理主要以iptables转发实现

  1. iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

允许tcp/udp 1194通过防火墙

  1. iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
  2. iptables -I INPUT -p udp --dport 1194 -j ACCEPT

保存规则并重启

  1. service iptables save
  2. systemctl restart iptables

第四步:创建启动的服务脚本文件

因centos8没有unit文件还需要自己新建一个,写入以下内容

  1. vim /lib/systemd/system/openvpn@.service
  2. [Unit]
  3. Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
  4. After=network.target
  5. [Service]
  6. Type=notify
  7. PrivateTmp=true
  8. ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf
  9. [Install]
  10. WantedBy=multi-user.target

设置openvpn开机启动

  1. systemctl enable openvpn@server

启动openvpn

  1. systemctl start openvpn@server

查看端口和进程是否启动成功,

  1. netstat -lntp|grep openvpn
  2. ps -aux|grep openvpn

如果启动失败:
首先查看服务状态

  1. systemctl status openvpn@server

然后进入日志目录查看日志,将error项到网上搜索解决办法

  1. cat /etc/openvpn/log/openvpn.log

二、客户端

客户端下载地址分享:https://www.aliyundrive.com/s/qpBM79CJNKC
如果这个客户端过期了可以去github上下载源码重新编译一个
https://github.com/OpenVPN/openvpn-gui

1.服务器侧配置

进入证书管理目录

  1. cd /etc/openvpn/easy-rsa/3.0.8

生成客户端1的证书,客户端2依次类推

  1. /usr/share/easy-rsa/3/easyrsa gen-req client1 nopass

注册客户端1的证书,要输入yes

  1. /usr/share/easy-rsa/3/easyrsa sign client client1

将证书拷贝到一个目录存着

  1. cp ./pki/issued/client1.crt /etc/openvpn/client
  2. cp ./pki/private/client1.key /etc/openvpn/client

2.本地电脑侧配置

将client1.crt client1.key ta.key ca.crt四个文件下载到本地客户端目录的config目录下
配置客户端配置文件,拷贝客户端sample-config目录下的client.ovpn文件到config目录下
修改内容如下:

  1. #客户端
  2. client
  3. #隧道类型,与服务器一致
  4. dev tun
  5. #tcp还是udp,与服务器一致
  6. proto tcp
  7. #服务器ip和端口
  8. remote http://xxx.xxx.xxx.xxx 1194
  9. #自动重连
  10. resolv-retry infinite
  11. #不绑定本地特定的端口
  12. nobind
  13. #服务器重启后保持一些状态
  14. persist-key
  15. persist-tun
  16. #客户端证书目录
  17. ca ca.crt
  18. cert client.crt
  19. key client.key
  20. #不明,推测是远程证书验证之类的
  21. remote-cert-tls server
  22. #tls握手秘钥,与服务器保持一致,服务器0,客户端1
  23. tls-auth ta.key 1
  24. #加密方式
  25. cipher AES-256-GCM
  26. #开启数据压缩
  27. comp-lzo
  28. 日志级别
  29. verb 3
  30. #相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
  31. mute 20
  32. #tls最低版本,与服务器保持一致
  33. tls-version-min 1.3
  34. #不保存密码
  35. auth-nocache
  36. #使客户端中所有流量经过VPN,所有网络连接都使用vpn
  37. redirect-gateway def1

如果是云服务器,记得打开云服务器安全组里面的1194端口

我的实践

OpenVPN version : 2.4.12

服务端配置文件

  1. # Secure OpenVPN Server Config
  2. # Basic Connection Config
  3. dev tun
  4. proto udp
  5. port 5000
  6. keepalive 10 120
  7. max-clients 5
  8. # Certs
  9. ca /path/to/ca.crt
  10. cert /path/to/server.crt
  11. key /path/to/server.key
  12. dh /path/to/dh.pem
  13. #tls-auth ../ta.key 0
  14. # Ciphers and Hardening
  15. reneg-sec 0
  16. remote-cert-tls client
  17. #crl-verify ../crl.pem
  18. tls-version-min 1.2
  19. cipher AES-256-CBC
  20. auth SHA512
  21. tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
  22. # Drop Privs
  23. user nobody
  24. group nobody
  25. # IP pool
  26. server 172.31.100.0 255.255.255.0
  27. topology subnet
  28. ifconfig-pool-persist ../ipp.txt
  29. client-config-dir ../client
  30. # Misc
  31. persist-key
  32. persist-tun
  33. comp-lzo
  34. # DHCP Push options force all traffic through VPN and sets DNS servers
  35. push "redirect-gateway def1 bypass-dhcp"
  36. push "dhcp-option DNS 1.1.1.1"
  37. push "dhcp-option DNS 8.8.8.8"
  38. push "dhcp-option DNS 8.8.4.4"
  39. # Logging
  40. log-append /var/log/openvpn.log
  41. verb 3

客户端配置文件

Ubuntu
此配置是通过图形界面配置之后,系统实际的配置文件.

  1. [connection]
  2. id=thsea
  3. uuid=xxxxxxxxx-xxxx-xxxx
  4. type=vpn
  5. autoconnect=false
  6. permissions=user:<USER_NAME>:;
  7. timestamp=xxxxxxxxx
  8. [vpn]
  9. auth=SHA512
  10. ca=/path/to/ca.crt
  11. cert=/path/to/client.crt
  12. cert-pass-flags=0
  13. cipher=AES-256-CBC
  14. compress=lzo
  15. connection-type=tls
  16. key=/path/to/client.key
  17. keysize=256
  18. port=5000
  19. remote=<YOU_VPN_HOST>
  20. service-type=org.freedesktop.NetworkManager.openvpn
  21. [ipv4]
  22. dns-search=
  23. method=auto
  24. [ipv6]
  25. addr-gen-mode=stable-privacy
  26. dns-search=
  27. method=auto
  28. [proxy]

安卓设备
使用OpenVPN Profile导入下面配置文件即可

  1. [connection]
  2. id thsea
  3. type vpn
  4. autoconnect flase
  5. [vpn]
  6. auth SHA512
  7. ca /storage/emulated/0/myvpn/ca.crt
  8. cert /storage/emulated/0/myvpn/client.crt
  9. cert-pass-flags 0
  10. cipher AES-256-CBC
  11. comp-lzo
  12. connection-type tls
  13. key /storage/emulated/0/myvpn/client.key
  14. keysize 256
  15. proto udp
  16. port 5000
  17. remote <YOU_VPN_HOST>

之前踩了一个坑,在安卓的配置文件里把数据的压缩方式配置成了
compres lzo 因为借鉴了Ubuntu的 配置
结果VPN可以连接成功 ..但是无法访问网络,最后在服务端 查询日志才发现这个问题.特此记录 Openvpn的客户端配置文件中的说数据压缩 应该是comp-lzo才对