Iptables在巨大的环境中pipe理

什么是从一个点来pipe理iptables的最好方法,并且能够在本地服务器上编辑某些东西。

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

我想到了与多个包括集中pipe理和包括在本地服务器上pipe理的包括bash脚本。 这是好的方法吗? 或者也许有更好的?

我们不能创buildyml2模板,因为特定主机之间的差别太大了。

请提供集中pipe理iptables的例子。

UFW

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(原来是与上面相反),否则可能会被locking在两个步骤之间。

然后,在每个angular色中,我都有针对该angular色的其他防火墙规则。 例如,在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。

这样你就可以build立你想要的任何通用configuration,并以更具体的angular色添加额外的规则。

FERM

如果你有一些无法处理的规则,我认为一个解决scheme很好的办法是ferm ; 它几乎可以做任何事情,你可以configuration它从目录读取规则,比如/etc/ferm/forward.d/等。你可以让你的commonangular色准备必要的fermconfiguration,然后让其他angular色将文件放到这些目录中。

普通的iptables

除了以另一种方式指定的规则之外,你的要求有ansible指定规则是不寻常的,而且显然违背了使用ansible大部分要点。 不幸的是,除了使用普通的iptables ,我看不出有什么办法可以做到。 这里是一个打开roles/nginx/tasks/main.yml端口80的例子(未经testing):

 - 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的处理程序。 以上所有内容都是非常繁琐的写法,但也许是适当的,特别是如果你只有一些规则来pipe理,

lineinfile

如果你想pipe理你的iptablesconfiguration中的规则而不覆盖现有的规则或者在一个模板中集中pipe理iptables,使用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 

我创build了一个angular色来pipe理具有以下function的iptables规则:

  • 支持几乎所有的iptables规则
  • 允许为特定主机添加/重写细化规则
  • 在规则中轻松注入variables
  • 允许规则sorting
  • 简单
  • 持久性(在引导时重新加载规则)

检查mikegleasonjr.firewall在可靠的星系或github上

我们为这个称为iptables_raw的模块写了一个特殊的模块,它使我们可以轻松地pipe理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