클라이언트에서 PostgreSQL 서버에 처음 접속하는 상황에서, 다음 항목들을 순차적으로 점검하면 연결 상태를 정확히 파악할 수 있습니다. 아래는 체크리스트와 각 단계에서 사용하는 명령어들입니다.
1. 서버까지 경로가 열려 있는지 확인 (네트워크 연결 확인)
🔹 ping 명령어로 서버 IP 확인
ping <서버_IP>
- 예: ping 192.168.1.100
- 응답이 오면 IP 레벨에서는 접근 가능
🔹 traceroute (Linux/macOS) 또는 tracert (Windows)로 경로 확인
traceroute <서버_IP> # Linux/macOS
tracert <서버_IP> # Windows
- 경로 상 어디에서 패킷이 차단되는지 확인 가능
2. 서버의 포트가 열려 있는지 확인
PostgreSQL의 기본 포트는 5432입니다.
🔹 클라이언트에서 telnet 또는 nc (netcat) 사용
방법 A: telnet 사용
telnet <서버_IP> 5432
- 연결에 성공하면 커서가 깜빡이며 입력 대기 상태가 됨.
- 연결 실패 시 "Connection refused" 또는 timeout 에러 발생
방법 B: nc (netcat) 사용
nc -zv <서버_IP> 5432
- 출력 예시: Connection to <서버_IP> 5432 port [tcp/postgresql] succeeded!
3. 서버 측에서 포트가 열려 있고 수신 대기 중인지 확인
🔹 서버에서 PostgreSQL이 해당 포트에서 listen 중인지 확인
sudo netstat -tnlp | grep 5432
# 또는
sudo ss -tnlp | grep 5432
- 출력 예시:
- LISTEN 0 128 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=1234,fd=5))
- 0.0.0.0이면 모든 IP에서 접속 가능
- 127.0.0.1이면 로컬에서만 접속 가능 (수정 필요)
🔹 PostgreSQL 설정 확인
postgresql.conf 설정
listen_addresses = '*' # 또는 서버 IP
port = 5432
pg_hba.conf 설정
host all all 0.0.0.0/0 md5
설정 변경 후에는 PostgreSQL을 재시작해야 적용됩니다.
sudo systemctl restart postgresql
# 또는
sudo service postgresql restart
4. 서버에 TCP 연결 요청이 들어오는지 실시간으로 확인
🔹 tcpdump로 5432 포트에 대한 패킷 수신 확인
sudo tcpdump -i any port 5432
- 클라이언트에서 접속 시도하면 TCP SYN 등의 패킷이 잡혀야 함
- 아무 것도 안 보이면 방화벽, 라우팅, 보안 그룹 문제 가능성 있음
5. PostgreSQL 접속 테스트
클라이언트에서 실제 접속 시도:
psql -h <서버_IP> -U <사용자> -d <DB명>
6. 추가 점검: 방화벽
🔹 서버 방화벽 확인 (예: ufw, firewalld)
sudo ufw status # Ubuntu
sudo firewall-cmd --list-all # CentOS, RHEL
🔹 포트 열기 (예: Ubuntu)
sudo ufw allow 5432/tcp
7. Port 가 닫혀 있거나 방화벽에 막혀 있는 경우
TCP 연결 과정에서 tcpdump로 확인할 수 있는 패킷의 흐름은 포트가 열려 있는 경우와 닫혀 있거나 방화벽으로 막혀 있는 경우에 따라 다릅니다. 아래는 각각의 경우에 tcpdump로 캡처할 수 있는 TCP 3-way handshake 또는 에러 응답 패킷의 예시입니다.
1. 사용 명령어 예시
sudo tcpdump -i any port 5432 -nn
- -i any: 모든 인터페이스 감시
- -nn: 포트 번호 및 IP 주소를 그대로 표시
- port 5432: PostgreSQL 포트만 필터링
2. 정상적으로 포트가 열려 있고 연결이 되는 경우
TCP 3-Way Handshake
클라이언트 -> 서버 : SYN
서버 -> 클라이언트 : SYN, ACK
클라이언트 -> 서버 : ACK
📦 예시 패킷 (tcpdump 출력)
12:00:00.123456 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [S], seq 123456, win 64240, options [...], length 0
12:00:00.123789 IP 192.168.1.100.5432 > 192.168.1.50.54321: Flags [S.], seq 654321, ack 123457, win 65160, options [...], length 0
12:00:00.124000 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [ACK], ack 654322, win 64240, length 0
이후 PostgreSQL 프로토콜을 통한 데이터 교환이 시작됨
3. 서버의 포트가 닫혀 있거나 PostgreSQL이 해당 포트에서 Listen하지 않을 경우
TCP 연결 거부 (RST 응답)
📦 예시 패킷
12:00:00.223456 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [S], seq 123456, win 64240, options [...], length 0
12:00:00.223789 IP 192.168.1.100.5432 > 192.168.1.50.54321: Flags [R], seq 0, win 0, length 0
Flags [R]는 "Reset" 패킷으로, 서버가 해당 포트에서 수신 대기 중이 아니라는 의미입니다. 즉, OS가 "이 포트는 열려 있지 않다"고 알려주는 것.
4. 서버가 방화벽 등으로 인해 패킷을 드롭하고 응답하지 않는 경우
무응답 (Silent Drop)
📦 예시 패킷
12:00:00.323456 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [S], seq 123456, win 64240, options [...], length 0
이후 아무 응답도 없음 (SYN 패킷만 있고, 서버에서 RST/SYN-ACK 응답이 없음)
클라이언트는 일정 시간 후 Connection timed out 에러를 받음
5.요약 비교
상황 SYN → 응답 패킷 의미
✅ 포트 열림 | 있음 | SYN-ACK → ACK | 연결 성공 |
❌ 포트 닫힘 | 있음 | RST | 연결 거부 |
❌ 방화벽 | 있음 | 없음 | 무응답, 연결 시간 초과 |
좋습니다! 서버와 클라이언트 사이에 방화벽(Firewall) 이 있는 경우, TCP 연결 시도에 따라 tcpdump에서 어떤 패킷이 보이는지 예시로 설명드리겠습니다.
8. 방화벽이 클라이언트와 서버 사이에 위치한 경우
🔹 위치:
클라이언트 → 방화벽 (중간) → 서버
1. 정상 연결 (방화벽 허용)
🔸 조건:
- 방화벽이 TCP 포트 5432 (PostgreSQL 포트)를 허용하고 있을 때
📦 tcpdump (서버 측에서)
12:00:00.100000 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [S], seq 123456, win 64240, length 0
12:00:00.100200 IP 192.168.1.100.5432 > 192.168.1.50.54321: Flags [S.], seq 654321, ack 123457, win 65160, length 0
12:00:00.100300 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [ACK], ack 654322, win 64240, length 0
✅ 3-way handshake가 정상적으로 이루어지고 이후 PostgreSQL 연결 가능
2. 방화벽이 포트 5432를 차단할 때
시나리오 1: 방화벽이 SYN 패킷 자체를 드롭 (무응답 Drop)
📦 클라이언트에서 tcpdump
12:01:00.000000 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [S], seq 123456, win 64240, length 0
- 서버에서는 아무 것도 보이지 않음 (패킷이 서버에 도달하지 못함)
- 방화벽이 패킷을 조용히 폐기(Silent Drop)
클라이언트는 나중에 "Connection timed out" 오류를 받음
tcpdump는 서버 측에서는 아무 것도 캡처되지 않음
시나리오 2: 방화벽이 명시적으로 RST 패킷 반환
일부 보안 장비나 침입 방지 시스템(IPS)은 패킷을 차단하고 가짜 RST를 응답하는 경우도 있습니다.
📦 클라이언트에서
12:02:00.000000 IP 192.168.1.50.54321 > 192.168.1.100.5432: Flags [S], seq 123456, win 64240, length 0
12:02:00.000100 IP 192.168.1.100.5432 > 192.168.1.50.54321: Flags [R], seq 0, win 0, length 0
- 이 경우도 서버에서는 아무 응답이 없고, 중간 방화벽이 대신 응답한 것
- 클라이언트는 "Connection refused" 같은 메시지를 받게 됨
3. 요약: 방화벽이 있는 경우의 패킷 흐름
방화벽 동작 클라이언트 SYN 서버 SYN-ACK 결과 tcpdump에서 보임?
허용 | 전송됨 | 응답함 | 연결 성공 | O (클/서버 모두) |
드롭(Silent) | 전송됨 | 없음 | 타임아웃 | 클라이언트만 보임 |
RST 응답 | 전송됨 | RST 응답 | 연결 거부 | 클라이언트만 보임 (서버 X) |
4. 팁: 서버 측에서 아무 것도 보이지 않는다면?
- 방화벽이나 보안 장비에서 SYN 패킷이 차단되고 있을 가능성이 높음
- 클라이언트 쪽에서는 telnet, nc, psql 모두 timeout 발생
- 서버 측 tcpdump에는 아무 것도 안 찍힘
'DB > PostgreSQL' 카테고리의 다른 글
[ PostgreSQL ] pg_dump 백업 시 압축하는 방법 (0) | 2025.05.19 |
---|---|
[ PostgreSQL ] query 처리 모니터링 하기 (0) | 2025.05.02 |
[ PostgreSQL ] 부하 테스트 하기 (0) | 2025.05.02 |
[ PostgreSQL ] User - 사용자 생성하고 권한 주기 (0) | 2025.05.02 |
[ PostgreSQL ] Docker 이미지로 시작하기 (0) | 2025.05.01 |