侧边栏壁纸
博主头像
cloudnative-blog 博主等级

I can break through the limitations !

  • 累计撰写 23 篇文章
  • 累计创建 10 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

外网访问家里服务器

周锐豪
2024-10-24 / 0 评论 / 0 点赞 / 18 阅读 / 0 字 / 正在检测是否收录...
我这里使用的是frp做内网穿透,一台阿里云服务器,有公网ip,一台家里pve虚拟化的服务器
frp和云主机做内网穿透,通过访问云主机的公网ip端口映射到家里的openvpn端口来连接到家里的网络

image-20240111150822044

一.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
0

评论区