【问题标题】:IPtables management with SaltStack使用 SaltStack 管理 IPtables
【发布时间】:2018-05-28 04:42:21
【问题描述】:

我正在尝试使用 SaltStack 配置灵活的 iptables 管理解决方案,但我发现它比我想象的要难。

我的主要要求:能够有一个支柱来保存我的 IP 列表,这些 IP 应该被列入白名单,以便在所有 Minion 上进行 SSH 访问。这个 IP 列表当然会不时改变:一些 IP 被添加,一些 IP 被删除。我面临的问题是已删除的 IP - 当我从支柱文件中删除它们时,SaltStack 不会从 minions 中删除实际的白名单。

我能找到的唯一解决方法是创建一个名为“removed-ips”的新密钥,每当我想删除一个 IP 时,我都会在那里添加它。然后第二个 for 循环将删除它。当然,这是一个非常讨厌的解决方法,有更好的方法吗?

/srv/pillar/iptables-default.sls:

iptables-default:
  whitelisted-ips:
    - '55.55.55.55'
    - '66.66.66.66'
    - '77.77.77.77'
  removed-ips:
    - '88.88.88.88'

/srv/salt/iptables-default.sls:

{% for ip in salt['pillar.get']('iptables-default:whitelisted-ips') %}
Whitelist OSF IP {{ip}} for SSH access:
  iptables.append:
    - table: filter
    - family: ipv4
    - chain: INPUT
    - jump: ACCEPT
    - match: state
    - connstate: NEW
    - source: '{{ ip }}'
    - dport: 22
    - proto: tcp
    - save: True
{% endfor %}

{% for ip in salt['pillar.get']('iptables-default:removed-ips') %}
Remove old IPs that are not needed anymore:
  iptables.delete:
    - table: filter
    - family: ipv4
    - chain: INPUT
    - jump: ACCEPT
    - match: state
    - connstate: NEW
    - source: {{ ip }}
    - dport: 22
    - proto: tcp
    - save: True
{% endfor %}

【问题讨论】:

    标签: salt-stack


    【解决方案1】:

    在根据支柱数据附加规则之前刷新所有规则。因此,添加一个刷新状态,并在所有其他添加规则的状态中要求该状态 - 这确保在添加规则之前刷新运行一次。

    未经测试的示例

    flush_all_rules:
      iptables.flush:
        - table: filter
        - family: ipv4
    
    {% for ip in salt['pillar.get']('iptables-default:whitelisted-ips') %}
    Whitelist OSF IP {{ip}} for SSH access:
      iptables.append:
        - table: filter
        - family: ipv4
        # [...]
        - require:
          - iptables: flush_all_rules
    {% endfor %}
    

    【讨论】:

      【解决方案2】:

      我喜欢管理 /etc/iptables/rules.v4 和 v6,而不是使用 salt 的 iptables 状态,如下所示:

      firewall-ipv4:
        pkg.installed:
          - pkgs:
            - iptables
            - iptables-persistent
        file.managed:
          - name: /etc/iptables/rules.v4
          - source: salt://firewall/files/rules.jinja
          - template: jinja
          - context:
              slspath: {{ slspath }}
              family: ipv4
        cmd.wait:
          - name: iptables-restore rules.v4
          - cwd: /etc/iptables
          - order: last
          - watch: 
            - file: firewall-ipv4
      
      {{ similar for v6... }}
      

      其中 rules.jinja 从柱子生成规则集。这种方法的好处是当支柱规则被移除时它会做正确的事情,而不需要在每个高状态上刷新(即更改)。缺点是它不会注意到并恢复本地机器对防火墙的手动更改。

      我有一个使用技术here 的公式。忽略关于兼容性问题的自述文件,它适用于当前的盐。或者上次我检查过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多