답변:
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
구성을 한 후 다른 역할은이 디렉토리에있는 파일을 삭제합니다.
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
.
ufw
당신의 요구를 다룰 수는 없습니다. 그러나 "로컬 서버에서 볼 수없는 것을 편집 할 수 없다"고 말할 때 무엇을 의미합니까?
기존 규칙을 덮어 쓰거나 템플릿에서 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
다음 기능을 사용하여 iptables 규칙을 관리하는 역할을 만들었습니다.
불안한 은하 또는 github 에서 mikegleasonjr.firewall을 확인하십시오.
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