bwinfosec.openvpn
待办事项: 更新此README,以反映bwinfosec分支中的更改。
OpenVPN
Github Actions(PRs和主线):
此角色安装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-galaxy install bwinfosec.openvpn