ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 控制VPN用户的访问

控制VPN用户的访问

原创 Linux操作系统 作者:nginx_web 时间:2012-06-11 18:22:14 0 删除 编辑

包过滤文件格式

 

    有关包过滤文件的格式,可以参考“管理OpenVPN”部分,但是在这里还是有必要再次提一下这个文件的格式:

 

[CLIENTS DROP|ACCEPT]

{+|-}common_name1

{+|-}common_name2

 . . .

[SUBNETS DROP|ACCEPT]

{+|-}subnet1

{+|-}subnet2

 . . .

[END]

   

    过滤文件中的所有行都必须没有前导空格,就是所谓的“顶格写”,文件的结尾必须有[END]字符串。

 

限制对象

 

    从这个配置文件的格式中能够看到限制的对象分为两类:

 

u       限制common name,即客户端间的访问;

 

u       限制对后端机器的访问,即VPN的真正对象;

 

过滤文件语法

 

    过滤文件的书写格式比较简单,概括为以下:

 

u       CLIENTS部分用于定义common name

 

u       SUBNETS部分用于定义IP地址、IP网段;

 

u       DROP|ACCEPT用于设置默认规则,就是没有明确指明的common name,那么他们将会使用;

 

u       {+|-}用于设置是否允许,如果是“+”,那么表示允许,如果是“-”则表示不允许;

 

u       [END]表示策略文件的结束。

 

 

    例如:

 

[root@slave pf]# cat client2.pf

[CLIENTS ACCEPT]

-client3

[SUBNETS ACCEPT]

-192.168.9.7

+192.168.9.0/24

[END]

   

    在这个配置中,我们的规则是要求client2用户不能和client3连接(或者称为互访),同时限制client2用户不能访问后面的192.168.9.7这个IP所在的主机。

 

    对规则修改,在某些用户的过滤文件被修改后不需要重启OpenVPN服务器,更新的规则在客户端登录时就可以生效,为了让这些用户的规则及时生效,那么可以通过管理控制台将该用户“踢掉”,让其重新登录就是了。

 

配置OpenVPN服务器

 

    下面是一个正在使用的OpenVPN配置文件:

 

[root@slave pf]# cat /usr/local/openvpn-2.2.2/etc/server.conf

local 192.168.3.199

port 1194 

proto tcp  

dev tun 

ca /usr/local/openvpn-2.2.2/keys/ca.crt  

cert /usr/local/openvpn-2.2.2/keys/server.crt  

key /usr/local/openvpn-2.2.2/keys/server.key   

dh  /usr/local/openvpn-2.2.2/keys/dh1024.pem  

 

auth-user-pass-verify /usr/local/openvpn-2.2.2/sbin/checkpsw.sh via-env

script-security 3 system

 

server 192.168.5.0 255.255.255.0

push "route 192.168.9.0 255.255.255.0"

 

plugin /usr/local/openvpn-2.2.2/lib/minimal_pf.so

client-connect /usr/local/openvpn-2.2.2/sh/client-connect.sh

 

client-cert-not-required

username-as-common-name

duplicate-cn

 

auth-nocache

 

client-to-client  

keepalive 10 120 

comp-lzo  adaptive

persist-key  

persist-tun  

status openvpn-status.log  

verb 4

   

    正如我们看到的,有两行是没有见过的,下面来完成这两行的部署。

 

编译minimal_pf.so模块

 

    下面来编辑并编译这个模块。

 

模块的源代码

 

    下面是这个模块的源代码:

 

[root@slave ~]# mkdir minimal_pf

[root@slave ~]# cd  minimal_pf 

[root@slave minimal_pf]# vi minimal_pf.c

/* minimal_pf.c

 * ultra-minimal OpenVPN plugin to enable internal packet filter */

#include

#include

 

#include "openvpn-plugin.h"

 

/* dummy context, as we need no state */

struct plugin_context {

  int dummy;

};

 

/* Initialization function */

OPENVPN_EXPORT openvpn_plugin_handle_t openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[]) {

  struct plugin_context *context;

  /* Allocate our context */

  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));

 

  /* Which callbacks to intercept. */

  *type_mask = OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ENABLE_PF);

 

  return (openvpn_plugin_handle_t) context;

}

 

/* Worker function */

OPENVPN_EXPORT int openvpn_plugin_func_v2 (openvpn_plugin_handle_t handle,

            const int type,

            const char *argv[],

            const char *envp[],

            void *per_client_context,

            struct openvpn_plugin_string_list **return_list) {

 

  if (type == OPENVPN_PLUGIN_ENABLE_PF) {

    return OPENVPN_PLUGIN_FUNC_SUCCESS;

  } else {

    /* should not happen! */

    return OPENVPN_PLUGIN_FUNC_ERROR;

  }

}

 

/* Cleanup function */

OPENVPN_EXPORT void openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle) {

  struct plugin_context *context = (struct plugin_context *) handle;

  free (context);

}

   

    如果在这里看的不是很清楚,那么可以去本部分一开始说的那个网址去查看。

 

编译模块

 

    在文件的目录下执行以下命令:

 

[root@slave minimal_pf]# INCLUDE="-I/root/openvpn-2.2.2/"

[root@slave minimal_pf]# CC_FLAGS="-O2 -Wall -g"

[root@slave minimal_pf]# NAME=minimal_pf

[root@slave minimal_pf]# gcc $CC_FLAGS -fPIC -c $INCLUDE $NAME.c &&   \

> gcc $CC_FLAGS -fPIC -shared -Wl,-soname,$NAME.so -o $NAME.so $NAME.o -lc

[root@slave minimal_pf]# ls

minimal_pf.c  minimal_pf.o  minimal_pf.so

   

    注意第一行,要根据OpenVPN所在的源代码目录指定,前面的三行用于设置变量,然后是编译,最后看到了minimal_pf.so模块,这就是需要的东西,然后将其拷贝到适当的位置:

 

[root@slave minimal_pf]# cp  minimal_pf.so  /usr/local/openvpn-2.2.2/lib/minimal_pf.so

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27043155/viewspace-732490/,如需转载,请注明出处,否则将追究法律责任。

下一篇: nginx限制流量
请登录后发表评论 登录
全部评论

注册时间:2012-06-06

  • 博文量
    54
  • 访问量
    409614