最新消息:

OpenVPN 安全限制

iptables admin 5992浏览 0评论

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 个值

  1. 添加、删除还是更新
  2. OpenVPN 分配的 IP地址
  3. 用户名

Reference manual for OpenVPN 2.2

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 所有请求。

/root/learn-address.py 伪代码

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 安全限制

您必须 登录 才能发表评论!