- Tun和Tap
- Openvpn服务端部署-网桥模式
- !/bin/bash
- Set up Ethernet bridge on Linux
- Requires: bridge-utils
- Define Bridge Interface
- Define list of TAP interfaces to be bridged,
- for example tap=”tap0 tap1 tap2”.
- Define physical ethernet interface to be bridged
- with TAP interface(s) above.
- !/bin/bash
- Tear Down Ethernet bridge on Linux
- Define Bridge Interface
- Define list of TAP interfaces to be bridged together
- 客户端配置
- 网络路由配置
使用Openvpn可以将两个处于不同地址位置的局域网联结成为一个局域网。由于网络相关的配置技术需要一定的网络基础,所以看不懂的同学不必勉强自己。
Tun和Tap
- Tun,tunnel模式,也可以称作路由模式。Openvpn默认会向客户端发送一个30网段的地址。这种模式比较难配置路由,也就是说难以将网段路由到VPN连接中,所有IP地址需要经过NAT转换才能正常访问。比较适合终端用户使用,或者是两地的网络规划中网段有冲突。缺点是所有客户端方向发起请求的地址都会转换为Openvpn客户端的地址,难以管理。
- Tap,网桥模式,Openvpn默认使用子网为客户端提供IP地址。这种模式下的路由可配置度相对较高,IP地址也不需要转换可以直接经由VPN连接发送到对方子网中,服务端在接收到客户端的请求时,源地址都是真实的IP地址,很适合异地组网使用。
Openvpn服务端部署-网桥模式
使用yum安装非常方便,安装完成之后需要生成加密与身份验证的证书,然后就可以制作服务端使用的配置文件并启动了。
服务器需要两个网卡,一个网卡正常配置IP通信,另一个网卡配置成获取动态IP。使用yum安装openvpn
yum install -y epel-releaseyum update -yyum install -y openssl lzo pam openssl-devel lzo-devel pam-devel bridge-utilsyum install -y easy-rsayum install -y openvpn
创建网桥
```bash tee ~/bridge-start.sh <<- ‘EOF’!/bin/bash
#
Set up Ethernet bridge on Linux
Requires: bridge-utils
#
Define Bridge Interface
br=”br0”Define list of TAP interfaces to be bridged,
for example tap=”tap0 tap1 tap2”.
tap=”tap0”Define physical ethernet interface to be bridged
with TAP interface(s) above.
eth=”ens224” eth_ip=”172.31.30.1” eth_netmask=”255.255.255.0” eth_broadcast=”172.31.30.255” for t in $tap; do openvpn —mktun —dev $t done brctl addbr $br brctl addif $br $eth for t in $tap; do brctl addif $br $t done for t in $tap; do ifconfig $t 0.0.0.0 promisc up done ifconfig $eth 0.0.0.0 promisc up ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast EOF
chmod +x ~/bridge-stop.sh tee ~/bridge-stop.sh <<-‘EOF’
!/bin/bash
#
Tear Down Ethernet bridge on Linux
#
Define Bridge Interface
br=”br0”
Define list of TAP interfaces to be bridged together
tap=”tap0” ifconfig $br down brctl delbr $br for t in $tap; do openvpn —rmtun —dev $t done EOF
chmod +x bridge-stop.sh ./bridge-start.sh
<a name="vtwAJ"></a>## 生成密钥easy-rsa 版本是3.x。```bashcp -rf /usr/share/easy-rsa/3.0.3 /etc/openvpn/server/easy-rsacd /etc/openvpn/server/easy-rsa./easyrsa init-pki./easyrsa build-ca nopass./easyrsa build-server-full server nopass./easyrsa build-client-full client nopass./easyrsa gen-dhopenvpn --genkey --secret ta.key
配置文件
# 日志存放目录mkdir -p /var/log/openvpn/# 用户管理目录mkdir -p /etc/openvpn/server/user# 配置权限chown openvpn:openvpn /var/log/openvpntee /etc/openvpn/server/server.conf <<- 'EOF'################################################## This file is for the server side ## of a many-clients <-> one-server ## OpenVPN configuration. ## ## Comments are preceded with '#' or ';' ##################################################port 1194# proto tcp-server# 使用udp协议可以提升性能proto udp## Enable the management interface# management-client-auth# management localhost 7505 /etc/openvpn/user/management-file# dev tun # TUN/TAP virtual network device# 网桥模式dev tap0user openvpngroup openvpn# 配置使用证书ca /etc/openvpn/server/easy-rsa/pki/ca.crtcert /etc/openvpn/server/easy-rsa/pki/issued/server.crtkey /etc/openvpn/server/easy-rsa/pki/private/server.keydh /etc/openvpn/server/easy-rsa/pki/dh.pem# 数据传输额外的加密与证书tls-auth /etc/openvpn/server/easy-rsa/ta.key 0## Using System user auth.# plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login## Using Script Plugins 身份验证脚本auth-user-pass-verify /etc/openvpn/server/user/checkpsw.sh via-envscript-security 3# client-cert-not-required # Deprecated optionverify-client-certusername-as-common-name## Connecting clients to be able to reach each other over the VPN.client-config-dir /etc/openvpn/server/user/ccdclient-to-client## Allow multiple clients with the same common name to concurrently connect.# duplicate-cn# client-config-dir /etc/openvpn/server/ccd# ifconfig-pool-persist ipp.txt# local 172.31.31.254# 网桥模式:配置服务器的IP地址与分配给客户端的地址server-bridge 172.31.30.1 255.255.255.0 172.31.30.11 172.31.30.254# topology subnet# server 172.31.31.0 255.255.255.0# push "redirect-private def1"# 向客户端推送配置push "dhcp-option DNS 172.31.26.6"push "route 172.31.26.0 255.255.255.0"push "route 172.31.27.0 255.255.255.0"push "route 172.31.28.0 255.255.255.0"push "route 172.31.29.0 255.255.255.0"# comp-lzo - DEPRECATED This option will be removed in a future OpenVPN release. Use the newer --compress instead.compress lzo# cipher AES-256-CBCncp-ciphers "AES-256-GCM:AES-128-GCM"## In UDP client mode or point-to-point mode, send server/peer an exit notification if tunnel is restarted or OpenVPN process is exited.# explicit-exit-notify 1keepalive 30 360persist-keypersist-tunverb 3# 禁用在线用户身份重验证reneg-sec 0log /var/log/openvpn/server.loglog-append /var/log/openvpn/server.logstatus /var/log/openvpn/status.logEOFcd /etc/openvpn/server/ln -sf server.conf .service.conf
创建身份验证信息的文件与身份验证脚本
tee /etc/openvpn/server/user/psw-file <<- 'EOF'username passwordEOFchmod 600 /etc/openvpn/server/user/psw-filechown openvpn:openvpn /etc/openvpn/server/user/psw-filetee /etc/openvpn/server/user/checkpsw.sh <<- 'EOF'#!/bin/bash############################################################ checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>## This script will authenticate OpenVPN users against# a plain text file. The passfile should simply contain# one row per user with the username first followed by# one or more space(s) or tab(s) and then the password.PASSFILE="/etc/openvpn/server/user/psw-file"LOG_FILE="/var/log/openvpn/password.log"TIME_STAMP=`date "+%Y-%m-%d %T"`###########################################################if [ ! -r "${PASSFILE}" ]; thenecho "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}exit 1fiCORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`if [ "${CORRECT_PASSWORD}" = "" ]; thenecho "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}exit 1fiif [ "${password}" = "${CORRECT_PASSWORD}" ]; thenecho "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}exit 0fiecho "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}exit 1EOFchmod +x /etc/openvpn/server/user/checkpsw.sh
关闭防火墙
网桥模式如果不关闭防火墙,会导致只能ping通,但端口不通。因为数据包在防火墙就被拦截了,无法发送到openvpn。这条配置在客户端也是如此。
systemctl disable --now firewalld
但如果不是网桥模式,而是tunnel模式,则不能关闭防火墙,还需要额外开启NAT地址转换。
# 仅在tunnel模式使用以下命令firewall-cmd --permanent --add-masqueradefirewall-cmd --permanent --add-service=openvpnfirewall-cmd --reload
为用户创建固定IP
tee /etc/openvpn/server/user/ccd/username <<- 'EOF'ifconfig-push 172.31.30.211 255.255.255.0EOFchown -R openvpn:openvpn /etc/openvpn/server/user/ccd/
启动服务
systemctl start openvpn-server@.service.service
客户端配置
客户端如果是Linux,也可以用相同的方法安装openvpn。如果是Windows,直接使用msi包就可以。
从server上将生成的ca.crt、client.crt、client.key、ta.key文件下载到客户端,在客户端生成配置文件。
tee /etc/openvpn/client/client.ovpn <<- 'EOF'clientproto udpauth-user-passdev tapremote 服务器IP 1194ca ca.crtcert client.crtkey client.keytls-auth ta.key 1remote-cert-tls serverauth-nocache# 自定义路由可以覆盖服务器的推送路由route 172.31.28.0 255.255.255.0 net_gatewaypersist-tunpersist-keycompress lzoreneg-sec 0verb 4mute 10EOFchown -R openvpn:openvpn /etc/openvpn/client/
网络路由配置
需要在两地的网关设备上,将对方的网段通过路由表指向登录VPN的设备。
具体配置方法根据设备的不同千差万别,就不介绍了。这部分需要有网络配置经验的工程师来做,不懂就不要乱搞了。
