加密隧道,通过开源软件拉了一条隧道,实现外部人员访问内网

使用

  • 各种文件准备
  • 服务端配置
  • 客户端配置

    各种文件准备

  1. 关闭或清空防火墙

iptables -t nat -F
iptables -t filter -F

  1. 安装openvpn服务端、客户端

yum install -y openvpn

  1. 安装证书创建软件

yum install -y easy-rsa

  1. 创建证书

    1. mkdir -p /opt/easy-rsa
    2. cp -a /usr/share/easy-rsa/3.0.8/* /opt/easy-rsa/
    3. # 复制变量
    4. cp /usr/share/doc/easy-rsa-3.0.8/vars.example /opt/easy-rsa/vars
  2. 修改变量文件 ```bash if [ -z “$EASYRSA_CALLER” ]; then echo “You appear to be sourcing an Easy-RSA ‘vars’ file.” >&2 echo “This is no longer necessary and is disallowed. See the section called” >&2 echo “‘How to use this file’ near the top comments for more details.” >&2 return 1 fi

    充当权威机构

只能在中国使用

set_var EASYRSA_DN “cn_only”

在哪请求的证书

set_var EASYRSA_REQ_COUNTRY “CN” set_var EASYRSA_REQ_PROVINCE “Beijing” set_var EASYRSA_REQ_CITY “Beijing” set_var EASYRSA_REQ_ORG “oldboylinux” set_var EASYRSA_REQ_EMAIL “oldboy@qq.com” set_var EASYRSA_NS_SUPPORT “yes”


6. 使用easyrsa命令创建pki目录
```bash
cd /opt/easy-rsa/
./easyrsa init-pki
  1. 创建ca证书

    ./easyrsa build-ca
    # 会要求你创建密码,后面创建server/client公私钥会用到这个密码  mkpasswd
    # 会要求你输入域名,输入即可,可以乱填但没必要
    # ca创建完成了,存放在/opt/easy-rsa/pki/ca.crt
    
  2. 创建server证书 和私钥 ```bash

    创建server私钥和证书请求文件 不加密私钥文件

    ./easyrsa gen-req server nopass

    一直回车即可

    req: /opt/easy-rsa/pki/reqs/server.req 拿到证书请求文件

    key: /opt/easy-rsa/pki/private/server.key 拿到私钥.

根据req文件生成server证书,要求输入密码(第七步设置的

./easyrsa sign server server

提示ok后创建完成

这server证书存放在/opt/easy-rsa/pki/issued/server.crt


9. 创建client证书 和私钥
```bash
./easyrsa gen-req client nopass
./easyrsa sign client client
  1. 创建算法文件和目录
    # 创建Diffie-Hellman文件,秘钥交换时的Diffie-Hellman算法
    ./easyrsa gen-dh
    # 仅1次即可.
    # 算法文件存放在
    # /opt/easy-rsa/pki/dh.pem
    

    服务端配置

    服务端配置文件中 各种路径默认相对于 /etc/openvpn

vim /etc/openvpn/server/server.conf

#端口
port 1194
#协议,性能好.
proto udp
#采用路由隧道模式tun 指定网卡 tun网卡
dev tun
#!!ca证书文件位置 /etc/opnevpn/server/ca.crt
ca server/ca.crt
#!!服务端公钥名称
cert server/server.crt
#!!服务端私钥名称
key server/server.key
#加密算法文件, 交换证书 校验算法
dh server/dh.pem
#!!给客户端分配地址池(ip地址范围),注意:不能和VPN服务器内网网段有相同
server 10.8.0.0 255.255.255.0
#!!客户端连接后,推送给客户端的路由规则让客户端知道如果想连接172.16.1.0/24网段 请找openvpn服务端. 
push "route 172.16.1.0 255.255.255.0"
#ifconfig-pool-persist ipp.txt         #地址池记录文件位置 未来让openvpn 客户端固定ip地址使用的.

#存活时间,10秒ping一次,120s如未收到响应则视为断线
keepalive 10 120
#最多允许100个客户端连接
max-clients 100
#openvpn状态日志位置
status /var/log/openvpn-status.log
#openvpn日志位置
log /var/log/openvpn.log
#verbose 日志输出级别   数字越大越详细 最多11(debug)
verb 3
#客户端与客户端之间支持通信
client-to-client
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys(对私钥进行缓存.
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
persist-tun
#客户端密钥(证书和私钥)是否可以重复( 属于是偷懒了
duplicate-cn



# ------------------------------选做------------------------------
#允许使用自定义脚本
script-security 3
#指定认证脚本
auth-user-pass-verify /etc/openvpn/check.sh via-env
#用户密码登陆方式验证
username-as-common-name
vim /etc/openvpn/check.sh
#!/bin/sh
#desc: openvpn uesr check scripts
#author: by oldboylinux
###########################################################
PASSFILE="/etc/openvpn/openvpnfile"
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
  if [ ! -r "${PASSFILE}" ]; then
    echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
    exit 1
  fi

  CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`

  if [ "${CORRECT_PASSWORD}" = "" ]; then
    echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
        exit 1
  fi
  if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
    echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
    exit 0
  fi
  echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1


# 设置权限
chmod 700 /etc/openvpn/check.sh
# 创建用户
vim /etc/openvpn/openvpnfile
Rdymy 1

# 修改文件权限
chmod 600 /etc/openvpn/openvpnfile
# 重启服务端
systemctl restart openvpn@server
cd /opt/easy-rsa/pki/
cp ca.crt /etc/openvpn/server/
cp dh.pem /etc/openvpn/server/
cp issued/server.crt private/server.key /etc/openvpn/server/
vim /usr/lib/systemd/system/openvpn@.service
# ExecStart=/usr/sbin/openvpn cd /etc/openvpn/ --config %i/%i.conf  #增加%i即可,%i表示 server或 client
systemctl daemon-reload

systemctl enable openvpn@server
systemctl start openvpn@server

ss -lntup |grep 1194
ps -ef |grep openvpn

ip a s tun0

pc为客户端时配置

配置中所有文件相对于当前目录

mkdir -p /etc/openvpn/网站集群名字/clinet.ovpn
vim /etc/openvpn/网站集群名字/clinet.ovpn

#指定当前VPN是客户端
client
#使用tun隧道传输协议
dev tun
#使用udp协议传输数据
proto udp
# openvpn服务器IP地址端口号!!!!!!!!!
remote 10.0.0.61 1194
#断线自动重新连接,在网络不稳定的情况下非常有用
resolv-retry infinite
#不绑定本地特定的端口号
nobind
#指定CA证书的文件路径
ca ca.crt
#指定当前客户端的证书文件路径
cert client.crt
#指定当前客户端的私钥文件路径
key client.key
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 3
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#----------------选做-------------------
auth-user-pass

# 复制文件到网站下
cp ca.crt /etc/openvpn/网站集群名字
cp issued/client.crt private/client.key /etc/openvpn/网站集群名字/
rz  /etc/openvpn/网站集群名字

再在剪切到C:\Program Files\OpenVPN\config

linux为客户端时配置

vim /etc/openvpn/client/clinet.conf
client                  #指定当前VPN是客户端
dev tun                 #使用tun隧道传输协议
proto udp               #使用udp协议传输数据
remote 10.0.0.61 1194   #openvpn服务器IP地址端口号
resolv-retry infinite   #断线自动重新连接,在网络不稳定的情况下非常有用
nobind                  #不绑定本地特定的端口号
ca ca.crt               #指定CA证书的文件路径
cert client/client.crt         #指定当前客户端的证书文件路径
key client/client.key          #指定当前客户端的私钥文件路径
verb 3                  #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细

#修改openvpn@.client
修改方法和server一样
#启动
systemctl enable openvpn@client
systemctl start openvpn@client
# 检查
ss -lntup |grep openvpn
ps -ef |grep openvpn
ip a s tun0

内部机器配置

# 被连接机器需要在rc.local写入路由表
route add -net 10.8.0.0/24 gw 172.16.1.61

# openvpn机器需要添加内核转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

连接抓包

#抓包命令行显示
tcpdump -nnn -vvv   -i eth0  -i eth1  -i tun0 icmp
#抓包保存文件
tcpdump -nnn -vvv   -i eth0  -i eth1  -i tun0 icmp -w lidao.pcap