说明:上篇文章对于服务端配置文件的讲解较为简单,本文中将详细解释各参数含义。
接上篇文章 手把手教你部署OpenVPN! 继续来讲解如何使用账号密码登录OpenVPN服务端!
服务端开启路由转发
##允许转发 root@openvpn:~# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf ##使其配置生效 root@openvpn:~# sysctl -p ##添加SNAT规则立即生效 root@openvpn:~# iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -j MASQUERADE' ##添加SNAT规则至开机自启 root@openvpn:~# echo 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE' >> /etc/rc.d/rc.local ##验证规则是否生效 root@openvpn:~# iptables -vnL -t nat
服务端配置文件讲解
;local a.b.c.d // "本机监听 IP" 默认为本机所有 IP port 1194 // "端口" ;proto tcp // 协议, "生产推荐使用 TCP" proto udp // 默认使用的协议 UDP ;dev tap // 创建以太网隧道设备, tap 设备实现以太网帧通过 Openvpn 隧道, 可提供非 IP 协议如 IPX 和 AppleTalk 等的支持, tap 等当于一个以太网设备, 它操作第二层数据包如以太网数据帧. dev tun // 创建 IP 路由隧道, "生产推存使用 tun" 互联网使用 tun, 一个 tun 设备大多时候被用于基于 IP 协议的通讯 tun 模拟了网络层设备, 操作第三层数据包比如 IP 数据封包. ;dev-node MyTap // TAP-Win32 的设备驱动. 非 windows 系统不需要 ca ca.crt // "CA 证书文件路径" cert server.crt // "服务器证书文件路径" key server.key // "服务器私钥文件路径" dh dh2048.pem // "DH 参数文件路径" ;topology subnet server 10.9.0.0 255.255.255.0 // "OpenVPN 客户端连接后自动分配的 IP 网段" 默认会给服务器分配此网段的第一个 IP 将做为客户端的网关, ( 注意: 不要和内网网段相同 ) ifconfig-pool-persist ipp.txt // 记录客户端和虚拟 IP 地址分配的文件, 无需配置, "建议注释" (; 该符号开头的就是注释 ) ;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 // 配置网桥模式, 无需配置, "建议注释" ;server-bridge ;push "route 192.168.10.0 255.255.255.0" // 推送给客户端的到达服务器后面网段的静态路由, 网关是服务器地址 10.8.0.1 ( 实现 VPN 客户端可以连接内网其他网段的主机 ) ;push "route 192.168.10.100 255.255.255.255" // 用 255.255.255.255 可实现只能访问内网单个主机的功能, 比如: jumpserver ;push "route 192.168.20.0 255.255.255.0" // 推送路由信息到客户端, 以允许客户端能够连接到服务器背后的其它私有网络 ;client-config-dir ccd // 为特定客户端添加路由信息, 此路由是客户端后面的网段而非服务端的网段, "无需设置" ;route 192.168.0.12 255.255.255.0 ;client-config-dir ccd ;route 10.9.0.0 255.255.255.252 ;learn-address ./script // 指定外部脚本文件, 实现创建不同组的 iptables 规则, "无需配置" ;push "redirect-gateway def1 bypass-dhcp" // 启用此配置后客户端所有流量都将通过 VPN 服务器进行转发, "因此生产一般无需配置此项" ;push "dhcp-option DNS 208.67.222.222" // 推送 DNS 服务器地址, "无需配置" ;push "dhcp-option DNS 208.67.220.220" ;client-to-client // 允许不同的客户端直接通信,不安全, "生产环境一般无需配置" ;duplicate-cn // "多个用户共用一个证书, 一般用于测试环境," ( 生产环境建议一个用户一个证书, 无需开启 ) keepalive 10 120 // 设置服务端活动的检测的间隔和超时时间, 每隔 10 秒 ping 一次, 120 秒没有回应则认为已经断线 tls-auth ta.key 0 // 访止 DoS 等攻击的安全增强配置, 服务器和每个客户端都需要拥有此密钥文件. 第二个参数在服务器端为 0, 客户端为 1 cipher AES-256-CBC // 加密算法 ;compress lz4-v2 // 启用 Openvpn2.4.X 新版压缩算法 ;push "compress lz4-v2" // 推送客户端使用新版压缩算法,和下面的comp-lzo不要同时使用 ;comp-lzo // 旧户端兼容的压缩配置,需要客户端配置开启压缩,openvpn2.4.X等新版可以不用开启 ;max-clients 100 // 最多支持的客户端数量 ;user nobody // 指定 openvpn 服务的用户 ;group nobody // 指定 openvpn 服务的组 persist-key // 重启服务时默认会重新读取key文件,开启此配置后保持使用第一次的key文件, 生产环境无需开启 persist-tun // Don’t close and reopen TUN/TAP device or run up/down scripts across SIGUSR1 or --ping-restart restarts, // 生产环境建议无需开启 status openvpn-status.log // 服务器状态记录文件,每分钟记录一次相关信息 ;log openvpn.log // 第一种日志记录方式,并指定日志路径,log会在openvpn启动的时候清空日志文件, 不建议使用 ;log-append openvpn.log // 第二种日志记录方式,并指定日志路径,重启openvpn后在之前的日志后面追加新的日志,生产环境建议使用 verb 3 // 设置日志级别,0-9,级别越高记录的内容越详细,0 表示静默运行,只记录致命错误,4 表示合理的常规用法,5 和 6 可以帮助调试连接错误。9 表示极度冗余,输出非常详细的日志信息 ;mute 20 // 对相同类别的信息只记录前20条到日志文件中 explicit-exit-notify 1 // 当服务端重启后通知客户端自动重新连接服务器, 此项配置仅能用于udp模式, tcp 模式无需配置即能实现重新连接功能, 且开启此项后tcp配置后将导致openvpn服务无法启动, 所以 tcp 时必须不能开启此项 script-security 3 // 允许使用自定义脚本 auth-user-pass-verify /usr/local/openvpn/checkpsw.sh via-env // 指定用户认证脚本 username-as-common-name // 开启用户密码验证 client-cert-not-required // 只支持用户和密码方式验证,不支持证书,无此配置表示需要证书和用户密码多种验证 ;verify-client-cert none //表示不需要证书认证
注意:配置文件中相关文件路径和IP、端口以自己部署为准,文中只作为参考!
用户认证脚本(OpenVpn官网提供)
root@openvpn:~# vim /usr/local/openvpn/checkpsw.sh #!/bin/sh ########################################################### # checkpsw.sh (C) 2004 Mathias Sundman # 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/psw-file" LOG_FILE="/etc/openvpn/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 ##脚本添加可执行权限 root@openvpn:~# chmod 755 /usr/local/openvpn/checkpsw.sh
密码文件
#添加编辑密码文件 vim /usr/local/openvpn/psw-file zhangsan 20240921 lisi 20240920 tom 888888 #前面为用户名,后面为密码。 中间使用空格分开!
上面步骤全都完成之后服务端重启OpenVPN!使其配置生效~
win客户端登录
客户端配置文件修改为账号密码登录:
client dev tun proto tcp remote 公网IP 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cipher AES-256-CBC comp-lzo verb 3 auth-user-pass #使用用户名密码登录openvpn服务器 auth-nocache
番外:ca.crt写入到客户端配置文件中
client dev tun proto tcp remote 公网IP 1194 resolv-retry infinite nobind persist-key persist-tun <ca> -----BEGIN CERTIFICATE----- MIIDNTCCAh2gAwIBAgIJAJn8QBQqDhwqMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNV BAMMC0Vhc3ktUlNBIENBMB4XDTIzMDMyNjExMzEwNVoXDTMzMDMyMzExMzEwNVow FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDM+jOOUMSZvz+4zODX/sMbZnqQKWf63UGYl8eJ8boXt605BBa3C4Tq a2yhTvUZEjxK3jzz9jLJFBJXFUtRjBXhxoa6pcp3qV5IUh7PJ5JsoReVUnBPj7Xs bh7BFUobZHXAgmNe7dLiOFQ4O6En4aWTRmTPqCMhAiNxtYm5SJ0R65y8vJUCQqgV cL+ZnWAXm042t2FrcTIPkOvDNa9mDkg/jeB3eHQKjTSV5wM+ioSQ78dlODSfN4ly 3vjelqYRUZKwalwIZM4bc3PuocDUidFxzbNLRXHLLqnE0MgldcTGG350rC/azJ6r U9qDpmWdgNn4aOGTvjIz0p8E0p3kk5c9AgMBAAGjgYUwgYIwDAYDVR0TBAUwAwEB /zAdBgNVHQ4EFgQUmOswib9VomrtOyTtXJ/jSv/eTjIwRgYDVR0jBD8wPYAUmOsw ib9VomrtOyTtXJ/jSv/eTjKhGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBggkA mfxAFCoOHCowCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCKY4QVn9L8 qZJdvqouYekcZxsXqQN2gutKt0hm7pNNnhu9S/t0KIzmOX6QHkS6AA7WALfIhZy1 4wCwCSLNn3YF5a7h78NENO9S2EmkDwPPZQ/a6dXYeuAX0sHJzKo7iSSxKlbFzPGk zL9oLQHsD083nxUIGbdIdR9dqW92PD7PasJvJCBSnOpGhYhprfP+d5G/GByc/cMZ Zr0IpLIabzg8NipnabU20aQvIIwfPFmzBoMw7FHnutEy/rxf3Vt3Moo60V+BNdQ/ kj/2Isi+hxa46jsJ0ogpQYttlMpR/nBlX8WYzkbVsXnBxt5oee7ZJHyB/C6JhE0Y x+FzN62BgVW7 -----END CERTIFICATE----- </ca> cipher AES-256-CBC comp-lzo verb 3 auth-user-pass #使用用户名密码登录openvpn服务器 auth-nocache
账号密码连接测试
在运行客户端OpenVPN GUI后点击连接会提示输入账号密码
客户端使用证书登录
注意:将从服务端下载下来的客户端配置文件放置于客户端config目录下(上篇文章有讲解,可跳转至 手把手教你部署OpenVPN 查看)
client dev tun proto tcp remote 公网ipxxx.xxx.xxx.xxx 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key remote-cert-tls server cipher AES-256-CBC comp-lzo verb 3
无需账号密码就可以直接登录!!!