CentOS 7의 소스 IP 주소 허용


23

허용 된 원래 IP 주소를 제외하고 들어오는 모든 요청이 차단되도록 CentOS 7 방화벽을 설정하려고합니다. 화이트리스트 IP 주소의 경우 모든 포트에 액세스 할 수 있어야합니다.

iptablesCentOS 7에서 사용할 수있는 솔루션 (작동 여부는 확실하지 않음)을 거의 찾을 수 없습니다 firewalld. firewall-cmd명령 으로 달성 할 수있는 비슷한 것을 찾을 수 없습니다 .

인터페이스는 공용 영역에 있습니다. 또한 모든 서비스를 이미 공용 영역으로 옮겼습니다.

답변:


44

영역에 소스를 추가하여이 작업을 수행합니다. 먼저 어떤 소스가 있는지 확인하십시오 :

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

(전체 /24IP와 단일 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의 제안을 읽으면 추가 평가를 할 수 있습니다 .

참조 :


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'

답변 해 주셔서 감사합니다. 평판이 부족하여 투표 할 수 없습니다. 그러나 소스를 사용하여 추가 한 IP를 제외한 다른 모든 IP는 어떻게 삭제합니까?
Krishnandu Sarkar

감사합니다 @KrishnanduSarkar-당신이 맞습니다. 기본적으로 ICMP 거부 여야합니다. 그러나 패킷을 삭제하는 풍부한 규칙을 추가 할 수 있다고 생각합니다. 나는 내 대답에 효과가 있다고 생각되는 예를 추가했다. 공감대에 대해 감사합니다. 답변이 작동하면 답변 수락을 고려하십시오.
dougBTV

좋은 대답은 지금까지 iptables를 사용하고있었습니다.
Tensigh December

(!)이 답변은 현재 기본 FirewallD 구성에 대해 예상대로 작동하지 않습니다 (인터페이스는 기본적으로 공용 영역에 할당 됨).
dess

24

답변이 승인되어 투표를 했어도 정답이라고 생각하지 않습니다. 설명서에서 명확한 설명을 찾지 못했지만 구현 된 동작에서 다음과 같습니다.

  1. 인터페이스와 소스는 선택기로 사용됩니다-활성화 할 영역
  2. 기본 영역에서는 항상 무시됩니다 (항상 활성)

답은 다음과 같습니다.

  1. 기본 영역 잠금 (예 : "공개")-포트가 열리지 않거나 사용 가능한 서비스가 없습니다.
  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:

동일한 시스템이 인터페이스에서도 작동합니다. "작업"영역에 "ens3"인터페이스를 추가하여 말합니다.

$ sudo firewall-cmd --zone=work --add-interface=ens3

"작업"영역 규칙을 특정 인터페이스의 모든 요청에 ​​사용합니다 ( "소스"보다 더 거친 선택기).


4
이것이 가장 좋은 대답입니다. 가장 중요한 부분은 인터페이스를 설정하면 액세스가 확대된다는 설명입니다 (소스가 설정된 경우). sources허용 목록 이 있어도 포트에 액세스 할 수 있다는 문제가있었습니다 . 그 이유는 영역에 인터페이스가 할당 되었기 때문입니다.
pinkeen December

1
정확하게 답하려면이 응답이 public영역 에서 모든 기본 서비스를 제거 해야합니다 (있는 경우 인터페이스가 public기본적 으로 영역에 할당되면이 서비스를 모든 주소에서 사용할 수 있음 ). 또는 기본 영역을 다른 영역으로 변경하십시오. block또는 drop(이것은 일반적인 관행입니다). 또는 public영역 대상을 %%REJECT%%또는로 변경하십시오 DROP.
데스

6

면책 조항 : 나는 실제로 여기에서 제안하는 것을 시도하지는 않았지만, 내가 한 마지막 방화벽 설정과 상당히 가깝기 때문에 그만 두었습니다. 방화벽은이 목적을 위해 몇 가지 사전 구성된 영역을 제공합니다. "drop"이라는 것이 있는데, 들어오는 것을 떨어 뜨리고 "trusted"라는 것이 있는데, 이는 어떤 연결 이든 허용 합니다 (즉, 개별 포트를 열 필요조차 없습니다). 트릭은 원하는 영역을 트리거 할 올바른 영역을 얻는 것입니다.

방화벽은 다음 우선 순위에 따라 영역에 대한 규칙을 적용합니다.

  • 소스 IP가 영역에 바인딩 된 소스 IP와 일치하면이를 사용합니다.
  • 소스 IP가 특정 영역과 일치하지 않으면 패킷이 들어온 인터페이스에 대해 영역이 구성되어 있는지 확인합니다 . 하나가 있으면 그것을 사용합니다.
  • 마지막으로 일치하는 것이 없으면 기본 영역을 사용합니다.

따라서 먼저 신뢰할 수있는 IP를 "신뢰할 수있는"영역에 바인딩하려고합니다.

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

그런 다음 기본 영역을 "삭제"하도록 설정하거나 인터페이스를 바인딩하십시오.

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0

변경 사항을 적용합니다 (경고 : 네트워크를 통해이 작업을 수행하고 소스 IP를 신뢰할 수있는 영역에 추가하지 않은 경우 연결이 끊어 질 수 있음).

firewall-cmd --reload

물론 "영구적"을 생략하여 일시적으로 테스트 할 수도 있습니다 (그리고 다시로드 할 필요도 없습니다).


block또한 (대신 사용할 수 있습니다 drop당신은 .... 그들에게 이야기하지 않는 것을 다른 호스트 말하고 싶은 경우)
버그 서재 거트 반

5

이 방법으로 방화벽을 작동시킵니다. 원하는 것을 달성하기 위해 내가 선호하는 방법은 다음과 같습니다.

# firewall-cmd --list-all

기본 영역이 공용이고 활성화 된 서비스는 dhcpv6-client 및 ssh입니다. 공공 서비스를 원하지 않습니까? 허용 된 IP 만 승인됩니다. 두 개의 공공 서비스를 제거하겠습니다.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

이제 모든 포트에 대한 액세스 권한을 부여하는 특정 IP를 허용 목록에 추가하십시오.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

이제 SSH, http 및 https 액세스에만 액세스하려는 다른 IP를 허용 목록에 추가하십시오. 다른 포트는 없습니다.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

SSH를 통해 연결하는 경우 새 규칙 세트를 적용하기 전에 IP를 인증해야합니다. 새로운 규칙을 적용 할 준비가되면.

#firewall-cmd --reload

2

Rich Rule을 통해 쉽게 관리 할 수 ​​있습니다.

첫 번째 단계

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

두 번째 단계-풍부한 규칙 추가

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

풍부한 규칙을 추가하고 다른 소스에서 모든 포트를 차단하면 모든 포트에 192.168.2.2로 액세스 할 수 있습니다.

아래 명령으로 포트 또는 서비스를 추가하면 모든 소스에서 액세스 할 수 있습니다.

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

아래 명령보다 특정 Ip에 대한 특정 포트를 열려면

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'

2

dougBTV의 최고 답변이 잘못되었습니다. 아직 필수 담당자가 없기 때문에 그의 답변에 답장을 보낼 수 없으므로 여기에 설명하겠습니다.

기본 영역 "public"을 사용하고 있습니다. 그는 해당 영역에 네트워크를 연결 한 다음 해당 영역에서 포트를 엽니 다. 그러나 기본 구성에서 모든 트래픽은 연결된 소스 네트워크뿐만 아니라 기본 영역을 통과합니다. 따라서 그의 --add-source 명령은 아무런 차이가 없으며 그의 --add-port 명령은 이제 전 세계가 해당 포트에 액세스 할 수 있도록 허용했습니다.

Normunds Kalnberzins의 두 번째 답변은 정확합니다. 별도의 영역을 만들고 네트워크 / IP를 해당 영역에 연결 한 다음 해당 영역의 포트를 엽니 다.

또는 모든 것을 기본 영역에두고 방화벽의 다양한 규칙을 사용하여 특정 IP의 액세스를 허용 할 수 있습니다.

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

이렇게하면 192.168.2.2에서 모든 포트로의 모든 트래픽이 허용되며 영역을 지정하지 않았으므로 기본 영역 "public"에 적용됩니다 (--get-default-zone을 사용하여 기본 영역이 무엇인지 확인하고- 현재 사용중인 영역을 보려면 get-active-zones를 참조하십시오).

이 IP에서 특정 포트로의 액세스 만 허용하려면 다음을 수행하십시오.

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

최선의 방법은 현재 실행중인 방화벽에 영향을주는 --permanent (또는 --perm for short)없이 이러한 명령을 실행하는 것입니다. 규칙이 작동하는지 테스트 한 후 --perm을 추가하여 규칙을 다시 실행하여 후속 방화벽 재로드시이를 기억하십시오.


1

Normunds 답변에 추가하기 만하면됩니다.

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

다른 모든 트래픽을 차단하려면

$ sudo firewall-cmd --set-default-zone=drop

경고 : 원격 시스템에서 액세스하면 로그인 세션 연결이 끊어 질 수 있습니다. '작업'영역 IP 설정을 올바르게 얻지 못하면 서버에 연결할 수 없습니다.

방화벽을 다시로드하려면

$ sudo firewall-cmd --reload

'--add-rich-rule'을 사용하여 두 개의 다른 IP를 추가하는 방법을 알 수 없었습니다.


현재 기본 FirewallD 구성으로는 충분하지 않을 수 있습니다. 자세한 내용은 Normunds의 답변에 대한 내 의견을 참조하십시오.
dess

여러 IP를 사용 하는 경우 ipset에 ipset비슷한 firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipIP를 추가 firewall-cmd --ipset=blacklist --add-entry=192.168.1.4하면 다음을 사용할 수 있습니다.firewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye

0

신뢰할 수있는 영역의 답변이 선택된 답변이 아니라는 것에 놀랐습니다. 신뢰할 수있는 영역에는 기본 "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 / 누락 값이있는 줄을 제거했습니다. 중요한 것은 신뢰할 수있는 삭제가 활성화되어 있고 공개 인터페이스가 있다는 것입니다.

데모를 위해 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.