Remark:
firewalld 은 zone 기준으로 세팅해보자
1. firewalld zone Check
|
1 2 3 |
# firewall-cmd --get-zones |
|
1 2 3 4 |
# firewall-cmd --get-zones block cloud dmz drop external home internal mysql-access public scouter trusted work |
2. zone add
|
1 2 3 |
# firewall-cmd --new-zone=mysql-access --permanent |
2.1 zone delete
|
1 2 3 |
# firewall-cmd --permanent --delete-zone=mysql-access |
3. mysql-access 192.168.0.111 allow
|
1 2 3 |
# firewall-cmd --zone=mysql-access --add-source=192.168.0.111 --permanent |
4. mysql-access port=3306/tcp allow
|
1 2 3 |
# firewall-cmd --zone=mysql-access --add-port=3306/tcp --permanent |
5. firewall reload
|
1 2 3 |
# firewall-cmd --reload |
비고. port=50000-50100/tcp allow
|
1 2 3 |
firewall-cmd --add-port=50000-50100/tcp --permanent |
🔷 1. 왜 별도 Zone을 쓰는가?
기본(public) zone에 전부 열어버리면:
|
1 2 3 |
모든 외부 IP → MySQL 접속 가능 ❌ (위험) |
👉 대신:
|
1 2 3 4 |
특정 IP → mysql-access zone → 3306 허용 그 외 → public zone → 차단 |
✔ 보안 강화
✔ 정책 분리
✔ 관리 쉬움
🔷 2. 동작 구조
|
1 2 3 4 5 6 7 8 9 |
[접속 IP] ↓ [source 매칭] ↓ [Zone 선택] ↓ [해당 Zone 규칙 적용] |
👉 핵심: IP → Zone → 규칙
🔷 3. 실제 설정 흐름 (MySQL 예시)
① Zone 생성
|
1 2 3 4 |
firewall-cmd --new-zone=mysql-access --permanent firewall-cmd --reload |
② 특정 IP를 Zone에 연결
|
1 2 3 4 |
firewall-cmd --zone=mysql-access \ --add-source=203.0.113.10 --permanent |
👉 이 IP는 이제 mysql-access 규칙 적용
③ MySQL 포트 허용
|
1 2 3 4 |
firewall-cmd --zone=mysql-access \ --add-port=3306/tcp --permanent |
④ 적용
|
1 2 3 |
firewall-cmd --reload |
🔷 4. 결과
| 접속자 | 적용 Zone | 결과 |
|---|---|---|
| 203.0.113.10 | mysql-access | MySQL 접속 가능 |
| 그 외 IP | public | 차단 |
🔷 5. public Zone은 최소화
|
1 2 3 |
firewall-cmd --zone=public --list-all |
👉 public에는 보통:
- 80 (HTTP)
- 443 (HTTPS)
만 열어둠
🔷 6. 여러 IP / 대역도 가능
|
1 2 3 4 5 |
# 단일 IP --add-source=203.0.113.10# 대역 --add-source=192.168.1.0/24 |
🔷 7. Zone 확인
|
1 2 3 4 5 |
firewall-cmd --get-active-zones firewall-cmd --zone=mysql-access --list-all |
🔷 8. 실무에서 많이 쓰는 패턴
✔ DB 서버
- mysql-access → 특정 IP만 3306 허용
- public → 닫힘
✔ 웹 서버
- public → 80, 443
- admin-zone → 관리자 IP만 SSH 허용
🔥 한 줄 핵심
👉 “IP별로 Zone을 나누고, Zone마다 다른 방화벽 정책을 적용하는 방식”
🔷 1. public zone에 3306이 열려있는지 확인 (가장 중요)
|
1 2 3 |
firewall-cmd --zone=public --list-all |
예시 출력:
|
1 2 3 4 5 |
public (active) services: ssh dhcpv6-client ports: |
👉 여기서 확인:
ports:에 3306/tcp가 없어야 정상- 있으면 → 외부 누구나 접속 가능 (❌)
🔷 2. 특정 포트만 직접 확인
|
1 2 3 |
firewall-cmd --zone=public --query-port=3306/tcp |
결과:
no→ 차단됨 (정상)yes→ 열림 (위험)
🔷 3. 실제 어떤 Zone이 적용되는지 확인
|
1 2 3 |
firewall-cmd --get-active-zones |
예:
|
1 2 3 4 5 6 |
public interfaces: eth0 mysql-access sources: 203.0.113.10 |
👉 의미:
- 일반 접속 → public
- 특정 IP → mysql-access
🔷 4. mysql-access zone 확인
|
1 2 3 |
firewall-cmd --zone=mysql-access --list-all |
예:
|
1 2 3 4 5 |
mysql-access sources: 203.0.113.10 ports: 3306/tcp |
👉 이 IP만 허용됨
🔷 5. 실제 차단 테스트 (가장 확실)
❌ 허용되지 않은 IP에서 테스트
|
1 2 3 |
telnet 서버IP 3306 |
또는
|
1 2 3 |
nc -zv 서버IP 3306 |
결과:
Connection refused/ timeout → 차단됨 ✅- 연결됨 → 설정 잘못됨 ❌
✅ 허용된 IP에서 테스트
|
1 2 3 |
telnet 서버IP 3306 |
→ 연결되어야 정상
🔷 6. 로그로 확인 (고급)
|
1 2 3 4 5 6 7 |
journalctl -xe | grep firewalld 또는: firewall-cmd --set-log-denied=all |
👉 차단 로그 확인 가능
🔷 7. 실수 체크 포인트 (중요)
❗ MySQL이 모든 IP에서 listen 중인지
|
1 2 3 4 5 6 7 8 9 |
netstat -tulnp | grep 3306 또는 ss -tulnp | grep 3306 예: |
예:
|
1 2 3 |
0.0.0.0:3306 ← 외부 허용 상태 |
👉 방화벽만 믿지 말고 같이 확인
🔥 최종 체크 공식
|
1 2 3 |
1. public zone에 3306 없음 ✔<br>2. mysql-access zone에만 3306 있음 ✔<br>3. 특정 IP만 source 등록 ✔<br>4. 외부 테스트 시 연결 안됨 ✔ |
