目的:在公司找一台闲置主机,安装centos 7系统,配置好局域网静态ip,然后在公司路由器配置端口映射,使外网访问某些网站的时候,记录的ip地址是公司的ip。
1.centos7 安装 openvpn:
步骤 1:更新yum库
sudo yum update
步骤 2:安装EPEL仓库
sudo yum install epel-release
步骤 3:安装OpenVPN
sudo yum install openvpn easy-rsa -y
步骤 4:配置Easy-RSA 3
sudo mkdir /etc/openvpn/easy-rsa/
sudo cp -ai /usr/share/easy-rsa/3/ /etc/openvpn/easy-rsa/*
cd /etc/openvpn/easy-rsa/
sudo ./easyrsa init-pki
步骤 5:创建CA和生成服务器证书,(需要设置密码,记录好)
sudo ./easyrsa build-ca
sudo ./easyrsa build-server-full server nopass
如果在/etc/openvpn/easy-rsa/pki/目录下找不到dh.pem文件,可能是因为你还没有生成Diffie-Hellman密钥交换参数。这是设置OpenVPN服务器所需的一个步骤,用于确保安全的密钥交换过程。你可以按照以下步骤生成这个文件:
生成Diffie-Hellman密钥交换参数
首先,确保你处于Easy-RSA的根目录下。如果你按照常规指南安装和配置Easy-RSA,它通常位于/etc/openvpn/easy-rsa/。
运行以下命令生成Diffie-Hellman参数:
sudo ./easyrsa gen-dh
生成完成后,dh.pem文件将被放置在/etc/openvpn/easy-rsa/pki/目录中。
server.conf文件中–tls-auth选项用于提供额外的安全层,防止未经授权的连接尝试,但它需要指向一个存在的密钥文件。
如果还没有ta.key文件,您需要生成它。在Easy-RSA目录下使用以下命令生成ta.key:
openvpn --genkey --secret ta.key
步骤 6:生成客户端证书,对于每个客户端,重复此步骤并为每个证书指定唯一的名称:
sudo ./easyrsa build-client-full client1 nopass
sudo ./easyrsa build-client-full {英文字母客户端证书名称} nopass=不使用密码
步骤 7:配置OpenVPN服务器,复制配置文件,修改编辑/etc/openvpn/server.conf文件,确保证书和密钥的路径正确指向之前生成的文件。
sudo cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
以下是配置文件中的一些路径
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
dh /etc/openvpn/easy-rsa/pki/dh.pem
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem #这个是为了删除证书的时候,立马失效
tls-auth /etc/openvpn/ta.key 0 #0是服务端配置
log openvpn.log #这个是日志文件,记得给权限 chmod 0755 openvpn.log
duplicate-cn #这个是允许一个证书多个设备使用
步骤 8:启动OpenVPN服务并设置开机启动:
sudo systemctl start openvpn@server 《启动》
sudo systemctl enable openvpn@server 《开机启动》
sudo systemctl restart openvpn@server 《重启》
sudo systemctl status openvpn@server.service 《查看状态》
步骤9:配置防火墙,放行端口1194
sudo firewall-cmd --zone=public --add-port=1194/udp --permanent
sudo firewall-cmd --zone=public --add-port=1194/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-ports
可以让从 VPN 客户端来的流量在经过服务器转发到互联网时,使用服务器的 IP 地址
sudo firewall-cmd --zone=public --add-masquerade --permanent
如果 VPN 客户端的 IP 地址范围是 10.8.0.0/24,你还需要为这个网络添加专门的源地址转换规则:
sudo firewall-cmd --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“10.8.0.0/24” masquerade’ --permanent
sudo firewall-cmd --reload
在服务器上,IP 转发需要被启用,以允许网络流量通过服务器转发。你可以通过编辑 /etc/sysctl.conf 文件并确保以下行是开启的:
net.ipv4.ip_forward = 1
sudo sysctl -p
修改后,运行 sudo sysctl -p 来应用更改。
关闭SELinux
临时关闭SELinux:你可以通过运行setenforce 0命令将SELinux设置为宽容模式。在这种模式下,SELinux仍然会记录违规行为,但不会阻止程序的运行。要恢复SELinux的强制模式,可以运行setenforce 1命令。
永久关闭SELinux:要永久关闭SELinux,你需要编辑SELinux的配置文件。使用文本编辑器(如vi或nano)打开/etc/selinux/config文件,找到SELINUX=这一行,并将其值改为disabled。保存文件并重启系统,SELinux就会被永久关闭。
最后
重载防火墙:firewall-cmd --reload
重新启动vpn:sudo systemctl restart openvpn@server
步骤10:手动配置客户端.ovpn文件,用来连接openvpn
#指定当前VPN是客户端
client
#使用tun隧道传输协议
dev tun
#使用udp协议传输数据
proto udp
#openvpn服务器IP地址端口号,转发的填写公网IP 加对应转发端口,填写公司ip,进行路由器映射
remote 8.8.1.8 1194
#断线自动重新连接,在网络不稳定的情况下非常有用
resolv-retry infinite
#流量转发,就是使用服务器ip
redirect-gateway def1
#不绑定本地特定的端口号
nobind
#指定CA证书的文件路径 手动下载到本地:/etc/openvpn/easy-rsa/pki/ca.crt
ca ca.crt
#指定当前客户端的证书文件路径 手动下载到本地:/etc/openvpn/easy-rsa/pki/issued/client1.crt
cert client1.crt
#指定当前客户端的私钥文件路径 手动下载到本地: /etc/openvpn/easy-rsa/pki/private/client1.key
key client1.key
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 3
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
persist-tun
#使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1 手动下载到本地:/etc/openvpn/ta.key
tls-auth ta.key 1
#如果要把所有的加密信息集成在一个文件中,tls-auth 需要以下申明
#key-direction 1
以下是把所有信息集成到一个文件中
client
dev tun
proto udp
remote 8.8.1.8 1194
resolv-retry infinite
nobind
redirect-gateway def1
key-direction 1
<ca>
的点点滴滴
</ca>
<cert>
的点点滴滴
</cert>
<key>
的点点滴滴
</key>
<tls-auth>
的点点滴滴
</tls-auth>
verb 3
persist-key
persist-tun
步骤11:自动创建客户端证书脚本和删除客户端证书脚本
证书目录:/etc/openvpn/client/keys
bash /etc/openvpn/client/add_vpnuser.sh client2
bash /etc/openvpn/client/del_vpnuser.sh client2
#!/bin/bash
set -e
keys_dir=/etc/openvpn/client/keys
easyras_dir=/etc/openvpn/easy-rsa
pki_dir=$easyras_dir/pki
for user in "$@"
do
if [ -d "$keys_dir/$user" ]; then
rm -rf $keys_dir/$user
rm -rf $pki_dir/reqs/$user.req
sed -i '/'"$user"'/d' $pki_dir/index.txt
fi
cd $easyras_dir
./easyrsa build-client-full $user nopass
mkdir -p $keys_dir/$user
cp $pki_dir/ca.crt $keys_dir/$user/
cp $pki_dir/issued/$user.crt $keys_dir/$user/
cp $pki_dir/private/$user.key $keys_dir/$user/
cp /etc/openvpn/client/sample.ovpn $keys_dir/$user/$user.ovpn
sed -i 's/admin/'"$user"'/g' $keys_dir/$user/$user.ovpn
cp $easyras_dir/ta.key $keys_dir/$user/ta.key
cd $keys_dir
zip -r $user.zip $user
done
exit 0
# ! /bin/bash
set -e
keys_dir=/etc/openvpn/client/keys
easyras_dir=/etc/openvpn/easy-rsa/
for user in "$@"
do
cd $easyras_dir
echo -e 'yes\n' | ./easyrsa revoke $user
./easyrsa gen-crl
if [ -d "$keys_dir/$user" ]; then
rm -rf $keys_dir/${user}*
fi
systemctl restart openvpn@server
done
exit 0