bwinfosec.openvpn

待办事项: 更新此README,以反映bwinfosec分支中的更改。

OpenVPN

Github Actions(PRs和主线): Github CI

Travis CI(实际启动openvpn): 构建状态

此角色安装OpenVPN,配置它作为服务器,设置网络和防火墙(主要是firewalld,ufw和iptables是尽力而为),并且可以选择创建客户端证书。

CI构建中的操作系统:

  • Fedora 32+
  • CentOS 7和8

注意:我在这个仓库中向您提供代码,适用开放源代码许可证。因为这是我的个人仓库,所以您获得的代码许可证来自我而不是我的雇主。

要求

OpenVPN必须作为yum/dnf/apt中的一个包可用!对于CentOS用户,此角色将运行yum install epel-release以确保OpenVPN可用。

Ubuntu precise有一个奇怪的错误,可能会导致iptables-persistent安装失败。有一个解决方法

Ansible 2.10及更高版本

随着Ansible 2.10的发布,模块已被移入集合中。除了ansible.builtin模块之外,这意味着必须安装其他集合以使用像seboolean(现在是ansible.posix.seboolean)这样的模块。现在需要这个集合:ansible.posix,如果使用ufw,还需要这个集合:community.general。安装这些集合:

ansible-galaxy collection install ansible.posix
ansible-galaxy collection install community.general

支持说明/期望

我个人用此角色管理CentOS 8上的OpenVPN。我尽力保持该平台的角色在默认配置下完全正常运行。 请理解我是一个人,有一份全职工作和其他承诺。

对于任何问题的响应将以尽力为原则,包括我可能完全不回复的可能性。 因使用非默认值(包括任何重大社区贡献)而产生的问题将优先级较低。

主要的社区贡献:

  • 撤销证书的功能
  • 所有的LDAP支持

角色变量

角色选项

这些选项改变角色的工作方式。以下是具体的选项组。

变量 类型 选择 默认值 注释
clients 列表 [] 要添加到OpenVPN的客户端列表
openvpn_base_dir 字符串 /etc/openvpn OpenVPN配置将存储的路径
openvpn_client_config_no_log 布尔值 true, false true 防止将客户端配置文件记录到Ansible的stdout中
openvpn_key_dir 字符串 /etc/openvpn/keys 存储服务器私钥和CA的路径
openvpn_ovpn_dir 字符串 /etc/openvpn 存储客户端配置的路径
openvpn_revoke_these_certs 列表 [] 要撤销的客户端证书列表。
openvpn_selinux_module 字符串 my-openvpn-server 设置SELinux模块名称
openvpn_service_name 字符串 openvpn 服务名称。用于systemctl启动服务
openvpn_sync_certs 布尔值 true, false false 撤销未明确在'clients'中定义的证书
openvpn_uninstall 布尔值 true, false false 设置为true以卸载OpenVPN服务
openvpn_use_ldap 布尔值 true, false false 启用LDAP后端进行身份验证。客户端证书不再需要

配置获取

如果需要调整配置文件下载到本地系统的方式,请更改以下选项

变量 类型 选择 默认值 注释
openvpn_fetch_client_configs 布尔值 true, false true 下载生成的客户端配置到本地系统
openvpn_fetch_client_configs_dir 字符串 /tmp/ansible 如果openvpn_fetch_client_configs为true,下载客户端配置文件的本地目录
openvpn_fetch_client_configs_suffix 字符串 "" 如果openvpn_fetch_client_configs为true,下载的客户端配置文件在末尾添加的后缀

防火墙

如果需要强制使用特定防火墙或改变剧本与防火墙的交互方式,请更改以下选项。

变量 类型 选择 默认值 注释
firewalld_default_interface_zone 字符串 public firewalld区域将允许“ansible_default_ipv4.interface”的推送
iptables_service 字符串 iptables 覆盖iptables服务名称
manage_firewall_rules 布尔值 true, false true 允许剧本管理iptables
openvpn_firewall 字符串 auto, firewalld, ufw, iptables auto 配置网络规则的防火墙软件。“auto”将通过检查系统来尝试检测它
openvpn_masquerade_not_snat 布尔值 true, false false 如果要设置MASQUERADE而不是iptables中的默认SNAT,请设置为true。

OpenVPN配置选项

这些选项改变OpenVPN本身的工作方式。

网络

