Centos7 搭建虚拟局域网VPN

在局域网中,为了安全需要,通常将网络进行物理隔离,但是有些多网卡的物理机是可以正常访问多个隔离的子网的,此时想要自己的PC也能跨网络访问,可以使用在多网卡物理机上部署frp服务,实现内网穿透,但这种方法每次都需要配置,比较麻烦。
比较简单的方法,就是在内网中再组建一套虚拟局域网,把被访问的机器和用于访问的机器都拉入这个虚拟局域网中,这样双方机器都在同一局域网中,访问更加方便,且满足安全的需求。

在公网上组件虚拟局域网比较方便,主要有以下两种方式:

  1. 蒲公英,免费只能有两个机器,即打通两张网或者两个机器,最高网速10M,优势是有手机客户端等,管理方便,以后有更多的需求只需要花钱即可解决
  2. ZeroTier,完全免费,优势是带宽比较大且不限制客户端数量,还能自定义网络,但是没有手机管理客户端,只能在web上进行管理

在局域网中,组件虚拟局域网相对于公网,麻烦之处在于搭建VPN服务器,客户端使用和公网类似。VPN服务器的搭建有3种方式:

  1. 如果方便使用,即windows可以使用自带的vpn连接,方便客户上手,可以搭建L2TP+IPSec比较繁琐,但用户接入比较方便
  2. 如果方便管理,可以搭建openvpn推荐使用,但是如果有新用户需要连接,则需要制作证书
  3. 如果想要开源,即完全可控,可以使用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服务器的内网接口)

服务端

安装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. 安装软件和修改内核参数
# 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
  1. 配置和启动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  # 设置开机启动
  1. 配置和启动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
  1. 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

服务端

  1. 检查服务器是否支持PPTP协议
modprobe ppp-compress-18 && echo ok
    # 返回ok即表示支持
  1. 检测是否安装firewalld防火墙(默认Centos7是安装的,如果没有则自行安装)
firewall-cmd --state
    # 返回running即表示安装且运行防火墙
  1. 安装PPTP相关软件包
# 依赖第三方yum源EPEL
# yum install epel-release -y
yum install ppp ppp-devel pptpd -y
  1. 分别修改PPTP的配置文件:pptpd.confoption.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
  1. 在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     *
  1. 修改系统参数文件:sysctl.conf,打开ipv4转发功能
vim /etc/sysctl.conf
    net.ipv4.ip_forward=1
    # net.ipv6.conf.all.forwarding=1  # 如果需要ipv6,则打开
sysctl -p
  1. 配置防火墙,开启数据路由(关键的一步,不配置防火墙,无法实现网络访问)
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协议
  1. 启动pptpd,开启VPN服务
systemctl enable pptpd
systemctl start pptpd

客户端

1
2
3
4
5
6
7

错误解决

  1. 连不上VPN:检查是否开放在防火墙和服务商安全策略中开启了 TCP的1723端口
  2. 能连上VPN上不了网
    1. 网卡MTU的值设置过小,可以在服务器端使用:ifconfig ppp0 mtu 1500进行临时设置,永久生效需要修改配置文件,如下:
vim /etc/ppp/ip-up
# 在 exit 0 前写入 : 
ifconfig $1 mtu 1500
# 重启下pptpd服务:
systemctl restart pptpd
2. 执行命令:重置清空firewall的所有规则,然后重新添加上面的firewall防火墙规则