OpenVPN 安全限制
前面我们介绍了 OpenVPN 使用 Google 两步认证 ,虽然实现动态密码的验证, 但三层、四层安全限制还不支持, 最后结果链接进来之后,可以扫描内网任何资源。
本篇文章介绍如何针对不同用户使用不同安全规则。
修改服务端 OpenVPN 配置
添加 learn-address 参数
--learn-address cmd
Run script or shell command cmd to validate client virtual addresses or routes.
cmd will be executed with 3 parameters:
[1] operation -- "add", "update", or "delete" based on whether or not the address is being added to, modified, or deleted from OpenVPN's internal routing table.
[2] address -- The address being learned or unlearned. This can be an IPv4 address such as "198.162.10.14", an IPv4 subnet such as "198.162.10.0/24", or an ethernet MAC address (when --dev tap is being used) such as "00:FF:01:02:03:04".
[3] common name -- The common name on the certificate associated with the client linked to this address. Only present for "add" or "update" operations, not
"delete".
链接成功后会传递 3 个值
- 添加、删除还是更新
- OpenVPN 分配的 IP地址
- 用户名
a
uth-user-pass-verify /root/auth.py via-file learn-address /root/learn-address.py push "route 192.168.100.0 255.255.254.0" # 部门1 push "route 192.168.108.0 255.255.255.0" # 部门2 push "route 192.168.109.0 255.255.255.0" # 部门3 server 192.168.253.0 255.255.255.0 # OpenVPN 分配给用户的网段
- 由于内部原因,不能直接把内网地址分配给 OpenVPN用户, 所以OpenVPN使用NAT模式。
- 客户端连接后会自动添加 192.168.100.0/23,192.168.108.0/24,192.168.109.0/24 路由, 可以连接所有网络。
但此时 192.168.108.50 和 192.168.109.53 不希望所有人访问, 或着说只允许某些用户访问。
1.在 192.168.108.50 和 192.168.109.53 直接限制 OpenVPN 服务端地址, 但结果所有OpenVPN用户都无法连接,不符合我们需求。
2.在 OpenVPN 服务器上限制,根据不同用户开放或禁止相应权限。
更新授权表
只允许 admin 用户连接 192.168.108.50, 192.168.109.53,
最后一定要 -j DROP 所有请求。
import sys
import os
import MySQLdb
if len(sys.argv) != 4 and len(sys.argv) !=3:
sys.exit(3)
action = sys.argv[1]
ipaddr = sys.argv[2]
user = sys.argv[3]
# 连接数据库
# xxx
env = os.environ
"""
{
route_netmask_1: 255.255.255.0,
trusted_ip: 61.61.61.133,
link_mtu: 1544,
daemon_start_time: 1545044424,
dev: tuntcp443,
common_name: sina,
time_ascii: ThuNov2317: 35: 352017,
ifconfig_remote: 192.168.253.2,
...
...
...
}
"""
if action == 'add':
iptable_rule = []
# 1. 从数据库获取 user iptables 规则,
# 2. 调用系统命令添加 iptable 规则, 因为走的 NAT 模式, 添加到 FORWARD 链上
# 添加新的链
cmdNew = "iptables -N vpn_%s && iptables -I FORWARD -s %s -g vpn_%s" %(ipaddr, ipaddr, ipaddr)
# 执行 cmdNew
# 加载用户规则
for i in iptable_rule:
cmd = "iptable -I vpn_%s -s %s %s " %(ipaddr, ipaddr, i)
# 执行 cmd 命令
cmdDrop = "iptable -A vpn_%s -j DROP" %(ipaddr) # 默认禁止所有
# 执行 cmdDrop 命令
# ...
# ...
elif action == 'delete':
pass
elif action == 'update':
pass
else
sys.exit(4)
os.environ 有很多有用的信息
转载请注明:爱开源 » OpenVPN 安全限制