RouterOS上就没有什么非常安全的配置,所以本文主要的目标是可用,增强安全性相关的操作都会被标为可选。
RouterOS 6.x的OpenVPN有很多限制:
- 支持的传输层:TCP
- 支持的Cipher: none BF-CBC AES-128-CBC AES-192-CBC AES-256-CBC
- 支持的Digest算法: none MD5 SHA1
- 支持的验证模式:必选用户名密码认证,可选客户端证书认证
- 即使在TAP模式下也不支持MPLS
服务端配置
服务端基于Debian 10来做例子。
安装OpenVPN
1 |
apt-get install -y openvpn |
创建CA和服务器证书
出于方便,这里CA在同一台机子上配置。注意这样是不安全的做法。安全的做法是在air-gapped电脑上创建离线CA,在VPN服务器上创建CSR,把CSR复制到CA上签名,再把签名过的证书复制回来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
cd /etc/openvpn/server export EASYRSA=$(pwd) export EASYRSA_EXT_DIR=/usr/share/easy-rsa/x509-types /usr/share/easy-rsa/easyrsa init-pki cp /usr/share/easy-rsa/openssl-easyrsa.cnf /etc/openvpn/server/pki/ /usr/share/easy-rsa/easyrsa build-ca # 会让你输入 CA 私钥的密码,记住 /usr/share/easy-rsa/easyrsa gen-req <server-name> nopass /usr/share/easy-rsa/easyrsa sign-req server <server-name> openssl dhparam -out dh.pem 2048 |
创建服务器配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
dev ovpn-server1 port 1194 # 设置下发的 IP 地址池 server 192.168.1.0 255.255.255.0 # connection properties dev-type tap proto tcp4-server #comp-lzo keepalive 10 60 ping-timer-rem persist-tun persist-key # security setup cipher AES-256-CBC script-security 2 user nobody group nogroup # MTU setup mtu-disc yes #link-mtu 1492 #mtu-test #tun-mtu 1464 #mssfix # server cert setup ca pki/ca.crt cert pki/issued/<server-name>.crt key pki/private/<server-name>.key dh dh.pem # if you don't need client cert username-as-common-name verify-client-cert none # username password auth script auth-nocache auth-user-pass-verify user-pass-auth.sh via-file # If you need to put the interface into a VRF #up "up-vrf.sh vrf1" |
创建用户名密码认证脚本
OpenVPN服务端默认支持的用户名密码认证有两种方式。一种是PAM插件,需要你在服务器上创建对应的用户,这样还得处理用户的登录权限问题,我们不这么做。另一种是写一个程序来自己处理认证:程序启动时会获得一个文件名作为参数,文件内容的第一行是用户名,第二行是密码,程序返回0表示认证成功。我们快速写一个简单的bash脚本来做用户认证:
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash # Simple OpenVPN user-pass-auth program set -Eeuo pipefail readarray -t line < $1 if [ "${line[0]}" == "username" ] && [ "${line[1]}" == "password" ]; then exit 0 else exit 1 fi |
把这个文件保存到 user-pass-auth.sh 并且记得给执行权限。
(可选)把接口自动放进VRF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash set -Eeuo pipefail # User-provided arguments VRF=$1 # Default arguments DEV=$2 TUN_MTU=$3 LINK_MTU=$4 IFCONFIG_LOCAL_IP=$5 IFCONFIG_REMOTE_IP=$6 OPERATION=$7 #echo "Device: $DEV" #echo "Args: $@" ip link set $DEV up ip link set $DEV vrf $VRF |
客户端配置
(可选)创建客户端认证证书
- 客户端创建私钥和CSR
- 把CSR传输到CA服务器上
- CA服务器签名CSR,获得证书
- 把签名的证书导入客户端
(可选)导入CA证书
- 把CA导入客户端
创建接口
1 2 |
/interface ovpn-client add name=ovpn-out-test connect-to=<server-ip-or-fqdn> port=1194 mode=ethernet user=username password=password cipher=aes256 |
如果你导入了CA证书,那么勾选Verify Server Certificate选项。如果你创建了客户端认证证书,那么需要在Certificate下拉选单中选择你的客户端证书。