1. 실습 환경
이번 실습에서는 Kali Linux에서 Rocky Linux 서버로 TCP 패킷을 전송하고 포트별 응답을 확인한다.
[Kali Linux]
IP : 192.168.11.36
│
│ TCP SYN / ACK
▼
[Rocky Linux]
IP : 192.168.11.17
확인할 포트
22 : SSH
23 : Telnet
80 : HTTP
먼저 두 장비가 서로 통신되는지 확인한다.
Kali에서:
ping 192.168.11.17
응답이 정상적으로 돌아오면 실습을 진행한다.
2. 먼저 포트의 의미 알아두기
이번에 확인하는 포트는 다음과 같다.
| 22 | SSH | 암호화된 원격 접속 |
| 23 | Telnet | 원격 접속 |
| 80 | HTTP | 웹 서버 |
Rocky Linux에서 실제로 포트가 열려 있는지도 확인할 수 있다.
ss -lntp
특정 포트만 보고 싶다면:
ss -lntp | grep :22
ss -lntp | grep :23
ss -lntp | grep :80
예를 들어 23번에 LISTEN이 나오면 Telnet 서버가 현재 연결을 기다리고 있다는 뜻이다.
3. SYN 패킷 실습
SYN이란?
TCP에서 상대방에게
"너랑 연결하고 싶은데 연결 가능해?"
라고 물어보는 패킷이라고 생각하면 쉽다.
정상적인 TCP 연결 과정은:
Kali Linux
SYN ──────────────▶
◀────────────── SYN + ACK
ACK ──────────────▶
연결 완료
이를 TCP 3-Way Handshake라고 한다.
4. SYN 패킷을 22번 포트로 보내기
Kali에서 hping3를 사용할 수 있다.
hping3 -S -p 22 192.168.11.17
옵션은:
-S
→ SYN 플래그 설정
-p 22
→ 목적지 포트 22번
192.168.11.17
→ 목적지 Linux 서버
즉:
192.168.11.17의 22번 포트에 SYN 패킷을 보내라.
라는 뜻이다.
멈추려면:
Ctrl + C
5. 23번, 80번도 확인
Telnet:
hping3 -S -p 23 192.168.11.17
HTTP:
hping3 -S -p 80 192.168.11.17
따라서 SYN 실습은 세 명령어를 비교하면 된다.
hping3 -S -p 22 192.168.11.17
hping3 -S -p 23 192.168.11.17
hping3 -S -p 80 192.168.11.17
6. SYN을 보냈을 때 응답 해석
여기가 이번 실습에서 가장 중요하다.
포트가 열려 있으면
Kali:
SYN →
Linux:
← SYN + ACK
즉:
flags=SA
같은 응답을 볼 수 있다.
S는 SYN, A는 ACK다.
따라서:
SA
= SYN + ACK
= 해당 포트가 열려 있음
이라고 이해하면 된다.
포트가 닫혀 있으면
Linux에서 보통:
← RST + ACK
응답이 돌아온다.
hping3에서는 다음과 비슷하게 보일 수 있다.
flags=RA
R은 RST(reset)다.
따라서:
RA
= RST + ACK
= 해당 포트가 닫혀 있음
이라고 보면 된다.
7. SYN 실습 결과 정리 방법
예를 들어 결과가 다음처럼 나왔다고 해보자.
22번 → SA
23번 → SA
80번 → RA
그러면:
| 22 | SYN+ACK | OPEN |
| 23 | SYN+ACK | OPEN |
| 80 | RST+ACK | CLOSED |
이렇게 정리할 수 있다.
실제 결과는 네 서버에서 실행 중인 서비스에 따라 달라진다.
8. ACK 패킷 보내기
두 번째 과제는:
Linux의 여러 포트(22, 23, 80)에 ACK 패킷을 보내고 응답 확인
이다.
SYN 대신 ACK 플래그를 넣는다.
22번:
hping3 -A -p 22 192.168.11.17
23번:
hping3 -A -p 23 192.168.11.17
80번:
hping3 -A -p 80 192.168.11.17
차이는 아주 간단하다.
-S = SYN
-A = ACK
9. 그런데 ACK는 왜 보내는가?
이 부분이 헷갈릴 수 있어.
SYN은:
"연결 시작할래?"
라는 정상적인 TCP 연결 시작 패킷이다.
그런데 ACK는 보통 이미 연결이 이루어진 다음에 사용하는 패킷이다.
그런데 갑자기 아무 연결도 하지 않은 상태에서:
ACK →
를 보내는 것이다.
Linux 입장에서는:
"우리 연결한 적이 없는데 갑자기 ACK가 왜 오지?"
가 된다.
그래서 TCP 스택이나 방화벽 상태에 따라 RST 응답 또는 무응답이 나타날 수 있다.
10. SYN과 ACK 실습의 차이
이번 과제에서 꼭 구분해야 한다.
| SYN 전송 | 연결 요청 | 포트 OPEN/CLOSED |
| ACK 전송 | 기존 연결인 것처럼 ACK 전송 | 방화벽 필터링 여부 등의 반응 |
쉽게 비유하면:
SYN
집의 초인종을 누르는 것.
나: 계세요?
상대: 네, 있습니다!
→ SYN / SYN+ACK
ACK
초인종도 안 눌렀는데 갑자기:
나: 네, 알겠습니다!
라고 말하는 것.
상대는:
누구세요?
하면서 연결을 초기화하거나, 방화벽이 그냥 무시할 수도 있다.
11. ACK Scan에서 중요한 점
ACK 패킷은 포트가 열렸는지 확인하는 용도로 사용하는 SYN과 목적이 다르다.
ACK에 RST가 돌아왔다고 해서:
22번 포트 OPEN
이라고 바로 판단하면 안 된다.
ACK Scan은 보통:
RST 응답
→ 패킷이 호스트까지 도달함
→ UNFILTERED 가능성
응답 없음
→ 방화벽에서 차단했을 가능성
→ FILTERED 가능성
처럼 방화벽이 패킷을 필터링하는지 보는 데 사용한다.
이 부분은 시험이나 과제에서도 꽤 중요하다.
12. Wireshark로 보면 더 이해하기 쉽다
강사님이 패킷 분석까지 요구한다면 Kali에서 Wireshark를 실행하고 패킷을 직접 보면 좋다.
필터에:
ip.addr == 192.168.11.17
을 입력하면 17번 서버와 관련된 패킷만 볼 수 있다.
더 정확하게 22번 포트만 보려면:
tcp.port == 22
23번:
tcp.port == 23
80번:
tcp.port == 80
13. SYN 패킷을 Wireshark에서 보는 방법
예를 들어 다음 패킷이 있다면:
192.168.11.36 → 192.168.11.17
TCP
Src Port: 45678
Dst Port: 23
Flags: SYN
뜻은:
출발지
192.168.11.36
Kali
↓ SYN
목적지
192.168.11.17
Rocky Linux
23번 Telnet 포트
이다.
응답으로:
192.168.11.17 → 192.168.11.36
Flags: SYN, ACK
가 왔다면:
23번 포트가 열려 있고 연결 요청을 받아들였다는 의미
로 해석할 수 있다.
14. 지금 네 환경에서는
이미 앞에서 Kali에서:
telnet 192.168.11.17
을 실행해서
Connected to 192.168.11.17.
까지 확인했어.
따라서 현재 17번 서버의 23번 Telnet 포트는 실제로 열려 있는 상태라고 볼 수 있어.
그래서 SYN 실습에서:
hping3 -S -p 23 192.168.11.17
을 실행하면 정상적인 환경이라면 23번에서 SA(SYN+ACK) 응답을 기대할 수 있어.
15. 실습할 때 추천 순서
다음에 혼자 다시 할 때는 이 순서대로 하면 돼.
① IP 확인
Kali
192.168.11.36
Rocky
192.168.11.17
↓
② 통신 확인
ping 192.168.11.17
↓
③ Linux 포트 확인
ss -lntp
↓
④ SYN 전송
22
23
80
↓
⑤ 응답 비교
SA → OPEN
RA → CLOSED
↓
⑥ ACK 전송
22
23
80
↓
⑦ RST / 무응답 비교
↓
⑧ Wireshark로 패킷 확인
블로그용 실습 명령어 모음
Kali에서 실행:
# Linux와 통신 확인
ping 192.168.11.17
# SYN 패킷 전송
hping3 -S -p 22 192.168.11.17
hping3 -S -p 23 192.168.11.17
hping3 -S -p 80 192.168.11.17
# ACK 패킷 전송
hping3 -A -p 22 192.168.11.17
hping3 -A -p 23 192.168.11.17
hping3 -A -p 80 192.168.11.17
Rocky Linux에서 확인:
ss -lntp
ss -lntp | grep :22
ss -lntp | grep :23
ss -lntp | grep :80
Wireshark 필터:
ip.addr == 192.168.11.17
또는:
tcp.port == 22
tcp.port == 23
tcp.port == 80
마지막으로 이것만 기억하면 돼
SYN = "연결해도 돼?"
SYN + ACK = "응, 연결 가능해"
→ 포트 OPEN
RST + ACK = "여기 연결 안 받아"
→ 포트 CLOSED
ACK Scan에서 RST
→ 목적지까지 패킷이 전달됨
→ UNFILTERED 가능
ACK Scan에서 응답 없음
→ 방화벽 차단 가능
→ FILTERED 가능