相关文章推荐
耍酷的铁链  ·  python笔记74- yaml ...·  2 年前    · 
考研的松树  ·  pycharm中出现module ...·  2 年前    · 

OpenVPN高级进阶

OpenVPN服务是一个比较老的服务了,但是作为一个核心的基础服务我觉得还是有必要认真仔细的掌握和理解,并且能根据其自身的功能优化和配置出我们需要的场景,只要能解决实际的问题场景,对我们来说就是有价值的,下面通过几个场景聊一下OpeVPN的高阶配置选项:
  • 公司内部网段是 192.168.99.0/24
  • 所有人 允许访问反向代理主机为 192.168.99.130 ,但不能访问其他服务器;
  • 特定的用户 允许访问 数据库服务器 192.168.99.131 ,不能访问其他服务器;
  • 管理员 能访问 所有公司内网服务器
  • 场景1 限制主机访问

    我们不需要 VPN客户端 访问 VPN服务端 所在集群中的 所有其他主机 ,允许某些特定的VPN客户端访问指定的内网主机资源的时候,我们需要在客户端无感知的情况下对VPN服务端做一些设置满足以上场景:

    更新服务端的配置,将VPN地址池的网段划分为 管理员 网段、 客户组 网段、 普通 网络:

    # 在Openvpn服务端配置文件server.conf增加:
    #10.8.0.0是给所有VPN客户端的IP段;
    server 10.8.0.0 255.255.255.0
    #10.8.1.0是给管理员分配的IP段;
    server 10.8.1.0 255.255.255.0
    #10.8.2.0就是给特定用户组分配的IP段;
    server 10.8.2.0 255.255.255.0
    #下面是定义服务器读取特殊客户端配置文件的目录为ccd,ccd是与Openvpn服务端配置文件同级目录中的ccd目录
    client-config-dir ccd
    

    然后给管理员配置访问网络

    cat ccd/sysadmin1
    ifconfig-push 10.8.1.1 10.8.1.2
    

    客户组网络:

    cat ccd/kehugroup
    ifconfig-push 10.8.2.1 10.8.2.2
    

    这里需要注意的是, ccd目录下的文件名就是用户的Common Name,OpenVPN是根据该名称来获得指定客户端的,客户端的IP地址不是任意指定的,由于Windows的TAP驱动必须采用/30网段的IP,为兼容该协议,应从特定的IP地址中选择,而且是成组出现的。

    最后在完成网络的划分之后,在OpenVPN端进行Iptables限制:

    iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 192.168.99.130 -j ACCEPT
    iptables -A FORWARD -i tun0 -s 10.8.1.0/24 -d 192.168.99.0/24 -j ACCEPT
    iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 192.168.99.131 -j ACCEPT
    

    场景2 打通OpenVPN客户端与服务端的内网

    #让所有客户端都增加到内网192.168.99.0/24的路由
    push "route 192.168.99.0 255.255.255.0"
    # 让所有的客户端都能访问仅允许服务端访问的网站(约束白名单)
    push "route 39.156.69.79 255.255.255.255"
    # 向客户端推送增加访问服务端子网的192.168.10.0/24的路由,注意服务端的IP是否是子网的网关,否则需要在子网网关处添加到达192.168.99.0的路由(客户端也是如此)
    push "route 192.168.10.0 255.255.255.0"
    在子网网关处添加路由
    
    route add -net 192.168.99.0 mask 255.255.255.0 gw 192.168.10.254 dev ens160
    

    场景3 OpenVPN提供DHCP与DNS

    OpenVPN内部提供了DHCP的服务,而不需要依赖外部的DHCP服务器。同样,也提供了DHCP服务的一些配置参数
    # openvpn服务端的配置
    #定义客户端的DNS服务器地址
    push "dhcp-option DNS 114.114.114.114" # 这是首选DNS
    push "dhcp-option DNS 8.8.8.8" # 这是备选DNS
    #定义客户端的WINS服务器地址
    push "dhcp-options WINS 192.168.228.1" # 这是设置IP和主机名之间的映射与IP和域名之间的映射不同,较少使用
    #让客户端发起的所有IP请求都通过OpenVPN服务器,可用于全局代理使用,启用后会出现浏览器内打不开网站等情况
    push "redirect-gateway def1 bypass-dhcp"
    

    场景4 添加LDAP认证

    通常情况下,OpenVPN客户端都需要通过SSL连接的,因此客户端必须要有ca证书,服务端可以通过设置client-cert-not-required让客户端不配置证书。但是一般通过OpenLDAP认证是最方便的事情:
  • 安装LDAP`模块的配置
  • yum install openvpn-auth-ldap -y
    [root@vpn ~]# ls -al /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so
    -rwxr-xr-x 1 root root 133320 Sep  6  2020 /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so
     	
  • 准备ldap认证的配置文件/etc/openvpn/auth/ldap.conf
  • mkdir -p /etc/openvpn/auth
    cd $_ && touch ldap.conf
    下面是ldap.conf的配置文件
    
    [root@vpn ~]# cat /etc/openvpn/auth/ldap.conf
        # LDAP server URL
        URL     ldap://192.168.99.130
        # Bind DN (If your LDAP server doesn't support anonymous binds)
        BindDN      cn=openvpn,dc=openldap,dc=kubemaster,dc=top
        Password    openvpnuserpasswd
        # Network timeout (in seconds)
        Timeout     15
        # Enable Start TLS
        #TLSEnable  no
        # Follow LDAP Referrals (anonymously)
        #FollowReferrals no
        # TLS CA Certificate File
        #TLSCACertFile  /usr/local/etc/ssl/ca.pem
        # TLS CA Certificate Directory
        #TLSCACertDir   /etc/ssl/certs
        # Client Certificate and key
        # If TLS client authentication is required
        #TLSCertFile    /usr/local/etc/ssl/client-cert.pem
        #TLSKeyFile /usr/local/etc/ssl/client-key.pem
        # Cipher Suite
        # The defaults are usually fine here
        # TLSCipherSuite    ALL:!ADH:@STRENGTH
    </LDAP>
    

    <Authorization>
    # Base DN
    BaseDN "ou=People,dc=openldap,dc=kubemaster,dc=top"
    # User Search Filter
    SearchFilter "(&(uid=%u))" # uid或者cn一般都可以,根据自己的条件

    # Require Group Membership
    RequireGroup    false # 是否启用组成员关系
    # Add non-group members to a PF table (disabled)
    #PFTable    ips_vpn_users
    &lt;Group&gt;
        BaseDN      "ou=Groups,dc=example,dc=com"
        SearchFilter    "(|(cn=developers)(cn=artists))"
        MemberAttribute uniqueMember
        # Add group members to a PF table (disabled)
        #PFTable    ips_vpn_eng
    &lt;/Group&gt;
    

    </Authorization>
    在完成ldap的配置之后,只需要在服务端增加以下配置即可:

    client-cert-not-required
    plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf"
    username-as-common-name
    

    这样就完成了基于openldap认证的OpenVPN客户端的用户鉴权。

  • VPN每隔10s左右会重新连接
  • 基于密码认证的VPN出现每隔10s重新连接,说明你的账号在别的设备上进行登录了。请检查是否存在改情况并建议及时的修改密码。
  • Mac上的Tunnelblick总是处于不断认证的状态
  • 出现这种情况说明你的Tunnelblick的版本太低,需要你及时的更新该软件的版本,就可以解决,TunnelBlick下载地址

  • Window上使用OpenVPN客户端连接时出现SSL ERROR
  • 出现这种问题说明你的Window上的OpenVPN客户端版本太低,需要重新下载客户端并且使用管理员身份安装和启动。
  • Window上使用OpenVPN客户端连接时出现windows route add command failed
  • 出现这种问题,属于打开VPN客户端的时候没有使用管理员身份打开,没有添加路由的权限。
  • 使用OpenVPN连接出现身份验证失败
  • 出现这种问题,这是属于你的用户名或者密码填写错误,认真检查账户信息或者找相关技术负责人重新修改密码。