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.