行输入文件

行输入文件

从一个点管理 iptables 并能够在本地服务器上编辑某些内容的最佳方法是什么。

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

我考虑过使用 ansible 集中管理多个包含内容的 bash 脚本,并在本地服务器上管理包含内容。这是好方法吗?或者也许有更好的方法?

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

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

答案1

联邦快递

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/commonferm

普通的 iptables

除了以其他方式指定的规则外,您还要求指定ansible规则,这很不寻常,显然违背了使用的大部分要点ansible。不幸的是,除了使用简单的,我看不出还有其他方法可以做到这一点,这会相当丑陋。以下是在(未经测试)iptables中打开端口 80 的示例:roles/nginx/tasks/main.yml

- 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

答案2

行输入文件

如果您想要管理 iptables 配置中的规则而不覆盖现有规则或在模板中集中管理 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

答案3

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

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

查看 mikegleasonjr.firewall安西布尔星系github

答案4

我们为此编写了一个特殊模块,称为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

相关内容