거대한 환경에서 사용할 수있는 IPtables 관리


20

한 지점에서 iptables를 관리하고 로컬 서버에서 무언가를 편집 할 수있는 가장 좋은 방법은 무엇입니까?

모든 서버에 중앙 집중식으로 규칙을 추가해야하지만 고유 한 규칙 세트를 가져야하는 특정 요구 사항이있는 특정 서버가 있습니다.

나는 여러 개의 include를 가진 bash 스크립트에 대해 생각했다. 좋은 접근입니까? 아니면 더 좋은 것이 있습니까?

특정 호스트간에 차이가 너무 커서 yml2 템플릿을 만들 수 없습니다.

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이 열려 있습니다.

이렇게하면 원하는 공통 구성을 구축하고보다 구체적인 역할에 규칙을 추가 할 수 있습니다.

Ferm

ufw처리 할 수없는 규칙이 있다면 , 잘 작동 할 것이라고 생각하는 솔루션은 다음과 같습니다 ferm. 거의 아무것도 할 수 있으며, 같은 디렉토리의 규칙을 읽을 구성 할 수 있습니다 /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, 등 당신이 만들 수있는 common역할은 필수 준비 ferm구성을 한 후 다른 역할은이 디렉토리에있는 파일을 삭제합니다.

평범한 iptables

ansible다른 방법으로 지정된 규칙 외에 규칙을 지정해야 한다는 요구 사항 은 일반적이지 않으며을 사용하는 대부분의 요점을 무시 ansible합니다. 불행히도 plain 이외의 다른 방법은 보이지 않습니다 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와 함께 사용할 수 없으며 로컬 서버에서 가능하지 않으면 무언가를 편집 할 수 없습니다.
Navern

실제로, ufw당신의 요구를 다룰 수는 없습니다. 그러나 "로컬 서버에서 볼 수없는 것을 편집 할 수 없다"고 말할 때 무엇을 의미합니까?
Antonis Christofides

다른 해결책이 있습니까? 나는이 사건을 고수했다. 일반적으로 기존 규칙을 위반하지 않고 새로운 규칙 만 추가하면됩니다. 모든 구성을 서버에 저장하지 마십시오. 영어가 모국어가 아니므로, 나는 분명하게 스스로를
밝히기를

몇 가지 대안으로 내 대답을 업데이트했습니다.
Antonis Christofides

내가 특히 이것에 대해 조사 할 많은 감사합니다 verm.
Navern

12

lineinfile

기존 규칙을 덮어 쓰거나 템플릿에서 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

"restart iptables"핸들러는 다음과 같습니다.

- name: restart iptables
  service: name=iptables state=restarted

2

다음 기능을 사용하여 iptables 규칙을 관리하는 역할을 만들었습니다.

  • 사실상 모든 iptables 규칙 지원
  • 특정 호스트에 대해 세분화 된 규칙 추가 / 재정의 허용
  • 규칙에 변수를 쉽게 주입
  • 규칙 주문 허용
  • 간단
  • 지속성 (부팅시 규칙 재로드)

불안한 은하 또는 github 에서 mikegleasonjr.firewall을 확인하십시오.


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 스크립트를 사용하여이 문제를 해결했습니다 .
Navern

그러나 현재 적절한 문서가 없습니다. 어떻게 작동하는지 설명하고 나중에 답변으로 게시 할 수 있습니다.
Navern
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.