프로그램/LINUX

ROCKY 9 에서 FIREWALL Daemon 에 IP 접속 제한 설정.

(주)CKBcorp., 2023. 2. 23. 19:24
반응형


말 그대로다. 삽질 좀 했다.
이게 , 인터넷에 나와 있는 대로 했는데 안 되더라. 느낌이, 뭔가 기본값 설정 자체가 틀려서 안 되는 느낌이다.
어쨌던,


요약 : 
1. 특정 IP 를 접속 제한할 경우. 예를들어 제한 IP가 1.2.3.4 일 때
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
# firewall-cmd --reload

2. IP 대역을 접속 제한할 경우. 예를들어 제한 IP가 123.45.XXX.XXX 일 때
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="123.45.0.0/16" drop'
# firewall-cmd --reload

3. 원하는 IP 만 접속 허가할 경우 = 특정 IP 이외에는 접속 제한. 예를 들어 접속 허용 IP가 1.2.3.4 일 때
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source not address="1.2.3.4" drop'
# firewall-cmd --reload

4. 원하는 IP 대역만 접속 허가할 경우 = 특정 IP 대역 이외에는 접속 제한. 예를 들어 접속 허용 IP 대역이 192.168.254.XXX 일 때
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source not address="192.168.254.0/24" drop'
# firewall-cmd --reload


Rocky 8 버전부터인 거 같은데, 기존의 iptables 가 firewall 로 대체되었다. 
또한, /etc/hosts.allow, /etc/hosts.deny 가 사라져서 /etc/ 아래에 hosts.allow, hosts.deny 를 넣어도 안 먹는다. 
뭔가 우회 방법이 있는거 같은데, 내가 해 본 건 아님.
https://zedt.eu/tech/linux/how-to-filter-ssh-connections-with-hosts-allow-on-rocky-linux-8/


어쨌던 Rocky 9 부터는 firewall 을 이용해야 한다.

firewall daemon 에 대해서는 잘 설명된 문서가 많다. 

https://www.lesstif.com/ws/firewalld-43844015.html#firewalld%EB%B0%A9%ED%99%94%EB%B2%BD%EC%82%AC%EC%9A%A9-%ED%8A%B9%EC%A0%95sourceIP%EC%97%90%EB%8C%80%ED%95%B4%ED%8F%AC%ED%8A%B8%EC%A0%91%EA%B7%BC%ED%97%88%EC%9A%A9

https://docs.rockylinux.org/guides/security/firewalld-beginners/


근데, 위 링크에서 이야기하는 대로 "허가 아이피 등록" 을 해도, 안 될거다. 나는 안 되더라. 
우선, 문서에서 혹은 웹사이트에서 이야기하는 "원하는 IP 만 접속 허용 + 나머지는 접속불가 " 명령은 아래와 같다.

# firewall-cmd --permanent --zone=public --add-source=1.2.3.4
# firewall-cmd --reload

방화벽 설정 영역이 public 인가 아닌가, reload 를 했냐 안했냐 는 중요한 게 아니다. 내가 옵션 조합을 모두 다 시험해 봤거든.
저 명령이  어떤 의미냐면, "방화벽에, 1.2.3.4 라는 주소를, 허용 목록으로 넣어라 " 라는 뜻이다.

그럼, 허용 목록에 1.2.3.4 가 들어갔으니까, 자신의 주소가 1.2.3.4 인 단말은 접속이 되겠지.
그럼, 자신의 주소가 1.2.3.4 이 아닌 단말은? 접속이 안 되어야 정상이지?


근데 접속된다. 

웹사이트나 문서 등을 보면, 한결같이 말한다. firewall-cmd 설정은 기본이 모두 거부하는 거라서, 딱히 거부할 목록을 기록하지 않아도, 접근 허용할 목록만 추가하면 ( = --add-source="1.2.3.4" ) 명시적으로 추가한 IP 이외에는 모두 접근금지된다.

되기는 개뿔.

최초에 Rocky 9 를 깔면, ssh 가 기본 탑재되어 있다. 물론 일부러 설치를 제외하면 안 되긴 하겠지만. 어쨌던. 
그 상황이 이미 ssh daemon 이 모든 IP 가 접속 가능하도록 열려 있는 상태라, 그 상태에서 --add-source 한다고 영향이 없는 것으로 보인다.
어쨌던, 그래서, 인터넷에 나와있는 설명처럼 "허가할 IP 를 등록" 하는 걸로는 해결이 안 되고, 
거꾸로 "거부할 목록과 허가할 목록을 둘 다 등록" 해야만 제대로 작동한다. 

근데 두 개 다 등록하려면, 이게 좀.... 미묘하게 불편한 게 있다. 
그래서 만약 본인이 접속을 허용하려는 IP 가 단 한 개 혹은 한 개 대역만이라면, not 구문을 이용하는거다. 

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source not address="1.2.3.4" drop'
# firewall-cmd --reload


그럼 , 여기서 "서로 다른 아이피 대역을 두 개 등록하려면 어떻게 해야 되는거야?" 라고 생각하는 사람이 있을거다.
축하한다. 너님은 삽질을 해야 된다. 
예를 들어 허가 IP 가 1.2.3.4 와 10.1.1.2 두 개인 경우,

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" accept'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.1.2" accept'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source not address="1.2.3.4" reject'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source not address="10.1.1.2" reject'
# firewall-cmd --reload

이러면 안된다. 모두 다 접근 불가 된다. 왜냐면 세 번째, 네 번째 not 룰에서 모든 아이피가 reject 로 빠져 버리거든.
인터넷 문서에서는 이 경우 
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" accept'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.1.2" accept'
# firewall-cmd --reload

만으로 된다고 했지만, 안 된다. 해 보면 알꺼다. 
아래처럼 삽질을 해야 된다.

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="2.0.0.0/8" reject'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="3.0.0.0/8" reject'
...
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="9.0.0.0/8" reject'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="11.0.0.0/8" reject'
...
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="255.0.0.0/8" reject'

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4/24" reject'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" accept'

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.1.2/24" reject'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.1.2" accept'
# firewall-cmd --reload


당연히 미쳐 돌아가는 설정이지만, 어쩌라고. 아쉬운 사람이 해야지.


참고 : 

sshd_config 로 IP 접속제한 설정. 
https://syuda.tistory.com/28


ssh 데몬 포트 변경시 selinux 설정 추가 필요. + firewall 등록 필요 
https://not-to-be-reset.tistory.com/48


반응형