线上生产环境,出于安全考虑,有些服务器是不需要公网IP,但是平常运维人员管理起来又不太方便。
这时候我们可以在服务器集群中挑一个拥有公网IP的服务器,搭建个Open×××就行了。
####### 坑爹的51cto,把我的文章里的空格都吃了。######
openvpn实验演示
环境“:2台CentOS6.7 X86_64
node3:机房的后端web服务器 eth0 192.168.3.13/24 Vmnet3
node4:Open××× Server
外网(eth0 192.168.2.14/24) Vmnet8(模拟公网的IP)
内网(eth1 192.168.3.14/24) Vmnet3
×××拨号获取的地址为192.168.100.X/24
运维人员的地址: 192.168.2.10(模拟公网的IP)
exportKEY_EMAIL="xxxx@xxxx.com" 邮箱
exportKEY_OU="xxxx.com" 单位
FilenameNeed byPurposeSecretca.crt服务器端、客户端都需要这个文件Root CA certificateNOca.keykey signing macheine onlyRoot CA keyYESdh{n}.pemserver onlyDH parametersNOserver.crtserver onlyServer certificateNOserver.keyserver onlyServer keyYESclient1.crtclient1 onlyClient1 certificateNOclient1.keyclient1 onlyClient1 keyYES
为了防止恶意攻击(如DDOS、UDPport flooding),我们生成一个“HMAC firewall”
openvpn --genkey --secretkeys/ta.key
这样就会在keys目录下生成一个2048bits 的 Open××× static key
内容小结:
var 存放用户的变量信息
clean-all 清理keys目录下全部文件
build-ca 脚本生成CA证书(交互)
build-key-server 脚本生成服务器端秘钥(交互)
build-key 脚本生成客户端秘钥(交互)
build-key-pass 生成带秘钥的客户端秘钥(交互)
build-dh 脚本生成DH文件(交互)
配置服务器端×××配置文件
mkdir /etc/openvpn -pv
cp/usr/share/doc/openvpn-2.3.12/sample/sample-config-files/server.conf /etc/openvpn/
cd /etc/openvpn/
cp server.conf server.conf_bak
egrep -v '^$|^#|;' server.conf_bak > server.conf # 导出默认启用的配置
vimserver.conf 我们自己修改的地方如下:
local 192.168.2.14 # 监听的公网地址,这条可以注释掉,没什么关系
port 1194 # 默认1194端口,建议修改成其他的端口
proto tcp # 建议使用TCP协议,更稳定些,客户端ovpn文件中设置要与此一致
dev tun #基于路由的隧道
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt # 之前执行./build-ca建立的根证书,建议使用全路径
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt # 服务器私有证书,建议使用全路径
key /etc/openvpn/easy-rsa/2.0/keys/server.key # 服务器私有密钥,建议使用全路径
dh /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem # 之前执行./build-dh生成的文件
server 192.168.100.0 255.255.255.0 #要分配的×××网段(不能和服务器上或者本机的IP段相同)
ifconfig-pool-persist ipp.txt # 记录客户端所获得IP
push "route 192.168.3.0 255.255.255.0" # 在客户端上推送并配置上这条路由,这是××× Server所在的内网网段,也是后端服务器所在的内网网段
client-to-client # 允许客户端之间相互通讯
duplicate-cn # 允许多个客户端使用同一个账号连接
keepalive 10 120 # 每10秒ping一次,若是120s未收到包,即认定客户端短线;
comp-lzo # 开启×××连接压缩.客户端必须做相同设置读取
max-clients 100 # 允许客户端并发连接的数量
persist-key # 当vpn超时后,重新启动vpn后,保持上一次使用的私钥,而不重新读取私钥
persist-tun # 通过keepalive 检测vpn超时后,当重新启动vpn后,保持tun或者tap设备自动连接状态
status openvpn-status.log #定义openvpn连接状态日志
log /var/log/openvpn.log # 定义日志路径
log-append /var/log/openvpn.log
verb 3 # 指定日志文件冗余
crl-verify/etc/openvpn/easy-rsa/2.0/keys/crl.pem #证书吊销列表的路径
配置防火墙
# 放行1194端口
iptables -A INPUT -p tcp --dport 1194 -j ACCEPT
# 配置iptables nat (此处不配置的话客户端连上×××后只能登陆服务端一台主机需要特别注意)
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -oeth1 -j MASQUERADE # 凡是来自×××IP网段的数据包出去的时候,都做地址转换
# 说明:eth1 为vpn server的内网网卡,192.168.100.0/24为×××服务器的分配的地址段
service iptables save
chkconfig iptables on
开启×××Server内核转发
echo '1' > /proc/sys/net/ipv4/ip_forward
sed -i "s#net.ipv4.ip_forward = 0#net.ipv4.ip_forward= 1#g" >> /etc/sysctl.conf
grep net.ipv4.ip_forward/etc/sysctl.conf 确认下是否修改成功
sysctl -p
启动×××服务
/usr/sbin/openvpn --config/etc/openvpn/server.conf & 【先尝试下能否启动,没问题的话,建议改成supervisor的方式监控它的运行】
ss -lntp|grep 1194
在openvpn server(即node4)上执行ifconfig可以看到vpnserver的网关地址
上图虽然报了error 23 ,但是我们到keys目录下,可以看到crl.pem 这个吊销的客户端列表。
这样的话,lirulei 用户就无法再连接到××× Server了。
如果用户再用被吊销的证书连接openvpn服务器的话,/var/log/openvpn.log记录里记录TLS握手失败,无法登录的条目。
3、配置linux下的openvpn客户端
有时候linux服务器也需要连接到其他的服务器(如阿里云的服务器需要连接在美团云的MySQL)
以node1(192.168.2.11) client3账户的key文件演示。
安装依赖包
yum install openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
安装openvpnserver
yum install -y openvpn # 实验时候,aliyun最新的epel源提供的是2.3.12版本
编辑client.conf客户端连接文件
cd /etc/openvpn/
client
dev tun
proto tcp
remote 192.168.2.14 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client3.crt
key client3.key
comp-lzo
verb 3
redirect-gateway def1
route-method exe
route-delay 2
拷贝秘钥文件
cd /etc/openvpn/
然后拷贝ca.crt client2.key client2.crt 到/etc/openvpn/这个目录下。
启动client端
/usr/sbin/openvpn/etc/openvpn/client.conf & 即可让vpn客户端在后台运行。
如果有需要的话,可以做成supervisor控制的方式。
测试连接
在node1上,ping 192.168.3.13 可以看到回包说明配置OK了。