我的服务器设置为需要端口碰撞,以便将端口 22 SSH 的 IP 列入白名单。我找到了有关设置 Ansible playbook 以在服务器端配置端口碰撞的指南,但不在客户端执行端口碰撞。
例如,如果我需要敲端口 9999、9000,然后连接到端口 22 以便运行我的 Ansible 任务,我的剧本和/或清单文件会是什么样子?
您可以尝试我的ssh_pkn连接插件。
# Example host definition:
# [pkn]
# myserver ansible_host=my.server.at.example.com
# [pkn:vars]
# ansible_connection=ssh_pkn
# knock_ports=[8000,9000]
# knock_delay=2
我已经使用了https://stackoverflow.com/a/42647902/10191134,直到它在ansible更新中崩溃,所以我寻找另一个解决方案,最后偶然发现了wait_for:
主持人:
[myserver]
knock_ports=[123,333,444]
播放:
- name: Port knocking
wait_for:
port: "{{ item }}"
delay: 0
connect_timeout: 1
state: stopped
host: "{{ inventory_hostname }}"
connection: local
become: no
with_items: "{{ knock_ports }}"
when: knock_ports is defined
ofc 可以调整,使延迟和/或超时也可以在主机中配置。
这是一个暴力破解的例子。将会遇到超时,因此这会为每个主机增加 2 秒的播放时间。
- hosts: all
connection: local
tasks:
- uri:
url: "http://{{ansible_host}}:9999"
timeout: 1
ignore_errors: yes
- uri:
url: "http://{{ansible_host}}:9000"
timeout: 1
ignore_errors: yes
- hosts: all
# your normal plays here
其他方法:使用
telnet
,在 Ansible 周围放置一个包装器(尽管 在 Ansible2 中不推荐),创建一个角色,然后包含在 meta
中,编写一个自定义模块(并将其拉回到Ansible 本身)。