我这里使用的是frp做内网穿透,一台阿里云服务器,有公网ip,一台家里pve虚拟化的服务器
frp和云主机做内网穿透,通过访问云主机的公网ip端口映射到家里的openvpn端口来连接到家里的网络
一.openvpn
OpenVPN是一种基于SSL/TLS协议实现的开源VPN解决方案。它是一款跨平台的VPN软件,可以在Windows、Linux、MacOS、Android等多种操作系统上运行,并且支持多种加密算法和认证方式。OpenVPN可以通过配置文件定制化设置,具有高度的灵活性和可扩展性。
1.安装openvpn依赖环境
yum install -y gcc epel-release lzo-devel pam-devel lz4-devel openssl-devel systemd-devel sqlite-devel lzo pam openssl-devel lzo-devel pam-devel
2.安装openvpn
yum install -y openvpn easy-rsa
3.复制配置文件到/open/vpn根目录
[root@openvpn ~]# mkdir /etc/openvpn/easy-rsa
[root@openvpn ~]# cd /usr/share/doc/easy-rsa-3.0.8/
[root@openvpn easy-rsa-3.0.8]# cp vars.example /etc/openvpn/easy-rsa/vars
[root@openvpn easy-rsa-3.0.8]# cp -r * /etc/openvpn/easy-rsa/
[root@openvpn ~]# cd /usr/share/easy-rsa/3.0.8/
[root@openvpn 3.0.8]# cp -rf * /etc/openvpn/easy-rsa/
[root@openvpn ~]# cd /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/
[root@openvpn sample-config-files]# cp server.conf /etc/openvpn/
[root@openvpn sample-config-files]# cp client.conf /etc/openvpn/
4.初始化pki和创建ca
[root@openvpn ~]# vim /etc/openvpn/easy-rsa/vars
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Bejing"
set_var EASYRSA_REQ_ORG "bj"
set_var EASYRSA_REQ_EMAIL "123456@163.com"
set_var EASYRSA_REQ_OU "ww"
[root@openvpn ~]# cd /etc/openvpn/easy-rsa/
[root@openvpn easy-rsa]# ./easyrsa init-pki
[root@openvpn easy-rsa]# ./easyrsa build-ca
Enter New CA Key Passphrase: 123456 #输入ca key的密码
Re-Enter New CA Key Passphrase: 123456 #输入ca key的密码
#输入ca通用名称
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:openvpn-ca
5.创建请求申请服务器证书
[root@openvpn ~]# cd /etc/openvpn/easy-rsa/
[root@openvpn easy-rsa]# ./easyrsa gen-req server nopass
#输入通用的server名称
Common Name (eg: your user, host, or server name) [server]:openvpn-server
----------------------------------------------------------------------------------------------------
[root@openvpn easy-rsa]# ./easyrsa sign server server
Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-8978.ss8xeY/tmp.GEa79t
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: 123456
6.创建 Diffie-Hellman 协议
[root@openvpn easy-rsa]# ./easyrsa gen-dh
7.生成ta密钥文件
[root@openvpn easy-rsa]# openvpn --genkey --secret /etc/openvpn/easy-rsa/ta.key
8.初始化pki
[root@openvpn ~]# cd /etc/openvpn/client/
[root@openvpn client]# cp -r /usr/share/easy-rsa/3.0.8/* .
[root@openvpn client]# ./easyrsa init-pki
9.编辑配置文件
9.1复制服务器证书文件
mkdir /etc/openvpn/data
cd /etc/openvpn/easy-rsa/pki/
cp ca.crt /etc/openvpn/data/
cp private/server.key /etc/openvpn/data/
cp issued/server.crt /etc/openvpn/data/
cp dh.pem /etc/openvpn/data/
cp ../ta.key /etc/openvpn/data/
9.2复制客户端的证书文件
cd /etc/openvpn/client/
cp /etc/openvpn/easy-rsa/pki/ca.crt .
cp ../easy-rsa/ta.key .
cat > client.conf << EOF
client #指定当前VPN是客户端
dev tun #使用tun隧道传输协议
proto udp #使用udp协议传输数据
remote 公网ip 1194 #openvpn服务器公网IP地址端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用
nobind #不绑定本地特定的端口号
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
ca ca.crt #指定CA证书的文件路径
cert ww.crt #指定当前客户端的证书文件路径
key ww.key #指定当前客户端的私钥文件路径
remote-cert-tls server #OpenVPN客户端将验证服务器证书扩展KeyUsage
tls-auth ta.key 1 #启用 HMAC 防火墙。它是用于防止DDos攻击的额外安全层
cipher AES-256-CBC #启用加密密码
comp-lzo #启用lzo数据压缩格式
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
auth-nocache #OpenVPN在使用用户名/密码后立即忘记输入
EOF
9.3编辑配置文件
[root@openvpn ~]# vim /etc/openvpn/server.conf
78 ca /etc/openvpn/data/ca.crt #设置CA证书路径
79 cert /etc/openvpn/data/server.crt #设置服务器证书路径
80 key /etc/openvpn/data/server.key #服务器证书对应的私钥
85 dh /etc/openvpn/data/dh.pem #Diffie-Hellman文件路径
101 server 10.10.0.0 255.255.0.0 #设置VPN子网,用与客户端获取IP
108 ifconfig-pool-persist /etc/openvpn/ipp.txt #维护客户端IP
135 push "route 192.168.3.0 255.255.255.0" #允许客户端访问内网192.168.3.0网段
200 push "dhcp-option DNS 202.106.196.115" #设置客户端首选DNS
201 push "dhcp-option DNS 114.114.114.114" #设置客户端备选DNS
244 tls-auth /etc/openvpn/data/ta.key 0 #ta 密钥设置,服务器端为 0, 客户端设为 1
263 comp-lzo #对数据进行压缩,服务器和客户端要保持一致
267 max-clients 1000 #允许客户端的最大并发数
287 status /etc/openvpn/openvpn-status.log #定期把 openvpn 的一些状态信息写到文件中
---------------------------------------------------------------------------------------------
#注释
push “redirect-gateway def1 bypass-dhcp” #重定向客户端网关为openvpn的地址 (不推荐)
优点: 客户端的所有网络流量都将经过openvpn服务器,也就是说可以访问openvpn服务器端的所有网段的主机
缺点: 自己电脑访问所有的流量都是经过openvpn的,网络会有延迟,本地如果跟openvpn服务器端相同的网段,那么会优先访问服务器端网段主机,这时候自己电脑的公网ip就是openvpn服务器的出口ip地址
push "route 192.168.3.0 255.255.255.0" #允许客户端访问内网192.168.3.0网段 (推荐)
优点: 这里只配置了访问192.168.3.0网段资源的时候会通过openvpn来访问,限制了访问openvpn服务器的网段,剩下的流量则经过自己电脑的公网ip
缺点: 只能访问192.168.3.0网段的资源,要是想访问openvpn服务器端其他网段的话则另外添加一条路由
10.配置openvpn支持md5
不配置这个的话后面openvpn会出错导致连接不到,Centos 7移除了Openssl的MD5支持
openssl仍然默认以md5作为散列算法并且可以正确识别md5散列算法,所以就悲剧了,只有cenots7不好用。关键是这个错误是大错误被小错误还掩盖了一下,所以很难被发现。
export OPENSSL_ENABLE_MD5_VERIFY=1
export NSS_HASH_ALG_SUPPORT=+MD5
[root@openvpn ~]# vim /usr/lib/systemd/system/NetworkManager.service
[Service]
Environment="OPENSSL_ENABLE_MD5_VERIFY=1 NSS_HASH_ALG_SUPPORT=+MD5"
[root@openvpn ~]# systemctl daemon-reload
[root@openvpn ~]# systemctl restart NetworkManager
11.启动openvpn
[root@openvpn ~]# systemctl start openvpn@server
[root@openvpn ~]# systemctl enable openvpn@server
[root@openvpn ~]# netstat -nupat | grep 1194
udp 0 0 0.0.0.0:1194 0.0.0.0:* 9566/openvpn
12.开启ipv4转发
[root@openvpn ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@openvpn ~]# sysctl -p
13.开启firewall防火墙
systemctl start firewalld
systemctl enable firewalld
setenforce 0
firewall-cmd --add-port=1194/udp --permanent
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --permanent --direct --passthrough ipv4 -t nat POSTROUTING -o eth0 -j MASQUERADE -s 10.10.0.0/16
firewall-cmd --reload
14.创建用户脚本
[root@openvpn ~]# mkdir -p /etc/openvpn/script
[root@openvpn script]# cd /etc/openvpn/script
[root@openvpn script]# vim create_user.sh
#!/bin/sh
client_data=/etc/openvpn/client
easy_data=/etc/openvpn/easy-rsa
data=/etc/openvpn/data
tar=/usr/bin/tar
printer(){
read -p "press enter tocontinue"
}
#1.创建vpn用户
read -p "输入创建的账户名: " name
#2.配置客户端证书
cd $client_data
./easyrsa gen-req $name
#3.导入证书请求文件
cd $easy_data
./easyrsa import-req /etc/openvpn/client/pki/reqs/${name}.req $name
./easyrsa sign client $name
#4.复制证书请求文件到client
mkdir $client_data/$name
cp $easy_data/pki/issued/${name}.crt $client_data/$name
cp $client_data/pki/private/${name}.key $client_data/$name
cp $client_data/ca.crt $client_data/$name
cp $client_data/ta.key $client_data/$name
cp $client_data/client.conf $client_data/$name/
sed -i "s/vpn_user/$name/g" $client_data/$name/client.conf
mv $client_data/$name/client.conf $client_data/$name/client.ovpn
cd $client_data
zip -q -r $data/${name}.zip $name
if [ $? -eq 0 ]
then
echo "${name}用户创建成功"
else
echo "${name}用户创建失败"
fi
15.删除用户脚本
[root@openvpn script]# vim delete_user.sh
#!/bin/sh
client_data=/etc/openvpn/client
easy_data=/etc/openvpn/easy-rsa
data=/etc/openvpn/data
tar=/usr/bin/tar
#删除vpn用户
read -p "输入删除的账户名: " name
cd $easy_data
./easyrsa revoke $name
./easyrsa gen-crl
#删除用户认证文件
cd $client_data
rm -f ${name}.*
rm -f $client_data/pki/private/${name}.key
rm -f $easy_data/pki/issued/${name}.crt
if [ $? -eq 0 ]
then
echo "${name}用户删除成功"
else
echo "${name}用户删除失败"
fi
16.创建一个用户
[root@openvpn script]# chmod +x *
[root@openvpn script]# ./create_user.sh
输入创建的账户名: ww
writing new private key to '/etc/openvpn/client/pki/easy-rsa-2394.svuNMW/tmp.Tfyvp9'
Enter PEM pass phrase: 123456 #输入用户连接openvpn的密码
Verifying - Enter PEM pass phrase: 123456 #输入用户连接openvpn的密码
Common Name (eg: your user, host, or server name) [ww]:ww #输入用户名
Type the word 'yes' to continue, or any other input to abort. #是否继续创建
Confirm request details: yes
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: 123456 #输入ca的密码
Signature ok
ww用户创建成功
二.frp
从公网中访问自己的私有设备向来是一件难事儿。自己的主力台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。
frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp, udp, http,https等协议类型,并且web服务支持根据域名进行路由转发。
frp内网穿透主要用于没有公网IP的用户,实现远程桌面、远程控制路由器、搭建的WEB、FTP、SMB服务器被外网访问、远程查看摄像头、调试一些远程的API(比如微信公众号,企业号的开发)等。
为什么要选择frp?市面上提供内网穿透服务的公司对免费的用户是有限制的,frp免费提供无限流量、无限域名绑定、不限制网速、不限制连接数的内网穿透服务。
https://github.com/fatedier/frp/releases
tar xf frp_0.51.3_linux_amd64.tar.gz
mv frp_0.51.3_linux_amd64 /usr/local/frp
1.安装服务端
1.1配置frps
[root@halo ~]# vim /usr/local/frp/frps.ini
[common]
#服务端绑定的ip和端口
bind_addr = 0.0.0.0
bind_port = 7000
#Dashboard管理界面端口.账号,密码
dashboard_port = 7777
dashboard_user = admin
dashboard_pwd = 123456
#客户端连接服务端的认证方式
authentication_method = token
token = 123456
#服务端最大连接个数
max_pool_count = 500
1.2配置服务启动文件
[root@halo ~]# vim /usr/lib/systemd/system/frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
1.3启动frps
systemctl daemon-reload
systemctl start frps
systemctl enable frps
2.安装客户端
2.1配置frpc
[root@ftp ~]# vim /usr/local/frp/frpc.ini
[common]
#客户端连接服务端的ip和端口
server_addr = frps服务端公网ip
server_port = 7000
#服务端的token
token = 123456
[openvpn]
type = udp
local_ip = 127.0.0.1
local_port = 1194
remote_port = 1194
2.2配置服务启动文件
[root@ftp ~]# vim /usr/lib/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
2.3启动frpc
systemctl daemon-reload
systemctl start frpc
systemctl enable frpc
评论区