在庞大的环境中实现iptables管理


20

从一开始管理iptables并能够在本地服务器上进行编辑的最佳方法是什么。

我们需要在所有服务器上集中添加一些规则,但是我们有具有特定要求的特定服务器,这些服务器应具有自己的一组规则。

我想到了带有多个include的bash脚本,这些脚本通过ansible进行集中管理,并且包含在本地服务器上进行管理。这是好方法吗?也许还有更好的东西?

我们无法为ansible创建yml2模板,因为特定主机之间的差异太大。

请提供iptables集中管理的示例。

Answers:


24

友联

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配置,然后有其他角色在这些目录中拖拽文件。

普通iptables

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


如果我正确记住这种方法,我将无法使用ipset并创建非常特定的内容。我们在iptables中使用模块所有者。例如,我们有iptables -m owner --uid 0 -j ACCEPT。我不能在answ中将此模块与ufw一起使用,并且在本地服务器上没有ansible时也无法编辑某些内容。
Navern 2014年

确实,ufw显然无法满足您的需求。但是,当您说“如果没有本地服务器上的ansible不能编辑某些内容”时,您是什么意思?
Antonis Christofides

还有其他解决方案吗?我坚持这种情况,很难解决。总的来说,我的意思是我只需要添加ansible新规则而不破坏现有规则。不要将所有配置都存储在ansible服务器上。英语不是我的母语,所以我希望我能说清楚:)
Navern 2014年

用一些替代方法更新了我的答案。
Antonis Christofides

非常感谢您,我将对此进行调查,尤其是费姆。
Navern 2014年

12

lineinfile

如果要在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

2

我创建了一个具有以下功能的角色来管理iptables规则:

  • 支持几乎所有iptables规则
  • 允许添加/覆盖特定主机的详细规则
  • 轻松在规则中注入变量
  • 允许规则排序
  • 简单
  • 持久性(在启动时重新加载规则)

在ansible 星系github上查看mikegleasonjr.firewall


0

我们为此编写了一个名为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

我们使用以下脚本解决了这个问题:github.com/SmilingNavern/iptables
Navern '16

但是目前没有适当的文档。我可以解释它的工作原理,并在以后发布答案。
Navern '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.