[linux] rocky에 해외IP 차단하기

Posted by 김성철

rocky linux에 해외IP 차단하기

※ 모든 명령어는 root로 진행  

참고 링크

https://bug41.tistory.com/entry/Linux-Centos7-Firewall-%ED%95%B4%EC%99%B8-IP-%EC%B0%A8%EB%8B%A8-%EC%B6%94%EA%B0%80  

작업 전 기존 설정 백업

cp -a /etc/firewalld /etc/firewalld.bak  

방화벽에 whitelist 추가

firewall-cmd --permanent --new-ipset=whitelist --type=hash:net  

whitelist 추가 확인

firewall-cmd --get-ipsets  
=====================================================================  
[root@localhost ipsets]## firewall-cmd --get-ipsets  
whitelist  
=====================================================================  

로컬 IP 대역 추가

firewall-cmd --permanent --ipset=whitelist --add-entry=192.168.0.0/16  

로컬 IP 대역 추가 확인

cat /etc/firewalld/ipsets/whitelist.xml  
=====================================================================  
<?xml version="1.0" encoding="utf-8"?>  
<ipset type="hash:net">  
  <entry>192.168.0.0/16</entry>  
</ipset>  
=====================================================================  

특정 서비스 추가

firewall-cmd --zone=public --permanent --add-service=http  
firewall-cmd --zone=public --permanent --add-service=https  

방화벽 리로드

firewall-cmd --reload  

SSH 접속 테스트

SSH 접속테스트 진행  
-> 안되면 롤백해야함  

한국 IP 대역 파일 다운로드

URL : https://www.ipdeny.com/ipblocks/data/countries/kr.zone  
wget -O /etc/firewalld/ipsets/kr.zone http://www.ipdeny.com/ipblocks/data/countries/kr.zone  

파일 추가

firewall-cmd --permanent --ipset=whitelist --add-entries-from-file=/etc/firewalld/ipsets/kr.zone  

한국 대역 파일 추가 확인

cat /etc/firewalld/ipsets/whitelist.xml  
=====================================================================  
<?xml version="1.0" encoding="utf-8"?>  
<ipset type="hash:net">  
  <entry>192.168.0.0/16</entry>  
  <entry>1.11.0.0/16</entry>  
  <entry>1.16.0.0/14</entry>  
  <entry>1.96.0.0/12</entry>  
  <entry>1.176.0.0/15</entry>  
  <entry>1.201.0.0/16</entry>  
  <entry>1.208.0.0/12</entry>  
  <entry>1.224.0.0/11</entry>  
  <entry>14.0.32.0/19</entry>  
	....중략...  
</ipset>  
=====================================================================  

차단 룰 추가

firewall-cmd --zone=public --permanent --add-rich-rule='rule source NOT ipset=whitelist drop'  
-- 아래의 명령어로 하면 로그도 남으며, messages 에서 확인 가능함  
firewall-cmd --zone=public --permanent --add-rich-rule='rule source NOT ipset=whitelist log prefix="DROPPED: " level="warning" limit value="5/m" drop'  

방화벽 리로드

firewall-cmd --reload  

SSH 접속 테스트

SSH 접속테스트 진행  
-> 안되면 롤백해야함  

룰 추가 확인

firewall-cmd --list-all  

룰 삭제

firewall-cmd --zone=public --permanent --remove-rich-rule='rule source NOT ipset=whitelist drop'  

롤백

