화이트리스트에 추가한 원래 IP 주소를 제외하고 들어오는 모든 요청이 차단되도록 CentOS 7 방화벽을 설정하고 싶습니다. 그리고 화이트리스트 IP 주소의 경우 모든 포트에 액세스할 수 있어야 합니다.
몇 가지 솔루션을 찾을 수 있지만(작동할지 확실하지 않음) iptables
CentOS 7 에서는 firewalld
. 명령 으로 달성하는 것과 비슷한 것을 찾을 수 없습니다 firewall-cmd
.
인터페이스는 공개 영역에 있습니다. 또한 모든 서비스를 이미 공개 영역으로 옮겼습니다.
답변1
나는 영역에 소스를 추가하여 이를 달성할 것입니다. 먼저 해당 영역에 어떤 소스가 있는지 확인하세요.
firewall-cmd --permanent --zone=public --list-sources
아무것도 없으면 추가하기 시작할 수 있습니다. 이것이 "허용 목록"입니다.
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
(이렇게 하면 전체 /24
IP와 단일 IP가 추가되므로 서브넷과 단일 IP 모두에 대한 참조를 갖게 됩니다.)
열려는 포트 범위를 설정합니다.
firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp
이것은 포트 1부터 22까지만 수행합니다. 원하는 경우 이 범위를 확장할 수 있습니다.
이제 수행한 작업을 다시 로드하세요.
firewall-cmd --reload
그리고 작업 내용을 확인하세요.
firewall-cmd --zone=public --list-all
참고/편집: 중요하지 않지만 저는 방화벽의 화이트리스트 IP 세트에 대한 "신뢰할 수 있는" 영역을 좋아합니다. 다음 내용을 읽어보면 추가 평가를 할 수 있습니다.영역 선택에 대한 Redhat의 제안.
또한보십시오:
- 방화벽을 사용하는 RHEL 7 기사
- Fedora 방화벽D 문서(상당히 좋습니다. 페도라는 한동안 방화벽을 사용해 왔습니다)
이 소스 외부로 패킷을 보내려는 경우 이전에 예로 사용한 DROP
외부 패킷을 삭제하는 예는 다음과 같습니다 ./24
이를 위해 풍부한 규칙을 사용할 수 있습니다, 나는 믿는다. 이것은 개념적이므로 테스트하지는 않았지만(centos 7이 명령을 허용하는지 확인하는 것 외에는) pcap을 수행하고 예상대로 작동하는지 확인하기에는 충분히 쉬울 것입니다.
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
답변2
답변이 승인되고 찬성 투표를 받았다고 해도 그것이 정답이라고 생각하지 않습니다. 문서에서 명확한 설명을 찾지 못했지만 구현된 동작을 보면 다음과 같습니다.
- 인터페이스와 소스는 선택기로 사용됩니다 - 활성화할 영역
- 기본 영역에서는 둘 다 무시됩니다(항상 활성화됨).
따라서 대답은 다음과 같습니다.
- 기본 영역을 잠그고 "공개"라고 말합니다. 포트가 열려 있지 않거나 서비스를 사용할 수 없습니다.
- 다른 영역에서는 "작업"이라고 말합니다. - 소스 및 열린 포트를 정의합니다.
예를 들어 기본 영역이 공개이고 열려 있는 포트가 없다고 가정하면 "작업" 영역에 소스 및 포트 범위를 추가합니다.
$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp
이제 활성 영역을 확인하십시오(기본 영역은 항상 활성 상태입니다).
$ sudo firewall-cmd --get-active-zones
당신은 얻을 것이다:
work
sources: 192.168.0.0/24
따라서 "작업" 영역 규칙이 특정 서브넷에 적용됩니다. "화이트리스트"에 대해 다양한 열린 포트가 있습니다 =서브넷요청대로. 물론 동작을 유지하려면 명령문 --permanent
에 옵션을 사용하십시오.--add-xxx
그러면 "공용"(기본) 영역에 있는 모든 포트나 서비스가 모든 인터페이스와 소스 주소에 적용됩니다.
$ sudo firewall-cmd --list-all-zones
public (default)
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
work (active)
interfaces:
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
인터페이스에도 동일한 시스템이 작동합니다. "work" 영역에 "ens3" 인터페이스를 추가한다고 가정해 보세요.
$ sudo firewall-cmd --zone=work --add-interface=ens3
특정 인터페이스의 모든 요청에 대해 "작업" 영역 규칙을 사용하게 됩니다. 이는 "소스"보다 더 대략적인 선택기입니다.
답변3
면책조항: 여기서는 제가 제안하는 것을 실제로 시도하지는 않았지만 제가 마지막으로 수행한 방화벽 설정과 상당히 유사하므로 이 단계는 생략하겠습니다. Firewalld는 이러한 목적을 위해 사전 구성된 몇 가지 영역을 제공합니다. 들어오는 모든 것을 삭제하는 "드롭"이라는 것이 있고, "신뢰할 수 있는"이라는 것이 있습니다.어느(즉, 개별 포트를 열 필요조차 없어야 한다고 생각합니다). 비결은 원하는 것을 트리거할 수 있는 올바른 영역을 얻는 것입니다.
Firewalld는 다음 우선 순위에 따라 영역에 규칙을 적용합니다.
- 소스 IP가 영역에 바인딩된 소스 IP와 일치하면 해당 IP를 사용합니다.
- 소스 IP가 특정 영역과 일치하지 않으면 해당 영역에 대해 구성된 영역이 있는지 확인합니다.상호 작용패킷이 들어왔습니다. 하나가 있으면 그것을 사용합니다.
- 마지막으로 일치하는 항목이 없으면 기본 영역을 사용합니다.
따라서 먼저 신뢰할 수 있는 IP를 "신뢰할 수 있는" 영역에 바인딩하려고 합니다.
firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4
그런 다음 기본 영역을 "drop"으로 설정하거나 인터페이스를 여기에 바인딩합니다.
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0
그런 다음 변경 사항을 적용합니다(경고: 네트워크를 통해 이 작업을 수행하고 소스 IP를 신뢰할 수 있는 영역에 추가하지 않은 경우 연결이 끊어질 수 있음).
firewall-cmd --reload
물론 "--permanent"를 생략하여 일시적으로 테스트할 수도 있습니다(그러면 --reload도 필요하지 않습니다).
답변4
신뢰할 수 있는 영역 답변이 선택된 답변이 아니라는 사실에 놀랐습니다. 신뢰할 수 있는 영역에는 기본 "target: ACCEPT"가 있고 나머지는 "target: default"입니다. 실제로는 중요하지 않지만 이름과 기본 대상 값으로 인해 의도된 방법인 것처럼 보입니다.
나만 접근할 수 있도록 상자를 빠르게 잠그는 방법:
firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones
모든 영역을 나열하면 다음과 같은 내용이 표시됩니다.
trusted (active)
target: ACCEPT
icmp-block-inversion: no
sources: 1.2.3.4 5.6.7.8/24
masquerade: no
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: eth1
masquerade: no
참고: null/누락된 값이 있는 줄을 제거했습니다. 중요한 것은 trust와 drop이 둘 다(활성)이고 drop에 공용 인터페이스가 있다는 것입니다.
데모용으로 iptables에 미치는 영향은 다음과 같습니다.
Chain INPUT_ZONES_SOURCE (1 references)
target prot opt source destination
IN_trusted all -- 1.2.3.4 0.0.0.0/0
IN_trusted all -- 5.6.7.8/24 0.0.0.0/0
Chain INPUT_ZONES (1 references)
target prot opt source destination
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0