※ 모든 명령어는 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
firewall-cmd --permanent --new-ipset=whitelist --type=hash:net
firewall-cmd --get-ipsets
=====================================================================
[root@localhost ipsets]## firewall-cmd --get-ipsets
whitelist
=====================================================================
firewall-cmd --permanent --ipset=whitelist --add-entry=192.168.0.0/16
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 접속테스트 진행
-> 안되면 롤백해야함
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 접속테스트 진행
-> 안되면 롤백해야함
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
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
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가 분석해준 내용
- 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 관련 브로드캐스트 트래픽도 차단되고 있습니다.
이 로그는 네트워크에서 발생하는 트래픽 중 일부가 방화벽에 의해 거부되고 있음을 보여줍니다. 필요에 따라 방화벽 규칙을 수정하거나, 해당 트래픽을 허용할 것인지 검토할 필요가 있습니다.
위에서 너가 분석해준 로그는 대부분 localhost에서 발생하고 공유기단으로 내보내는게 차단됐다는건데
이걸 허용해줘야해? ## 답변 1 - ChatGPT 주어진 로그는 로컬 네트워크에서 발생한 트래픽이 방화벽에 의해 차단되었음을 보여줍니다. 대부분의 로그는 IGMP(Internet Group Management Protocol)와 관련된 멀티캐스트 트래픽이며, 이 트래픽이 방화벽에 의해 차단되고 있습니다. 또한 NetBIOS 관련 브로드캐스트 트래픽도 차단되고 있습니다.
허용해야 하는지 여부를 결정하는 방법
트래픽의 목적 이해
IGMP 트래픽: 멀티캐스트 트래픽은 주로 로컬 네트워크의 여러 장치 간에 데이터를 전송하기 위해 사용됩니다. 예를 들어, IP TV, 멀티미디어 스트리밍, 또는 로컬 네트워크 내의 특정 서비스들이 이 프로토콜을 사용할 수 있습니다. 만약 이 트래픽이 정상적이고 필요한 트래픽이라면 허용해야 할 수 있습니다.
NetBIOS 트래픽: NetBIOS는 윈도우 기반 네트워크에서 파일 및 프린터 공유와 같은 로컬 네트워크 서비스를 위해 사용됩니다. 이 트래픽이 필요한 경우에도 허용해야 할 수 있습니다.
보안 요구사항 고려
보안: 허용하지 않아도 로컬 네트워크에서 정상적으로 작동하는 서비스가 많다면, 보안을 위해 차단을 유지하는 것이 좋습니다. 멀티캐스트와 브로드캐스트 트래픽은 공격 표면을 넓힐 수 있기 때문에, 허용하는 것이 보안상 위험을 초래할 수 있습니다.
특정 서비스 필요: 만약 특정 서비스(예: IP TV, 스트리밍 서비스 등)에서 멀티캐스트가 필요하다면, 이 트래픽을 허용해야 합니다.
네트워크 환경 및 설정
로컬 네트워크: 만약 해당 네트워크가 단순한 가정용 네트워크이거나 보안 요구사항이 낮은 환경이라면 허용하는 것이 괜찮을 수 있습니다.
회사 네트워크: 기업 네트워크의 경우, 불필요한 트래픽을 차단하고, 필요한 경우에만 허용하는 것이 일반적인 보안 정책입니다.
결론
허용해야 할 때: 로컬 네트워크에서 멀티캐스트 트래픽이 필요한 특정 서비스(예: IP TV, 멀티미디어 스트리밍) 또는 NetBIOS 기반 파일 공유 등을 사용하는 경우 이 트래픽을 허용해야 합니다.
차단 유지: 이러한 트래픽이 불필요하거나, 보안을 우선시하는 환경이라면 차단을 유지하는 것이 좋습니다.
결국, 이 트래픽이 허용되어야 하는지는 네트워크에서 실제로 필요로 하는 서비스와 보안 요구사항에 따라 결정됩니다. 필요하다면, 방화벽 규칙을 수정하여 특정 트래픽만 허용할 수 있습니다.
그럼 허용하는 방법은 뭐야? ## 답변 2
ChatGPT
차단된 트래픽을 허용하기 위해서는 방화벽 설정을 수정해야 합니다. 방화벽 규칙을 설정하는 방법은 사용 중인 방화벽에 따라 달라지지만, 대부분의 경우 iptables를 사용하여 설정할 수 있습니다. 아래에서는 iptables를 사용하여 특정 트래픽을 허용하는 방법을 설명하겠습니다.
IGMP 트래픽 허용하기
IGMP(프로토콜 번호 2)는 멀티캐스트 그룹 관리를 위한 프로토콜입니다. 이를 허용하기 위해 다음과 같은 명령어를 사용할 수 있습니다:
iptables -A INPUT -p igmp -j ACCEPT
iptables -A OUTPUT -p igmp -j ACCEPT
이 명령어는 IGMP 트래픽이 들어오고 나가는 것을 모두 허용합니다.
NetBIOS 트래픽 허용하기
NetBIOS는 UDP 137, 138 포트와 TCP 139 포트를 사용합니다. 이를 허용하기 위해 다음 명령어를 사용할 수 있습니다:
iptables -A INPUT -p udp –dport 137 -j ACCEPT
iptables -A OUTPUT -p udp –sport 137 -j ACCEPT
iptables -A INPUT -p udp –dport 138 -j ACCEPT
iptables -A OUTPUT -p udp –sport 138 -j ACCEPT
iptables -A INPUT -p tcp –dport 139 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 139 -j ACCEPT
iptables -A INPUT -d 224.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 224.0.0.1 -j ACCEPT
이 규칙은 224.0.0.1 주소로의 모든 트래픽을 허용합니다.
CentOS/RHEL:
service iptables save
Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4
iptables -L -v -n
이 명령어는 현재 설정된 방화벽 규칙을 자세히 보여줍니다.
요약
위의 방법을 사용해 iptables를 수정하면 특정 트래픽을 허용할 수 있습니다. 필요한 트래픽만 허용하고, 보안성을 유지하기 위해 불필요한 트래픽은 계속 차단하는 것이 중요합니다.
나는 iptables 를 안쓰고 firewall을 사용해 ## 답변 3 만약 iptables 대신 firewalld를 사용하고 있다면, firewalld를 통해 특정 트래픽을 허용할 수 있습니다. firewalld는 보다 유연하고 쉽게 관리할 수 있는 방화벽 도구로, 아래의 방법을 통해 특정 트래픽을 허용할 수 있습니다.
firewall-cmd –permanent –add-rich-rule=’rule protocol value=”igmp” accept’
firewall-cmd –reload
이 명령어는 IGMP 트래픽을 영구적으로 허용하고, 방화벽 설정을 다시 로드하여 변경 사항을 적용합니다.
firewall-cmd –permanent –add-port=137/udp
firewall-cmd –permanent –add-port=138/udp
firewall-cmd –permanent –add-port=139/tcp
firewall-cmd –reload
이 명령어는 해당 포트들을 영구적으로 열고, 방화벽 설정을 다시 로드하여 적용합니다.
firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4” destination address=”224.0.0.1/4” accept’
firewall-cmd –reload
이 명령어는 IPv4 멀티캐스트 트래픽을 영구적으로 허용합니다.
firewall-cmd –list-all
이 명령어는 현재 설정된 방화벽 규칙을 자세히 보여줍니다.
요약
firewalld를 사용해 IGMP, NetBIOS, 그리고 멀티캐스트 트래픽을 허용하는 방법을 설명했습니다. 각 명령어를 사용해 필요한 트래픽만 허용하고, 보안을 유지하는 것이 중요합니다. 설정이 완료되면 방화벽을 다시 로드하여 적용된 변경 사항을 활성화해야 합니다.