cp -a /etc/firewalld.bak/* /etc/firewalld/  
systemctl restart firewalld  

차단 내역 확인

vi /var/log/messages  
  
journalctl -t kernel  
  
- firewalld 관련 로그 확인  
journalctl -t firewalld  
  
- 실시간으로 로그를 모니터링  
tail -f /var/log/messages | grep "DROPPED:"  
- 또는  
journalctl -f -t kernel | grep "DROPPED:"  
  
- 차단된 로그 예시  
Feb 1 12:34:56 hostname kernel: DROPPED: IN=eth0 OUT= MAC=00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd SRC=123.456.789.0 DST=10.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=49 ID=12345 DF PROTO=TCP SPT=54321 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0  

firewalld.conf에서 로깅 설정 변경

vi /etc/firewalld/firewalld.conf  
LogDenied=off  
->  
LogDenied=all  

서비스 재시작

systemctl restart firewalld  

설정 확인

firewall-cmd --get-log-denied  

로그 보기

dmesg | grep -i REJECT  

로그 파일 생성 후 로깅 설정 (신규 파일 생성 후 아래 내용 추가)

vi /etc/rsyslog.d/firewalld-droppd.conf  
=====================================================================  
:msg,contains,"_DROP" /var/log/firewalld-droppd.log  
:msg,contains,"_REJECT" /var/log/firewalld-droppd.log  
& stop  
=====================================================================   ## rsyslog 서비스 재시작  
systemctl restart rsyslog.service  

deny log 확인

tail -f /var/log/firewalld-droppd.log  
=====================================================================  
Aug 11 23:42:16 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:44:21 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:44:21 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:46:26 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:46:26 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:48:31 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:49:38 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=ff:ff:ff:ff:ff:ff:4c:cc:6a:fb:01:32:08:00 SRC=192.168.55.184 DST=192.168.55.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=3553 PROTO=UDP SPT=138 DPT=138 LEN=209  
Aug 11 23:50:36 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:50:36 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
Aug 11 23:52:41 localhost kernel: FINAL_REJECT: IN=enp1s0 OUT= MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00 SRC=192.168.55.1 DST=224.0.0.1 LEN=32 TOS=0x18 PREC=0xA0 TTL=1 ID=4372 DF PROTO=2  
=====================================================================  
  
Aug 11 23:42:16: 로그가 생성된 날짜와 시간.  
localhost: 로그가 기록된 시스템의 호스트 이름.  
kernel: 로그가 커널에 의해 기록되었음을 나타냅니다.  
FINAL_REJECT: 방화벽 규칙에 의해 패킷이 최종적으로 거부되었음을 나타냅니다.  
IN=enp1s0: 패킷이 들어온 네트워크 인터페이스의 이름입니다(enp1s0).  
OUT=: 패킷이 나가는 네트워크 인터페이스의 이름입니다. 비어있는 것은 이 패킷이 방화벽을 통과하지 못했음을 의미합니다.  
MAC=01:00:5e:00:00:01:00:05:72:a5:30:22:08:00: 패킷의 MAC 주소 정보입니다.  
SRC=192.168.55.1: 패킷의 출발지 IP 주소입니다.  
DST=224.0.0.1: 패킷의 목적지 IP 주소입니다.  
LEN=32: 패킷의 길이(바이트 단위)입니다.  
TOS=0x18: 서비스 유형(ToS, Type of Service) 필드의 값입니다.  
PREC=0xA0: 우선순위(Prec) 필드의 값입니다.  
TTL=1: TTL(Time to Live) 값입니다. 이 값이 1이면 패킷이 더 이상 라우터를 통과하지 못하고 소멸될 것입니다.  
ID=4372: 패킷의 ID입니다.  
DF: Don't Fragment 비트가 설정되었음을 나타냅니다.  
PROTO=2: 패킷의 프로토콜 번호입니다. 2는 IGMP(Internet Group Management Protocol)를 의미합니다.  

— 아래부터는 GTP가 분석해준 내용

로그 주요 포인트 분석 (GPT)

- IGMP 프로토콜 (PROTO=2)  
	로그에서 대부분의 패킷이 IGMP 프로토콜을 사용하고 있습니다. IGMP는 주로 멀티캐스트 그룹 관리를 위해 사용됩니다. 이 프로토콜이 224.0.0.1과 같은 멀티캐스트 주소로 패킷을 보내고 있습니다.  
	멀티캐스트는 특정 그룹의 모든 호스트에게 데이터를 전송하는 데 사용됩니다. 224.0.0.1은 로컬 네트워크의 모든 장치에 멀티캐스트를 보내는 데 사용됩니다.  
  
- Final Reject  
	방화벽에서 이 트래픽이 차단되고 있습니다. 이 로그가 반복적으로 나타나고 있어, 이와 관련된 네트워크 트래픽이 계속 발생하고 있음을 알 수 있습니다.  
	방화벽 설정에서 IGMP 트래픽을 허용하지 않도록 구성된 것 같습니다.  
  
- Broadcast 트래픽 (DST=192.168.55.255)  
	로그 중 하나는 SRC=192.168.55.184 DST=192.168.55.255 PROTO=UDP SPT=138 DPT=138로 브로드캐스트 트래픽을 나타냅니다. 이는 UDP 프로토콜을 사용하며, 138번 포트는 NetBIOS Datagram Service에 사용됩니다.  
	네트워크에서 브로드캐스트 메시지를 보내는 것은 일반적이지만, 방화벽이 이 트래픽을 차단하고 있습니다.  
  
- 결론  
대부분의 로그 항목에서 IGMP 프로토콜을 사용한 멀티캐스트 트래픽이 차단되고 있습니다.  
NetBIOS 관련 브로드캐스트 트래픽도 차단되고 있습니다.  
이 로그는 네트워크에서 발생하는 트래픽 중 일부가 방화벽에 의해 거부되고 있음을 보여줍니다. 필요에 따라 방화벽 규칙을 수정하거나, 해당 트래픽을 허용할 것인지 검토할 필요가 있습니다.  

질문 1

위에서 너가 분석해준 로그는 대부분 localhost에서 발생하고 공유기단으로 내보내는게 차단됐다는건데  
이걸 허용해줘야해?   ## 답변 1   - ChatGPT   주어진 로그는 로컬 네트워크에서 발생한 트래픽이 방화벽에 의해 차단되었음을 보여줍니다. 대부분의 로그는 IGMP(Internet Group Management Protocol)와 관련된 멀티캐스트 트래픽이며, 이 트래픽이 방화벽에 의해 차단되고 있습니다. 또한 NetBIOS 관련 브로드캐스트 트래픽도 차단되고 있습니다.  

허용해야 하는지 여부를 결정하는 방법
트래픽의 목적 이해

IGMP 트래픽: 멀티캐스트 트래픽은 주로 로컬 네트워크의 여러 장치 간에 데이터를 전송하기 위해 사용됩니다. 예를 들어, IP TV, 멀티미디어 스트리밍, 또는 로컬 네트워크 내의 특정 서비스들이 이 프로토콜을 사용할 수 있습니다. 만약 이 트래픽이 정상적이고 필요한 트래픽이라면 허용해야 할 수 있습니다.
NetBIOS 트래픽: NetBIOS는 윈도우 기반 네트워크에서 파일 및 프린터 공유와 같은 로컬 네트워크 서비스를 위해 사용됩니다. 이 트래픽이 필요한 경우에도 허용해야 할 수 있습니다.
보안 요구사항 고려

보안: 허용하지 않아도 로컬 네트워크에서 정상적으로 작동하는 서비스가 많다면, 보안을 위해 차단을 유지하는 것이 좋습니다. 멀티캐스트와 브로드캐스트 트래픽은 공격 표면을 넓힐 수 있기 때문에, 허용하는 것이 보안상 위험을 초래할 수 있습니다.
특정 서비스 필요: 만약 특정 서비스(예: IP TV, 스트리밍 서비스 등)에서 멀티캐스트가 필요하다면, 이 트래픽을 허용해야 합니다.
네트워크 환경 및 설정

로컬 네트워크: 만약 해당 네트워크가 단순한 가정용 네트워크이거나 보안 요구사항이 낮은 환경이라면 허용하는 것이 괜찮을 수 있습니다.
회사 네트워크: 기업 네트워크의 경우, 불필요한 트래픽을 차단하고, 필요한 경우에만 허용하는 것이 일반적인 보안 정책입니다.
결론
허용해야 할 때: 로컬 네트워크에서 멀티캐스트 트래픽이 필요한 특정 서비스(예: IP TV, 멀티미디어 스트리밍) 또는 NetBIOS 기반 파일 공유 등을 사용하는 경우 이 트래픽을 허용해야 합니다.
차단 유지: 이러한 트래픽이 불필요하거나, 보안을 우선시하는 환경이라면 차단을 유지하는 것이 좋습니다.
결국, 이 트래픽이 허용되어야 하는지는 네트워크에서 실제로 필요로 하는 서비스와 보안 요구사항에 따라 결정됩니다. 필요하다면, 방화벽 규칙을 수정하여 특정 트래픽만 허용할 수 있습니다.

질문 2

그럼 허용하는 방법은 뭐야?   ## 답변 2  

ChatGPT
차단된 트래픽을 허용하기 위해서는 방화벽 설정을 수정해야 합니다. 방화벽 규칙을 설정하는 방법은 사용 중인 방화벽에 따라 달라지지만, 대부분의 경우 iptables를 사용하여 설정할 수 있습니다. 아래에서는 iptables를 사용하여 특정 트래픽을 허용하는 방법을 설명하겠습니다.

  1. IGMP 트래픽 허용하기
    IGMP(프로토콜 번호 2)는 멀티캐스트 그룹 관리를 위한 프로토콜입니다. 이를 허용하기 위해 다음과 같은 명령어를 사용할 수 있습니다:
    iptables -A INPUT -p igmp -j ACCEPT
    iptables -A OUTPUT -p igmp -j ACCEPT
    이 명령어는 IGMP 트래픽이 들어오고 나가는 것을 모두 허용합니다.

  2. NetBIOS 트래픽 허용하기
    NetBIOS는 UDP 137, 138 포트와 TCP 139 포트를 사용합니다. 이를 허용하기 위해 다음 명령어를 사용할 수 있습니다:

UDP 137 (NetBIOS Name Service)

iptables -A INPUT -p udp –dport 137 -j ACCEPT
iptables -A OUTPUT -p udp –sport 137 -j ACCEPT

UDP 138 (NetBIOS Datagram Service)

iptables -A INPUT -p udp –dport 138 -j ACCEPT
iptables -A OUTPUT -p udp –sport 138 -j ACCEPT

TCP 139 (NetBIOS Session Service)

iptables -A INPUT -p tcp –dport 139 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 139 -j ACCEPT

  1. 멀티캐스트 트래픽 허용하기
    멀티캐스트 트래픽이 차단된 경우, 이를 허용하기 위해 특정 멀티캐스트 주소로의 트래픽을 허용해야 합니다. 예를 들어, 224.0.0.1 주소로의 트래픽을 허용하려면 다음 명령어를 사용합니다:

iptables -A INPUT -d 224.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 224.0.0.1 -j ACCEPT
이 규칙은 224.0.0.1 주소로의 모든 트래픽을 허용합니다.

  1. 방화벽 규칙 저장
    iptables 규칙은 기본적으로 시스템을 재부팅하면 사라집니다. 따라서, 영구적으로 적용하기 위해서는 규칙을 저장해야 합니다.

CentOS/RHEL:

service iptables save
Ubuntu/Debian:

iptables-save > /etc/iptables/rules.v4

  1. 방화벽 규칙 확인
    적용된 규칙이 제대로 설정되었는지 확인하려면 다음 명령어를 사용합니다:

iptables -L -v -n
이 명령어는 현재 설정된 방화벽 규칙을 자세히 보여줍니다.

요약
위의 방법을 사용해 iptables를 수정하면 특정 트래픽을 허용할 수 있습니다. 필요한 트래픽만 허용하고, 보안성을 유지하기 위해 불필요한 트래픽은 계속 차단하는 것이 중요합니다.

질문 3

나는  iptables 를 안쓰고 firewall을 사용해   ## 답변 3   만약 iptables 대신 firewalld를 사용하고 있다면, firewalld를 통해 특정 트래픽을 허용할 수 있습니다. firewalld는 보다 유연하고 쉽게 관리할 수 있는 방화벽 도구로, 아래의 방법을 통해 특정 트래픽을 허용할 수 있습니다.  
  1. IGMP 트래픽 허용하기
    firewalld에서 IGMP 트래픽을 허용하려면, firewalld의 rich rule 기능을 사용해야 합니다. 다음 명령어를 사용하여 IGMP 트래픽을 허용할 수 있습니다:

firewall-cmd –permanent –add-rich-rule=’rule protocol value=”igmp” accept’
firewall-cmd –reload
이 명령어는 IGMP 트래픽을 영구적으로 허용하고, 방화벽 설정을 다시 로드하여 변경 사항을 적용합니다.

  1. NetBIOS 트래픽 허용하기
    NetBIOS 트래픽을 허용하려면, 다음 명령어를 사용하여 UDP 137, 138 포트와 TCP 139 포트를 열어줍니다:

UDP 137 (NetBIOS Name Service)

firewall-cmd –permanent –add-port=137/udp

UDP 138 (NetBIOS Datagram Service)

firewall-cmd –permanent –add-port=138/udp

TCP 139 (NetBIOS Session Service)

firewall-cmd –permanent –add-port=139/tcp

설정 적용

firewall-cmd –reload
이 명령어는 해당 포트들을 영구적으로 열고, 방화벽 설정을 다시 로드하여 적용합니다.

  1. 멀티캐스트 트래픽 허용하기
    멀티캐스트 트래픽을 허용하려면, 멀티캐스트 주소로의 트래픽을 허용하는 rich rule을 추가해야 합니다:

firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4” destination address=”224.0.0.1/4” accept’
firewall-cmd –reload
이 명령어는 IPv4 멀티캐스트 트래픽을 영구적으로 허용합니다.

  1. 방화벽 규칙 확인
    설정된 방화벽 규칙이 올바르게 적용되었는지 확인하려면 다음 명령어를 사용할 수 있습니다:

firewall-cmd –list-all
이 명령어는 현재 설정된 방화벽 규칙을 자세히 보여줍니다.

요약
firewalld를 사용해 IGMP, NetBIOS, 그리고 멀티캐스트 트래픽을 허용하는 방법을 설명했습니다. 각 명령어를 사용해 필요한 트래픽만 허용하고, 보안을 유지하는 것이 중요합니다. 설정이 완료되면 방화벽을 다시 로드하여 적용된 변경 사항을 활성화해야 합니다.