Manajemen Iptables dengan kemungkinan di lingkungan besar

20

Apa cara terbaik untuk mengelola iptables dari satu titik dan memiliki kemampuan untuk mengedit sesuatu di server lokal.

Kami perlu menambahkan beberapa aturan yang terpusat pada semua server, tetapi kami memiliki server khusus dengan persyaratan khusus yang harus memiliki seperangkat aturan sendiri.

Saya berpikir tentang skrip bash dengan beberapa termasuk yang dikelola terpusat dengan mungkin dan termasuk dikelola pada server lokal. Apakah ini pendekatan yang baik? Atau mungkin ada sesuatu yang lebih baik?

Kami tidak dapat membuat templat yml2 karena mungkin karena ada terlalu banyak perbedaan antara host tertentu.

Berikan contoh manajemen iptables yang terpusat.

Navern
sumber

Jawaban:

24

Uhw

Ansiblememiliki ufwmodul untuk menangani aturan firewall. Di roles/common/tasks/main.yml, yang termasuk dalam semua server saya, saya punya (antara lain):

- 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

Sunting : Diperlukan untuk mengizinkan ssh sebelum menetapkan kebijakan default untuk "menyangkal" (awalnya ini berlawanan di atas), jika tidak, Anda mungkin terkunci di antara dua langkah.

Kemudian, di setiap peran, saya memiliki aturan firewall tambahan untuk peran itu. Misalnya, dalam roles/nginx/tasks/main.yml, saya punya (antara lain) ini:

- name: Allow nginx firewall
  ufw: proto=tcp port=80 rule=allow
- name: Allow nginx ssl firewall
  ufw: proto=tcp port=443 rule=allow

Jadi semua server nginx saya memiliki port 80 dan 443 dibuka.

Dengan cara ini Anda dapat membangun konfigurasi umum apa pun yang Anda inginkan dan menambahkan aturan tambahan dalam peran yang lebih spesifik.

ferm

Jika Anda memiliki aturan yang ufwtidak bisa ditangani, satu solusi yang saya pikir akan berfungsi dengan baik adalah ferm; dapat melakukan hampir semua hal, dan Anda bisa mengkonfigurasinya untuk membaca aturan dari direktori seperti /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, dll Anda bisa membuat Anda commonperan mempersiapkan penting fermkonfigurasi dan kemudian memiliki peran lain drop file dalam direktori ini.

iptables polos

Persyaratan Anda untuk memiliki ansibleaturan khusus selain aturan yang ditentukan dengan cara lain tidak biasa dan tampaknya sebagian besar titik untuk menggunakan ansible. Sayangnya saya tidak melihat cara untuk melakukannya selain dengan polos iptables, yang akan sangat jelek. Berikut adalah contoh membuka port 80 in roles/nginx/tasks/main.yml(belum teruji):

- 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

di mana Save iptableshandler yang mengeksekusi iptables-save. Semua hal di atas cukup membosankan untuk ditulis, tetapi mungkin sesuai, terutama jika Anda hanya memiliki sedikit aturan untuk dikelola ansible.

Antonis Christofides
sumber
Jika saya ingat dengan benar dengan pendekatan ini saya tidak dapat menggunakan ipset dan membuat sesuatu yang sangat spesifik. Kami menggunakan pemilik modul di iptables. Sebagai contoh, kami memiliki pemilik iptables -m --uid 0 -j ACCEPT. Saya tidak dapat menggunakan modul ini dengan ufw di ansible dan tidak dapat mengedit sesuatu tanpa mungkin di server lokal.
Navern
Memang, ufwtampaknya tidak dapat menangani kebutuhan Anda; tetapi apa yang Anda maksud ketika Anda mengatakan "tidak dapat mengedit sesuatu tanpa mungkin di server lokal"?
Antonis Christofides
Apakah ada solusi lain? Saya terjebak dengan kasus ini, sulit untuk dipecahkan. Secara umum saya maksudkan bahwa saya hanya perlu menambahkan aturan BARU dengan mungkin tanpa melanggar yang ada. Jangan menyimpan semua konfigurasi di server dengan memungkinkan. Bahasa Inggris bukan bahasa ibu saya, jadi saya harap saya menjelaskan sendiri :)
Navern
Memperbarui jawaban saya dengan beberapa alternatif.
Antonis Christofides
Terima kasih banyak saya akan melihat ini, terutama ferm.
Navern
12

lineinfile

Jika Anda ingin mengelola aturan dalam konfigurasi iptables Anda tanpa menimpa aturan yang ada atau mengelola iptables secara terpusat di templat, gunakan modul lineinfile 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

Inilah penangan "restart iptables":

- name: restart iptables
  service: name=iptables state=restarted
Philip Wilson
sumber
2

Saya membuat peran untuk mengelola aturan iptables dengan fitur berikut:

  • Mendukung hampir semua aturan iptables
  • Izinkan penambahan / penggantian aturan granular untuk host tertentu
  • Mudah menyuntikkan variabel dalam aturan
  • Izinkan aturan memesan
  • Kesederhanaan
  • Kegigihan (memuat ulang aturan saat boot)

Lihat mikegleasonjr.firewall di galaksi yang memungkinkan atau di github

Mike Gleason jr Couturier
sumber
0

Kami menulis modul khusus untuk ini yang disebut iptables_raw yang memungkinkan kami mengelola iptables dengan mudah. Semuanya dijelaskan dalam posting blog ini . Berikut adalah contoh cara menggunakan modul:

# 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
Strahinja Kustudic
sumber
kami telah memecahkan masalah ini dengan skrip ini: github.com/SmilingNavern/iptables .
Navern
Tetapi tidak ada dokumentasi yang tepat saat ini. Saya bisa menjelaskan cara kerjanya dan memposting sebagai jawaban nanti.
Navern