Управління iptables з ansible у величезному середовищі


20

Який найкращий спосіб керувати iptables з однієї точки і мати можливість щось редагувати на локальному сервері.

Нам потрібно додати деякі правила, централізовані на всіх серверах, але у нас є конкретні сервери з конкретними вимогами, які повинні мати свій набір правил.

Я подумав про скрипт bash з декількома включеннями, який управляється централізовано з ansible і включає керований на локальному сервері. Це гарний підхід? А може, є щось краще?

Ми не можемо створити шаблони yml2 для ansible, оскільки між конкретними хостами є занадто велика різниця.

Наведіть приклади централізованого управління iptables.

Відповіді:


24

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 перед встановленням політики за замовчуванням "відмовити" (спочатку це було навпаки вище), інакше вас можуть заблокувати між двома кроками.

Потім у кожній ролі у мене є додаткові правила брандмауера для цієї ролі. Наприклад, у 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. На жаль, я не бачу жодного способу зробити це, крім звичайної 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.


Якщо я правильно пам’ятаю цей підхід, я не можу використовувати ipset і створити щось дуже специфічне. Ми використовуємо власника модуля в iptables. Наприклад, у нас є iptables -m owner --uid 0 -j ACCEPT. Я не можу використовувати цей модуль з ufw in ansible і не можу щось редагувати без ansible на локальному сервері.
Наверн

Дійсно, ufwмабуть, не може впоратися з вашими потребами; але що ви маєте на увазі, коли ви скажете, що "не можете щось редагувати без ansible на локальному сервері"?
Антоніс Христофідес

Чи є інше рішення? Я затримався з цією справою, важко вирішуваною. Взагалі я маю на увазі, що мені потрібно лише додавати НОВІ правила з ansible, не порушуючи існуючих. Не зберігайте всю конфігурацію на сервері з ansible. Англійська мова не є моєю рідною мовою, тому я сподіваюся, що я зрозумів себе :)
Navern

Мою відповідь оновив деякими альтернативами.
Антоніс Христофідес

Дякую, veru, я дуже розглядаю це, особливо ферм.
Наверн

12

рядковий файл

Якщо ви хочете керувати правилами у своїй конфігурації iptables, не перезаписуючи існуючі правила або централізовано керуючи iptables у шаблоні, використовуйте модуль рядкового файлу Ansible:

- 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
  • Дозволити додавання / переосмислення детальних правил для конкретних хостів
  • Легко вводити змінні в правила
  • Дозволити впорядкування правил
  • Простота
  • Наполегливість (перезавантажте правила під час завантаження)

Ознайомтесь з mikegleasonjr.firewall на галактиці галактики або на Github


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 .
Наверн

Але належної документації наразі немає. Я можу пояснити, як це працює, і пізніше відповісти.
Наверн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.