变量 类型 选择 默认值 注释
openvpn_client_register_dns 布尔值 true, false true 在客户端配置中添加register-dns选项(仅适用于Windows)。
openvpn_client_to_client 布尔值 true, false false 如果希望客户端相互访问,请设置为true。
openvpn_custom_dns 列表[string] [] DNS服务器列表,仅在openvpn_set_dns设置为true时应用
openvpn_dualstack 布尔值 true 是否使用双栈(IPv4 + v6)套接字
openvpn_keepalive_ping 整数 5 设置keepalive ping间隔秒数。
openvpn_keepalive_timeout 整数 30 设置keepalive超时时间秒数
openvpn_local 字符串 unset 用于绑定的本地主机名或IP地址。如果指定,OpenVPN将仅绑定到此地址。如果未指定,OpenVPN将绑定到所有接口。
openvpn_port 整数 1194 您希望OpenVPN运行的端口。如果不同服务器上的端口不同,建议您在清单文件中设置端口。
openvpn_proto 字符串 udp, tcp udp 您希望OpenVPN使用的协议
openvpn_redirect_gateway 布尔值 true, false true 推送OpenVPN网关
openvpn_resolv_retry 整数/字符串 任意整数, infinite 5 主机名解析失败重试秒数。将“infinite”设置为在连接不良或笔记本电脑休眠模式恢复等情况下无限期重试。
openvpn_server_hostname 字符串 {{ inventory_hostname }} 要在客户端配置文件中放置的服务器名称
openvpn_server_ipv6_network 字符串 unset 如果设置,分配给客户端的IPv6网络的网络地址和前缀。如果True,同时也使用IPv4。
openvpn_server_netmask 字符串 255.255.255.0 私有网络的网络掩码
openvpn_server_network 字符串 10.9.0.0 OpenVPN服务使用的私有网络
openvpn_set_dns 布尔值 true, false true 将DNS推送到客户端(Cloudflare和Google)
openvpn_tun_mtu 整数 unset 设置tun-mtu值。为空则为默认值。

安全性

变量 类型 选择 默认值 注释
openvpn_auth_alg 字符串 SHA256 设置auth认证算法。
openvpn_ca_key 字典 unset 包含“crt”和“key”。如果未设置,将在目标系统上自动生成CA证书和密钥。
openvpn_cipher 字符串 AES-256-CBC 设置服务器和客户端的cipher选项。
openvpn_crl_path 字符串 unset 定义用于服务器撤销检查的CRL文件的路径。
openvpn_duplicate_cn 布尔值 true, false false 在服务器配置中添加duplicate-cn选项 - 这允许客户端使用同一个密钥连接多次。注意:客户端的IP地址将不再是静态的!
openvpn_rsa_bits 整数 2048 用于保护生成证书的位数
openvpn_script_security 整数 1 设置openvpn脚本安全选项
openvpn_tls_auth_key 字符串 unset 单个项目,具有预生成的TLS身份验证密钥。
openvpn_use_crl 布尔值 true, false false 配置OpenVPN服务器以遵守证书撤销列表。
openvpn_use_hardened_tls 布尔值 true, false true 要求最低TLS版本为1.2
openvpn_use_modern_tls 布尔值 true, false true 使用现代加密的TLS(不推荐与OpenVPN 2.4一起使用)
openvpn_use_pregenerated_dh_params 布尔值 true, false false DH参数默认情况下由安装生成
openvpn_verify_cn 布尔值 true, false false 检查证书的CN是否与FQDN匹配
tls_auth_required 布尔值 true, false true 要求客户端在连接期间推送服务器生成的ta.key

操作

