如何配置OpenVPN实现站点专属访问及限制用户仅访问指定站点?
实现仅OpenVPN访问Moodle站点+限制客户端流量的方案
一、调整OpenVPN服务器核心配置
先把OpenVPN改成路由模式,给客户端分配独立子网(比如10.8.0.0/24),然后修改服务器配置文件(一般是/etc/openvpn/server.conf):
- 添加
push "route 你的Moodle站点IP 255.255.255.255":只让客户端访问这个站点时走VPN,别加默认网关推送的配置,不然客户端所有流量都走VPN - 关掉
client-to-client:防止学生之间通过VPN互相通信 - 用证书认证代替用户名密码:给每个学生发唯一的客户端证书,每个证书的CN(通用名称)设成唯一标识(比如学号)
二、用防火墙锁死客户端流量
这是最关键的一步,确保VPN客户端只能碰你的Moodle站点,以DigitalOcean常用的ufw为例:
- 先放行OpenVPN的端口:
ufw allow 1194/udp - 只允许VPN子网访问Moodle的80/443端口:
ufw allow in on tun0 to 你的Moodle站点IP port 80,443 - 直接拒绝VPN客户端的其他所有出站请求:
ufw deny out on tun0 from 10.8.0.0/24 to any - 记得打开ufw的转发功能:编辑
/etc/default/ufw,把DEFAULT_FORWARD_POLICY改成"ACCEPT",然后重启ufw
如果用iptables的话,命令是:
# 放行OpenVPN端口 iptables -A INPUT -p udp --dport 1194 -j ACCEPT # 允许VPN到Moodle的HTTP/HTTPS流量 iptables -A FORWARD -i tun0 -o eth0 -d 你的Moodle站点IP -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -i tun0 -o eth0 -d 你的Moodle站点IP -p tcp --dport 443 -j ACCEPT # 拒绝其他所有VPN出站流量 iptables -A FORWARD -i tun0 -o eth0 -j DROP # 保存规则 iptables-save > /etc/iptables/rules.v4
三、给Moodle加访问白名单
确保只有VPN客户端能访问Moodle,直接访问的都拦掉:
- 如果用Nginx,在站点的server块里加:
allow 10.8.0.0/24; deny all; - 如果用Apache,在VirtualHost或者.htaccess里加:
Require ip 10.8.0.0/24
四、解决并发连接问题(替代blockconcurrent)
之前的blockconcurrent connection不好用,换这两个方法:
- 服务器配置里加
duplicate-cn 0:同一个证书不能同时连多个设备,直接阻止并发 - 加个监控脚本踢重复连接:
写个bash脚本,定时检查OpenVPN状态日志,发现同一个CN的多个连接就踢掉旧的:
把脚本存成#!/bin/bash LOG_FILE="/var/log/openvpn/openvpn-status.log" # 找出重复的CN awk '/^CLIENT_LIST/ {print $3}' $LOG_FILE | sort | uniq -d | while read cn; do # 获取该CN的所有连接进程ID PIDS=$(ps aux | grep openvpn | grep "$cn" | awk '{print $2}') # 保留最新的一个进程,杀掉其他的 LAST_PID=$(echo "$PIDS" | tail -n1) echo "$PIDS" | grep -v "$LAST_PID" | xargs kill -SIGUSR1 done/usr/local/bin/kill_duplicate_vpn.sh,加执行权限,然后用crontab设成每分钟跑一次:* * * * * /usr/local/bin/kill_duplicate_vpn.sh >> /var/log/vpn_duplicate_kill.log 2>&1
五、额外防作弊补充
- 客户端配置里加
route-nopull:防止学生手动修改路由绕过限制,服务器强制推送唯一的Moodle站点路由 - Moodle里开IP锁定:设置用户只能从
10.8.0.0/24子网登录,就算证书被共享也没法用 - 定期查VPN日志:看看有没有异常的连接记录,比如同一个CN频繁换设备的,及时处理
内容的提问来源于stack exchange,提问作者Balya Rochmadi
相关产品推荐
相关产品推荐

