这次终于把自己给"坑"坏了,因为一次不可控制的"停电"让公司的部分老年机饱受了一次"灾难性"的洗礼。
幸运的是部分幸存下来的主机中包括我们至关重要的服务,而就是那些看似无状态的服务深深的打了自己一巴掌。首当其冲的就是那个万恶的Openvpn
服务。使用Openvpn主要是为了解决一下场景:
我们的部分非业务办公服务主要服务于内部的办公人员,由于疫情的背景下,我们需要满足远程办公的条件以及非本地的同事也是需要访问这些资源的,包括一些暴露在公网限制访问的服务等,所以通过点对点登录访问的Openvpn就是我们一直以来的选择。
灾难后的恢复永远是让人发狂,而这边大家又在不断的"吹更",实在难以淡定下来,不懂网络的我也没法直接在那些老古董身上动刀子,在一段焦虑和无奈之后还是冷静下仔细思考如何快速的恢复"战场",因为一台物理机老前辈因为掉电让磁盘歇工了,短时间内想要修复物理机恐怕已经不可能了,所以我开始这样做:
第一步 网上冲浪,查看防火墙端口绑定规则
在网上疯狂的搜索着关于CISCO ASA5515-X
的网络配置,查看防火墙中关于公网IP:x.x.x.x
与主机之间端口射映关系,因为不断的变更交接人,记录的网络配置信息和文档早已随着时间飞逝了,这时候不免想来句你妹的
...
ciscoasa# show nat
...
ciscoasa# show run object
...
通过查看一波nat
、object
和service
之后,发现了防火墙上配置的Public IP
与内部服务OpenVPN
主机之间端口的映射关系,于是赶紧找几个还有气
的主机进行业务恢复
第二步 照着葫芦画个瓢
这是一台Centos7
主机
[root@vpn ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
首先就是将其IP
地址修改为防火墙内规则制定的主机IP
[root@vpn ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens160"
UUID="aa08d0dd-5ba5-412c-84ab-716b885c4d89"
DEVICE="ens160"
ONBOOT="yes"
IPADDR="172.16.99.129"
PREFIX="24"
GATEWAY="192.168.99.254" # 修改成需要的IP地址
IPV6_PRIVACY="no"
PEERDNS="yes"
DNS1="114.114.114.114"
第三步 配置OpenVPN环境
在找对IP访问的映射关系之后,就是抓紧恢复服务,于是有了下面的安装配置段:
- 使用
easy-rsa
制作OpenVPN
所需的证书以及客户端证书
yum install openvpn
mkdir /data/tools -p
wget -P /data/tools https://github.com/OpenVPN/easy-rsa/releases/download/3.0.1/EasyRSA-3.0.1.tgz
tar zxf EasyRSA-3.0.1.tgz
cp -rf EasyRSA-3.0.1 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
./easyrsa init-pki # 初始化证书目录pki
./easyrsa build-ca nopass
# 创建根证书,提示输入Common Name,名称随意,但是不能和服务端证书或客户端证书名称相同
./easyrsa gen-dh # 生成Diffle Human参数,它能保证密钥在网络中安全传输
- 制作
CA
证书
./easyrsa init-pki # 初始化证书目录pki
- 制作服务端
OpenVPN Server
证书
./easyrsa build-server-full server nopass # server是服务端证书名称,可以用其它名称
- 制作客户端证书
./easyrsa build-client-full barry nopass # barry是客户端证书名称,可以用其它名称
- 配置LDAP认证
yum install openvpn-auth-ldap -y
[root@vpn openvpn]# ls -al /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so
-rwxr-xr-x 1 root root 133320 Sep 6 2019 /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so
- 准备LDAP认证配置文件
<LDAP>
# LDAP server URL
URL ldap://192.168.99.130
# Bind DN (If your LDAP server doesn't support anonymous binds)
BindDN cn=openvpn,dc=openldap,dc=kubemaster,dc=top
Password openvpn_Passsword
# Network timeout (in seconds)
Timeout 15
# Enable Start TLS
#TLSEnable no
# Follow LDAP Referrals (anonymously)
#FollowReferrals no
# TLS CA Certificate File
#TLSCACertFile /usr/local/etc/ssl/ca.pem
# TLS CA Certificate Directory
#TLSCACertDir /etc/ssl/certs
# Client Certificate and key
# If TLS client authentication is required
#TLSCertFile /usr/local/etc/ssl/client-cert.pem
#TLSKeyFile /usr/local/etc/ssl/client-key.pem
# Cipher Suite
# The defaults are usually fine here
# TLSCipherSuite ALL:!ADH:@STRENGTH
</LDAP>
<Authorization>
# Base DN
BaseDN "ou=People,dc=openldap,dc=kubemaster,dc=top"
# User Search Filter
SearchFilter "(&(uid=%u))"
# Require Group Membership
RequireGroup false
# Add non-group members to a PF table (disabled)
#PFTable ips_vpn_users
<Group>
BaseDN "ou=Groups,dc=example,dc=com"
SearchFilter "(|(cn=developers)(cn=artists))"
MemberAttribute uniqueMember
# Add group members to a PF table (disabled)
#PFTable ips_vpn_eng
</Group>
</Authorization>
- 配置服务端配置文件
[root@vpn openvpn]# cat server.conf |egrep -v '^$|^#|^\;'
port 11194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key # This file should be kept secret
dh /etc/openvpn/easy-rsa/pki/dh.pem
server 10.8.0.0 255.255.255.0 # 这里是openvpn server的IP地址池
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 114.114.114.114" # 下发给客户端的DNS
push "dhcp-option DNS 8.8.8.8"
client-to-client
duplicate-cn
keepalive 10 120
comp-lzo
max-clients 50
user root
group root
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 3
mute 10
client-cert-not-required
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf"
username-as-common-name
push "route 192.168.0.0 255.255.0.0"
push "route 192.168.99.0 255.255.255.0" # 下发给客户端的需要走VPN的网络流量,其它网段不走VPN,可正常上网。
- 开启路由转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
OpenVPN
防火墙的配置,这里是最重要的一环,注意不要把你的网络设备名称写错了。
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -o ens160 -j MASQUERADE # 网络设备为ens160
- 配置
OpenVPN
的启停脚本
#!/bin/bash
echo "OpenVPN ..........[STOP]"
ps -ef |grep openvpn | grep -v grep | awk '{print $2}' | xargs kill
echo "OpenVPN ..........[START]"
/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server.conf &
- 开机服务自启,将下面内容写到
/etc/rc.local
/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf > /dev/null 2>&1 &
exit 0
- 客户端的配置
# 把服务器上这三个文件拷贝下来和客户端的配置文件放在一起
/etc/openvpn/easy-rsa/pki/private/barry.key
/etc/openvpn/easy-rsa/pki/issued/barry.crt
/etc/openvpn/easy-rsa/pki/ca.crt
# 客户端配置文件内容
client
dev tun
proto tcp
resolv-retry infinite
nobind
remote PUBLIC_ADDRESS 11194 # 就是与192.168.99.129上的11194绑定的那个公网IP地址
persist-key
persist-tun
ca ca.crt
ns-cert-type server
cert barry.crt
key barry.key
verb 3 # 日志等级
comp-lzo
auth-user-pass
这样基本上就完成了OpenVPN的搭建部署,也可能是我最后一次整这玩意儿。下面是配置OpenVPN时候遇到的问题
- 明明在openvpn服务端配置了服务端同一网段的下发路由,但就是ping不通服务端同一网段的其他主机,那你需要认真检查下面的配置,包括网卡设备名
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -o ens160 -j MASQUERADE # 网络设备为ens160
sudo iptables -nL -t nat # 查看
- 为什么连上了OpenVPN我所有的流量都经过OpenVPN了,那是你启用了下面的配置,这个配置你也可以用于科学*/上网
push "redirect-gateway def1 bypass-dhcp"
- 给客户端指定固定的
VPN
地址
client-config-dir ccd # 表示指定固定IP地址的客户端配置文件存储在openvpn服务端配置文件统计目录下的ccd目录里面
route 192.168.40.128 255.255.255.248 # 指定客户端IP的地址
- 为什么在
linux/MacOS
上配置都没有问题,而在window上有问题,此时你需要注意的是,在window上安装和启动OpenVPN
都是需要管理员权限的,因为它会涉及到一些添加路由的操作,这些需要管理员权限。