在局域网中,为了安全需要,通常将网络进行物理隔离,但是有些多网卡的物理机是可以正常访问多个隔离的子网的,此时想要自己的PC也能跨网络访问,可以使用在多网卡物理机上部署frp服务,实现内网穿透,但这种方法每次都需要配置,比较麻烦。
比较简单的方法,就是在内网中再组建一套虚拟局域网,把被访问的机器和用于访问的机器都拉入这个虚拟局域网中,这样双方机器都在同一局域网中,访问更加方便,且满足安全的需求。
在公网上组件虚拟局域网比较方便,主要有以下两种方式:
- 蒲公英,免费只能有两个机器,即打通两张网或者两个机器,最高网速10M,优势是有手机客户端等,管理方便,以后有更多的需求只需要花钱即可解决
- ZeroTier,完全免费,优势是带宽比较大且不限制客户端数量,还能自定义网络,但是没有手机管理客户端,只能在web上进行管理
在局域网中,组件虚拟局域网相对于公网,麻烦之处在于搭建VPN服务器,客户端使用和公网类似。VPN服务器的搭建有3种方式:
- 如果方便使用,即windows可以使用自带的vpn连接,方便客户上手,可以搭建L2TP+IPSec
比较繁琐,但用户接入比较方便
- 如果方便管理,可以搭建openvpn
推荐使用,但是如果有新用户需要连接,则需要制作证书
- 如果想要开源,即完全可控,可以使用N2N
备用方案,搭建方案参考openvpn
这3种方式均可以在windows server和centos7上搭建,在windows server上搭建过于简单,网上教程比较多,在此不多介绍,仅介绍一下在Centos7上搭建的过程,毕竟部署重要服务的才能进行多网络访问,这些服务器大部分是Centos7系统嘛
OpenVPN
网络拓扑(实验环境)
网络拓扑(即模拟实验环境)如下:
- 网络:
- vmnet1:192.168.0.0/24,企业内网
- vmnet8:172.16.0.0/16(网关172.16.1.1),Internet外网
- 设备:
- Centos7【VPN服务器】:
- 内网:vmnet1,192.168.0.1/24(只设置IPADDR)
- 外网:vmnet8,172.16.0.1/16(设置IPADDR、GATEWAY和DNS1均为172.16.1.1)
- Windows7【出差员工电脑】
- 外网:(连接)vmnet8,172.16.10.10/16(ping 172.16.0.1,通则说明此电脑能正常连接到VPN服务器的公网接口)
- Windows Server 2000【企业内部服务器】:
- 内网:(连接)vmnet1,192.168.0.100/24(ping 192.168.0.1,通则说明此服务器能正常连接到VPN服务器的内网接口)
- Centos7【VPN服务器】:
服务端
安装openvpn和证书制作工具easy-rsa
yum install -y epel-release
yum install -y openvpn easy-rsa openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
openvpn不是通过用户名和密码来识别用户的,而是通过证书来识别的,所以必须制作证书
1. 配置文件复制
复制服务端和客户端配置文件到openvpn配置文件目录
cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
# 用于服务端证书制作
mkdir -p /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa/
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars
cd /etc/openvpn/easy-rsa/ && ls
# easyrsa openssl-easyrsa.cnf vars x509-types
# 用于客户端证书制作
mkdir -p /etc/openvpn/client
cp -r /usr/share/easy-rsa/3.0.8/* /etc/openvpn/client
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/client/vars
cd /etc/openvpn/client/ && ls
easyrsa openssl-easyrsa.cnf vars x509-types
2. 服务端证书制作
1. vpn的相关配置
# 根据需要进行自定义,也可以忽略不设置
# 编辑vars文件
vim /etc/openvpn/easy-rsa/vars # 追加以下内容(去掉注释修改也可以)
# 参数有很多,但主要是修改以下项目
set_var EASYRSA_REQ_COUNTRY "cn" # 国家
set_var EASYRSA_REQ_PROVINCE "guangxi" # 省份
set_var EASYRSA_REQ_CITY "nanning" # 城市
set_var EASYRSA_REQ_ORG "fqj_web" # 组织
set_var EASYRSA_REQ_EMAIL "12345@163.com" # 邮箱
set_var EASYRSA_REQ_OU "fqj" # 拥有者
2. 创建CA证书ca.crt
cd /etc/openvpn/easy-rsa/
# 1. 目录初始化:初始化pki,生成目录文件结构
./easyrsa init-pki
ls
# easyrsa openssl-easyrsa.cnf pki vars x509-types
# 2. 创建根证书(CA证书):
./easyrsa build-ca
# Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars # 默认使用当前目录下的vars文件,可以自定义
# Enter New CA Key Passphrase: # 下面两处输入CA证书密码,这里使用的是123456
# Re-Enter New CA Key Passphrase:
# Common Name (eg: your user, host, or server name) [Easy-RSA CA]: #直接回车,就是默认的CA作为名字
# /etc/openvpn/easy-rsa/pki/ca.crt #ca证书存放路径
3. 创建服务端证书server.crt
# 1. 创建服务端证书
./easyrsa gen-req server nopass # nopass设置免证书密码,如果要设置密码可以取消此参数选项
# Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars # 默认使用当前目录下vars文件
# Common Name (eg: your user, host, or server name) [server]: # 直接回车,默认名字为server
# req: /etc/openvpn/easy-rsa/pki/reqs/server.req
# key: /etc/openvpn/easy-rsa/pki/private/server.key # 密钥key的路径
# 2. 证书签名,即签约服务端证书
./easyrsa sign server server # 第一个server表示服务端;第二个server是指上面服务端证书的CN名字,我们用的默认server,这个可以自定义
# Confirm request details: # 输入yes
# Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: # 输入上面ca证书生成时的密码(123456)
# Certificate created at: /etc/openvpn/easy-rsa/pki/issued/server.crt # 服务端证书路径
4. 创建dh证书
./easyrsa gen-dh # 创建Diffie-Hellman,时间有点长
# DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem # dh证书路径
3. 客户端(ta密钥)证书制作
1. 初始化
# 客户端证书【流程和服务端一样】
# 为了便于区别,把客户端使用的证书存放在:/etc/openvpn/client
cd /etc/openvpn
openvpn --genkey --secret ta.key
cd /etc/openvpn/client
# 初始化
./easyrsa init-pki
2. 产生客户端证书
./easyrsa gen-req client nopass #client为证书名,可自定义,nopass同样设置免密
# req: /etc/openvpn/client/pki/reqs/client.req
# key: /etc/openvpn/client/pki/private/client.key # key路径
3. 客户端证书签名
# 切换到服务端easy-rsa目录下
cd /etc/openvpn/easy-rsa
# 导入req
./easyrsa import-req /etc/openvpn/client/pki/reqs/client.req client
# 签名
./easyrsa sign client client # 第一个client是固定的参数表示客户端;第二个client指上面导入的客户端证书名,可以自定义
# Confirm request details: # 输入'yes'
# Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: #输入ca密码(123456)
# Certificate created at: /etc/openvpn/easy-rsa/pki/issued/client.crt # 最终客户端证书路径
4. 修改openvpn配置文件并启动
1. 修改配置文件
# 服务器端证书和密钥统一放到和server.conf一个目录下,便于配置
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/
# 修改openvpn服务端配置文件server.conf
vim /etc/openvpn/server.conf
local 0.0.0.0 # 监控所有地址
port 1194 # 指定端口
proto udp # 指定协议(可以指定udp,udp比tcp快)
dev tun # 采用路由隧道模式
ca ca.crt # ca证书位置,相对路径,表示ca.crt和server.conf要在同一目录
cert server.crt # 服务端证书
key server.key # 服务端key
dh dh.pem # dh密钥
server 172.16.0.0 255.255.0.0 # 给客户端分配的地址池
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp" # 客户端网关使用openvpn服务器网关
push "dhcp-option DNS 8.8.8.8" # 指定dns
push "dhcp-option DNS 114.114.114.114"
keepalive 10 120 # 心跳检测,10秒检测一次,2分钟内没有回应则视为断线
tls-auth ta.key 0 # 服务端值为0,客户端为1
cipher AES-256-CBC
comp-lzo #传输数据压缩
persist-key
persist-tun
status openvpn-status.log
2. 启动openvpn
#设置启动文件
systemctl -f enable openvpn@server.service
# 启动
systemctl start openvpn@server.service
# 查看状态
systemctl status openvpn@server
客户端
1. 安装客户端
安装客户端OpenVPN-2.5.3-I601-x86.msi
,全部默认即可
2. 从vpn服务器(Centos7)上下载证书等文件
客户端所需证书,下载保存到客户端和客户端配置文件同一目录下
# 安装下载软件【此步骤可以省略,可以直接使用sftp下载】
yum -y install lrzsz
# 下载证书,存在在openvpn客户端目录下
sz /etc/openvpn/easy-rsa/pki/ca.crt #ca证书
sz /etc/openvpn/easy-rsa/pki/issued/client.crt #在服务端证书生成目录下
sz /etc/openvpn/client/pki/private/client.key # 在客户端生成目录下
sz /etc/openvpn/ta.key
# 下载到本地,window安装openvpn,然后设置client.ovpn,在conf目录下面。默认安装,则位置为C:\Program Files\OpenVPN\config
3. 编辑客户端配置文件
# 复制“C:\Program Files\OpenVPN\sample-config\client.ovpn”到“C:\Program Files\OpenVPN\config目录下”,然后修改内容如下:
client
dev tun
proto udp # 和server端一致(可以使用udp比tcp快)
remote 172.16.0.1 1194 # 指定服务端IP和端口
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt #ca证书
cert client.crt #客户端证书
key client.key #客户端密钥
remote-cert-tls server
tls-auth ta.key 1 #ta密钥
cipher AES-256-CBC
comp-lzo #传输内容压缩
verb 3
4. 双击启动OpenVPN GUI
双击桌面图标OpenVPN GUI,任务栏图标右键选择“连接”,然后进行远程连接windows server 2000测试
L2TP+IPSec
10.0.0.1(模拟内网,物理机A)<-->192.168.56.11(模拟内网,服务器B,L2TP+IPSec)<-->10.0.0.0网段地址(PC电脑C,连上VPN获取的地址)
服务器B
基本信息:
eth0:192.168.56.11/24
eth1:10.0.0.1/8
安装过程:
- 安装软件和修改内核参数
# 1. 安装服务
# 在centos7版本后, 提供ipsec服务包由libreswan替代了openswan
yum install -y xl2tpd libreswan
# 2. 修改内核支持,可以对照以下配置修改,或者直接复制,修改完后运行sysctl -p 使配置生效
vim /etc/sysctl.conf
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.ip_forward = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_source_route = 0
# 使配置生效
sysctl -p
- 配置和启动ipsec
# 1. 修改ipsec配置文件
# 在配置文件里加入这一行,即允许哪些网络可以穿透nat建立l2tp连接,格式:[%v4 | %v6:子网/掩码,v4和v6分别代表ipv4和ipv6网络
vim /etc/ipsec.conf
nat_traversal=yes #新加的
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10 # 需要穿透的所有网络均需要添加
# protostack=netkey
# keep_alive=1800
# 2. 建立ipsec与l2tp服务关联的配置文件(这部分配置文件可以直接写入/etc/ipsec.conf)
vim /etc/ipsec.d/l2tp_psk.conf # 如果此文件不存在,则需要手动创建
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
dpddelay=30
dpdtimeout=120
dpdaction=clear
rekey=no
ikelifetime=8h
keylife=1h
type=transport
# forceencaps=yes
sha2-truncbug=yes
left=192.168.56.11 # 左边的网络,外网ip,即PC电脑C连接的网络
leftid=192.168.56.11 # id随便填
leftnexthop=%defaultroute
leftprotoport=17/1701 # 17代表udp,tcp用6表示,1701代表端口
right=%any # 右边的网络,即模拟内网客户端连接的网络
rightprotoport=17/%any # 仍然使用udp协议,端口任意
rightnexthop=%defaultroute
# ike=3des-sha1,aes-sha1,aes256-sha1,aes256-sha2_256
# phase2alg=3des-sha1,aes-sha1,aes256-sha1,aes256-sha2_256
# 3. 当建立l2tp连接时,需要输入预共享密匙,以下为预共享密匙的配置文件
vim /etc/ipsec.secrets
include /etc/ipsec.d/*.secrets
cd /etc/ipsec.d/ && ll
# 需要有以下7个文件
cert9.db key4.db l2tp_psk.conf linuxcc_l2tp.secrets pkcs11.txt policies v6neighbor-hole.conf
vim /etc/ipsec.d/linuxcc_l2tp.secrets #如果没有,则需要自己创建
192.168.56.11 %any: PSK "123456"
# 4. 检验ipsec服务配置
ipsec setup start
ipsec verify
# 此处出错以及解决办法,错误如下
# Checking rp_filter [ENABLED]
# /proc/sys/net/ipv4/conf/eth0/rp_filter [ENABLED]
# rp_filter is not fully aware of IPsec and should be disabled
echo 0 >/proc/sys/net/ipv4/conf/eth0/rp_filter #解决办法
# 接着检查
ipsec verify
# 只有最后一行Opportunistic Encryption为[DISABLED]、Hardware random device 为[N/A],其他项目均为[OK]
# 7. 启动ipsec
systemctl start ipsec
systemctl enable ipsec # 设置开机启动
- 配置和启动xl2tpd
# 1. 修改l2tp的配置文件
vi /etc/xl2tpd/xl2tpd.conf
[global]
ipsec saref = yes #此处添加上去
listen-addr = 192.168.56.11 #外网
# auth file = /etc/ppp/chap-secrets # 用户名密码文件
# port = 1701
[lns default]
ip range = 10.0.0.100-10.0.0.200 #要和自己的内网一直,分配给客户端的IP地址,这个根据自己的内网网段和需要的ip数配置
local ip = 192.168.56.11 # 分配给自己的ip,也可以写外网地址
# local ip = 10.0.0.99
require chap = yes
refuse pap = yes
require authentication = yes
name = L2TPVPN # 名字随便起
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd # 这里有xl2tpd的一些配置
length bit = yes
# 2. 修改xl2tpd属性配置文件
vim /etc/ppp/options.xl2tpd
ipcp-accept-local
ipcp-accept-remote
ms-dns 192.168.56.254 #只修改DNS,建议改成网关的IP,也可以省略
# ms-dns 8.8.8.8
# ms-dns 192.168.1.1
# name l2tpd
noccp
auth
# crtscts #这几个注释的是新的配置里面没有,原来有的,注释掉就正常了
# lock
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
proxyarp
connect-delay 5000
require-mschap-v2
# lcp-echo-interval 30
# lcp-echo-failure 4
# mtu 1400
# asyncmap 0
# hide-password
# 3. 添加xl2tpd用户名密码,用于客户端连接
vim /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
vpn12345 * 123456 *
# 4. 启动xl2tpd
systemctl start xl2tpd
systemctl enable xl2tpd
- PC连接
# 1. 编辑注册表
win+R-->regedit-->HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\-->右键选择新建DWORD(32-位)值-->数值名称ProhibitIPSec,数值数据1-->重启电脑
# 2. 开启连接
控制面板-->网络和共享中心-->设置新的连接和网络-->连接到工作区-->使用我的Internet连接(VPN)-->Internet地址为192.168.56.11,目标名称为192.168.56.11【这里需要和/etc/ipsec.d/l2tp_psk.conf中的left和leftid一致】,仅勾选记住我的凭据(win7仅勾选现在不连接...)
控制面板-->网络链接-->找到192.168.56.11后右键选择属性-->安全-->VPN类型选择“使用IPSec的第2层隧道协议”,数据加密选择“可选加密”,身份验证选择“Microsoft:安全密码”
右键“192.168.56.11”选择连接/断开连接-->用户名vpn123456,密码123456【这里需要和/etc/ppp/chap-secrets配置的用户名和密码一致】
PPTP
服务端
- 检查服务器是否支持PPTP协议
modprobe ppp-compress-18 && echo ok
# 返回ok即表示支持
- 检测是否安装firewalld防火墙(默认Centos7是安装的,如果没有则自行安装)
firewall-cmd --state
# 返回running即表示安装且运行防火墙
- 安装PPTP相关软件包
# 依赖第三方yum源EPEL
# yum install epel-release -y
yum install ppp ppp-devel pptpd -y
- 分别修改PPTP的配置文件:
pptpd.conf
和option.pptpd
vim /etc/pptpd.conf
# 配置本地隧道网卡地址,及客户端地址池,需要同一网段
localip 192.168.0.1 # 内网ip地址(服务器的eth0网卡地址,不是服务器公网地址)
remoteip 192.168.0.234-238,192.168.0.245 # 自定义分配给客户端的网段
vim /etc/ppp/options.pptpd
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8 # 配置隧道dns
ms-dns 114.114.114.114
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
logfile /var/log/pptpd.log
- 在PPTP的用户认证配置文件:
chap-secrets
中添加登录账号
# 添加pptp vpn账号与密码,格式:用户名 pptpd(options.pptpd中的name参数值) 密码 ip地址
vim /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
admin pptpd 123456 *
- 修改系统参数文件:
sysctl.conf
,打开ipv4转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
# net.ipv6.conf.all.forwarding=1 # 如果需要ipv6,则打开
sysctl -p
- 配置防火墙,开启数据路由(关键的一步,不配置防火墙,无法实现网络访问)
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i ens32 -p tcp --dport 1723 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter POSTROUTING 0 -t nat -o ens32 -j MASQUERADE
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ppp+ -o ens32 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ens32 -o ppp+ -j ACCEPT
firewall-cmd --reload
# 配置服务器提供商主机的安全策略,此处使用的是阿里云的ECS,需要配置相关的安全策略,其他服务商请自行检查
# 1. 开启TCP的1723端口
# 2. 开启GRE协议
- 启动pptpd,开启VPN服务
systemctl enable pptpd
systemctl start pptpd
客户端
错误解决
- 连不上VPN:检查是否开放在防火墙和服务商安全策略中开启了 TCP的1723端口
- 能连上VPN上不了网:
- 网卡MTU的值设置过小,可以在服务器端使用:
ifconfig ppp0 mtu 1500
进行临时设置,永久生效需要修改配置文件,如下:
- 网卡MTU的值设置过小,可以在服务器端使用:
vim /etc/ppp/ip-up
# 在 exit 0 前写入 :
ifconfig $1 mtu 1500
# 重启下pptpd服务:
systemctl restart pptpd
2. 执行命令:重置清空firewall的所有规则,然后重新添加上面的firewall防火墙规则