2017-12-14 6 views
1

私はSaltStackで柔軟なiptables管理ソリューションを設定しようとしていますが、思ったよりも難しいと感じています。SaltStackを使用したIPtablesの管理

私の主な要件:IPのリストを保持する柱を持つことができるようにするには、すべてのミニオンのSSHアクセス用にホワイトリストに登録する必要があります。このIPのリストはもちろん変わるでしょう:いくつかのIPが追加され、いくつかのIPが削除されます。私が直面している問題は、削除されたIPにあります。ピラーファイルから削除すると、SaltStackは実際のホワイトリストを大臣から削除しません。

唯一の回避策は、「removed-ips」という名前の新しいキーを作成することでしたが、IPを削除するときはいつでも追加することができました。 2番目の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 %} 

答えて

1

、私はこのように、/etc/iptables/rules.v4とV6を管理したいとむしろ塩の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... }} 

どこのルールを.jinjaはピラールからルールセットを生成します。この方法の利点は、すべてのハイステートでのフラッシュ(すなわち変更)を必要とせずに、ピラールールが削除されたときに正しいことを行うことです。欠点は、ローカルマシンからのファイアウォールへの手動の変更を認識して元に戻さないことです。

私は技法hereを使用している公式を持っています。互換性の問題に関するreadmeノートを無視して、現在のsaltでうまく動作します。または私がチェックした最後の時間でした。

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 %} 
関連する問題