- 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-release
yum update -y
yum install -y openssl lzo pam openssl-devel lzo-devel pam-devel bridge-utils
yum install -y easy-rsa
yum 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。
```bash
cp -rf /usr/share/easy-rsa/3.0.3 /etc/openvpn/server/easy-rsa
cd /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-dh
openvpn --genkey --secret ta.key
配置文件
# 日志存放目录
mkdir -p /var/log/openvpn/
# 用户管理目录
mkdir -p /etc/openvpn/server/user
# 配置权限
chown openvpn:openvpn /var/log/openvpn
tee /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 tap0
user openvpn
group openvpn
# 配置使用证书
ca /etc/openvpn/server/easy-rsa/pki/ca.crt
cert /etc/openvpn/server/easy-rsa/pki/issued/server.crt
key /etc/openvpn/server/easy-rsa/pki/private/server.key
dh /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-env
script-security 3
# client-cert-not-required # Deprecated option
verify-client-cert
username-as-common-name
## Connecting clients to be able to reach each other over the VPN.
client-config-dir /etc/openvpn/server/user/ccd
client-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-CBC
ncp-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 1
keepalive 30 360
persist-key
persist-tun
verb 3
# 禁用在线用户身份重验证
reneg-sec 0
log /var/log/openvpn/server.log
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
EOF
cd /etc/openvpn/server/
ln -sf server.conf .service.conf
创建身份验证信息的文件与身份验证脚本
tee /etc/openvpn/server/user/psw-file <<- 'EOF'
username password
EOF
chmod 600 /etc/openvpn/server/user/psw-file
chown openvpn:openvpn /etc/openvpn/server/user/psw-file
tee /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}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=
\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=
\"${password}\"." >> ${LOG_FILE}
exit 1
EOF
chmod +x /etc/openvpn/server/user/checkpsw.sh
关闭防火墙
网桥模式如果不关闭防火墙,会导致只能ping通,但端口不通。因为数据包在防火墙就被拦截了,无法发送到openvpn。这条配置在客户端也是如此。
systemctl disable --now firewalld
但如果不是网桥模式,而是tunnel模式,则不能关闭防火墙,还需要额外开启NAT地址转换。
# 仅在tunnel模式使用以下命令
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --reload
为用户创建固定IP
tee /etc/openvpn/server/user/ccd/username <<- 'EOF'
ifconfig-push 172.31.30.211 255.255.255.0
EOF
chown -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'
client
proto udp
auth-user-pass
dev tap
remote 服务器IP 1194
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
remote-cert-tls server
auth-nocache
# 自定义路由可以覆盖服务器的推送路由
route 172.31.28.0 255.255.255.0 net_gateway
persist-tun
persist-key
compress lzo
reneg-sec 0
verb 4
mute 10
EOF
chown -R openvpn:openvpn /etc/openvpn/client/
网络路由配置
需要在两地的网关设备上,将对方的网段通过路由表指向登录VPN的设备。
具体配置方法根据设备的不同千差万别,就不介绍了。这部分需要有网络配置经验的工程师来做,不懂就不要乱搞了。