变量 类型 选择 默认值 注释
openvpn_addl_client_options 列表 empty 用户定义的客户端选项列表,这些选项在客户端模板中尚未存在。(例如- mssfix 1400
openvpn_addl_server_options 列表 empty 用户定义的服务器选项列表,这些选项在服务器模板中尚未存在。(例如- ping-timer-rem
openvpn_compression 字符串 lzo 设置compress压缩选项。为空则不压缩。
openvpn_config_file 字符串 openvpn_{{ openvpn_proto }}_{{ openvpn_port }} 您要使用的配置文件名称(在vars/main.yml中设置)
openvpn_enable_management 布尔值 true, false false
openvpn_ifconfig_pool_persist_file 字符串 ipp.txt
openvpn_management_bind 字符串 /var/run/openvpn/management unix 要绑定的管理接口。可以是unix或TCP套接字。
openvpn_management_client_user 字符串 root 使用此用户在管理接口中使用Unix套接字。
openvpn_push 列表 empty 在配置文件中插入的字符串列表作为push ""。例如- route 10.20.30.0 255.255.255.0将生成push "route 10.20.30.0 255.255.255.0"
openvpn_script_client_connect 字符串 unset 您的openvpn客户端连接脚本的路径
openvpn_script_client_disconnect 字符串 unset 您的openvpn客户端断开脚本的路径
openvpn_script_down 字符串 unset 您的openvpn下线脚本的路径
openvpn_script_up 字符串 unset 您的openvpn上线脚本的路径
openvpn_service_group 字符串 nogroup 设置openvpn服务组。
openvpn_service_user 字符串 nobody 设置openvpn服务用户。
openvpn_status_version 整数 1, 2, 3 1 定义openvpn-status.log文件的格式,其中列出当前客户端连接
openvpn_topology 字符串 unset "topology"关键字将在服务器配置中设置为指定的值。

OpenVPN自定义客户端配置(服务器推送)

变量 类型 选择 默认值 注释
openvpn_client_config 布尔值 false 设置为true以启用客户端配置目录
openvpn_client_config_dir 字符串 ccd client-config-dir的路径
openvpn_client_configs 字典 {} 自定义客户端配置的设置字典

Logrotate

设置您自己的自定义logrotate选项

变量 类型 选择 默认值 注释
openvpn_log_dir 字符串 /var/log 设置OpenVPN日志文件的位置。此参数是log-append配置值的一部分。
openvpn_log_file 字符串 openvpn.log 设置日志文件名。此参数是log-append配置值的一部分。
openvpn_logrotate_config 字符串 rotate 4
weekly
missingok
notifempty
sharedscripts
copytruncate
delaycompress
配置logrotate脚本。

打包

此角色拉入许多不同的软件包。根据需要重写名称。

变量 类型 选择 默认值 注释
epel_package_name 字符串 epel-release 从包管理器安装的epel-release包的名称
iptables_persistent_package_name 字符串 iptables-persistent 从包管理器安装的iptables-persistent包的名称
iptables_services_package_name 字符串 iptables-services 从包管理器安装的iptables-services包的名称
openssl_package_name 字符串 openssl 从包管理器安装的openssl包的名称
openvpn_ldap_plugin_package_name 字符串 openvpn-auth-ldap 从包管理器安装的openvpn-auth-ldap包的名称
openvpn_package_name 字符串 openvpn 从包管理器安装的openvpn包的名称
python_firewall_package_name 字符串 python-firewall 从包管理器安装的python-firewall包的名称

LDAP对象

变量 类型 选择 默认值 注释
ldap 字典 包含LDAP配置的字典
url 字符串 ldap://host.example.com LDAP后端的地址,语法为ldap[s]://host[:port]
anonymous_bind 字符串 False , True False 这不是Ansible布尔值,而是一个将被推送到配置文件中的字符串。
bind_dn 字符串 uid=Manager,ou=People,dc=example,dc=com 如果"anonymous_bind"设置为"False"使用的绑定DN
bind_password 字符串 mysecretpassword bind_dn用户的密码
tls_enable 字符串 true , no no 强制TLS加密。ldap地址不需要
tls_ca_cert_file 字符串 /etc/openvpn/auth/ca.pem CA ldap后端的路径。必须在此之前推送
tls_cert_file 字符串 客户端身份验证证书的路径
tls_key_file 字符串 客户端身份验证密钥的路径
base_dn 字符串 ou=People,dc=example,dc=com 后端查找有效用户的基础DN
search_filter 字符串 (&(uid=%u)(accountStatus=active)) ldap搜索的过滤器
require_group 字符串 False , True 这不是Ansible布尔值,而是将被推送到配置文件的字符串。
group_base_dn 字符串 ou=Groups,dc=example,dc=com 确定要查找的组。如果设置为"True",则是必需的。
group_search_filter 字符串 ((cn=developers)(cn=artists)) 确定有效组
verify_client_cert 字符串 none , optional , require client-cert-not-required 在OpenVPN 2.4中,client-cert-not-required已弃用。改用verify-client-cert

依赖项

不依赖其他任何角色

示例剧本

- hosts: vpn
  gather_facts: true
  roles:
    - role: kyl191.openvpn
      openvpn_port: 4300
      openvpn_sync_certs: true
      clients:
        - client1
        - client2

注意: 由于角色需要知道远程使用的平台(32位或64位),您必须在剧本中将gather_facts设置为true

许可证

MIT

作者信息

编写者:Kyle Lexmond

关于项目

Ansible role to install and configure openvpn.

安装
ansible-galaxy install bwinfosec.openvpn
许可证
eupl-1.2
下载
19.5k
拥有者
The universities in the state of Baden-Württemberg have joined forces to form the bwInfoSec federation in order to jointly improve information security.