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地址
 - 用户名
 
auth-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 安全限制
