리눅스 firewalld는 기본적으로 ssh 서비스를 허용한다. 특정 ip에서만 ssh를 접속할 수 있게 하려면 ssh 포트에 특정 ip만 인바운드 연결할 수 있도록 설정하면 된다.
rich-rule을 사용하면 firewalld에서 세부적인 설정이 가능하다. 적용 형식은 아래와 같다.
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="ipv4 주소" port protocol="tcp" port="포트번호" accept' --permanent
1. rich rule 추가
ssh가 사용하는 22번 포트에 192.168.91.1 ip만 접속할 수 있게 해보자.
[root@newhost zones]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.91.1" port protocol="tcp" port="22" accept' --permanent
2. ssh 서비스 삭제
그 다음은 기본으로 등록되어 있는 ssh 서비스를 삭제하는 것이다. 현상태에서 리치룰만 추가로 등록하면 여전히 여러 ip에서 ssh 연결이 가능하다.
작업 순서에 유의해야 된다. ssh 서비스 먼저 삭제하고 적용시켜버리면 rich rule 등록 전 세션이 끊어지는 참사가 벌어진다. 서버 환경에 따라 세션을 연결해놓는 방법이 소용 없을 수 있다. 그냥 실시간으로 끊어버린다.
[root@newhost zones]# firewall-cmd --zone=public --remove-service=ssh --permanent
3. firewall reload
이제 reload 하면 변경사항이 적용된다. 다시 한번 말한다. ssh 연결이 필요한 ip에 ssh를 rich rule에 잊지 않고 적용했는지 체크한다. 그래야 원격 세션이 유지된다.
[root@newhost zones]# firewall-cmd --reload
4. 적용 사항 확인
적용된 설정을 확인한다.
[root@newhost zones]# firewall-cmd --list-all
아래는 차례로 명령어를 입력한 결과다.
5. 세션 접속 확인
지정한 ip에서 22번 포트로 정상 접속되는 것이 확인된다.