Answers:
Ansible
有一个ufw
模块可以处理防火墙规则。在roles/common/tasks/main.yml
所有服务器中都包含的中,(除其他事项外)我有:
- name: Install ufw
apt: name=ufw
- name: Allow ssh through firewall
ufw: proto=tcp port=22 rule=allow
- name: Set ufw policy
ufw: state=enabled direction=incoming policy=deny
编辑:在将默认策略设置为“拒绝”之前,有必要允许ssh(最初与上面相反),否则您可能会被锁定在两个步骤之间。
然后,在每个角色中,我都有针对该角色的其他防火墙规则。例如,在中roles/nginx/tasks/main.yml
,我(除其他事项外)具有:
- name: Allow nginx firewall
ufw: proto=tcp port=80 rule=allow
- name: Allow nginx ssl firewall
ufw: proto=tcp port=443 rule=allow
所以我所有的nginx服务器都打开了端口80和443。
这样,您可以构建所需的任何常用配置,并在更具体的角色中添加其他规则。
如果您有ufw
无法处理的规则,我认为一个不错的解决方案是ferm
;它几乎可以做任何事情,你可以配置它来读取目录等规定/etc/ferm/input.d/
,/etc/ferm/output.d/
,/etc/ferm/forward.d/
等你可以让你的common
角色做准备的基本ferm
配置,然后有其他角色在这些目录中拖拽文件。
ansible
除了以另一种方式指定的规则外,您还需要指定规则的要求是不寻常的,并且显然不符合使用的大多数要求ansible
。不幸的是,除了使用plain之外iptables
,我看不到其他任何方式可以做到这一点,这很丑陋。这是打开roles/nginx/tasks/main.yml
(未试用)端口80的示例:
- name: Check if port 80 is allowed
shell: iptables -L | grep -q "Allow http" && echo -n yes || echo -n no
register: check_allow_http
changed_when: no
always_run: yes
- name: Allow port 80
command: >
iptables -A INPUT -p tcp -m tcp --dport 80
-m comment --comment "Allow http" -j ACCEPT
when: check_allow_http.stdout == "no"
notify:
- Save iptables
Save iptables
执行的处理程序在哪里iptables-save
。以上所有内容编写起来都很繁琐,但这可能是适当的,特别是如果您只需要管理几个规则ansible
。
ufw
显然无法满足您的需求。但是,当您说“如果没有本地服务器上的ansible不能编辑某些内容”时,您是什么意思?
如果要在iptables配置中管理规则而不覆盖现有规则或在模板中集中管理iptable,请使用Ansible的lineinfile模块:
- name: ensure iptables allows established and related traffic
lineinfile:
dest=/etc/sysconfig/iptables
state=present
regexp="^.*INPUT.*ESTABLISHED,RELATED.*ACCEPT"
insertafter="^:OUTPUT " line="-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT"
backup=yes
notify: restart iptables
- name: ensure iptables is configured to allow ssh traffic (port 22/tcp)
lineinfile:
dest=/etc/sysconfig/iptables
state=present
regexp="^.*INPUT.*tcp.*22.*ACCEPT"
insertafter="^.*INPUT.*ESTABLISHED,RELATED.*ACCEPT" line="-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT"
backup=yes
notify: restart iptables
这是“重新启动iptables”处理程序:
- name: restart iptables
service: name=iptables state=restarted
我创建了一个具有以下功能的角色来管理iptables规则:
我们为此编写了一个名为iptables_raw的特殊模块,该模块使我们能够轻松管理iptables。一切都在此博客文章中进行了解释。这是如何使用模块的示例:
# Allow all IPv4 traffic coming in on port 80
- iptables_raw:
name=allow_tcp_80
rules='-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT'
# Delete the above rule
- iptables_raw:
name=allow_tcp_80
state=absent