우분투 실전 명령어 | socat으로 포트 포워딩과 프로토콜 브릿지 점검
우분투 실전 명령어 | socat으로 포트 포워딩과 프로토콜 브릿지 점검
언제 쓰는가
로컬에서 뜬 서비스를 원격으로 잠깐 노출해야 할 때, 또는 TCP/UDP를 서로 다른 형태로 중계해야 할 때 socat이 빠르게 먹힙니다. SSH 터널보다 옵션이 세밀해서 리스닝 주소, 포트 재사용, 포크 동작을 직접 제어할 수 있습니다. 운영 중에는 임시 우회 경로를 만들 때 특히 유용합니다.
바로 쓰는 명령어
# 0.0.0.0:8080으로 들어온 TCP를 127.0.0.1:3000으로 전달
socat TCP-LISTEN:8080,reuseaddr,fork TCP:127.0.0.1:3000
# 원격 API 점검용: 로컬 18080 -> 10.20.30.40:8080
socat TCP-LISTEN:18080,reuseaddr,fork TCP:10.20.30.40:8080
# UDP 5353 수신을 다른 호스트로 포워딩
socat UDP-LISTEN:5353,reuseaddr,fork UDP:192.168.0.50:5353
핵심 옵션/패턴
- TCP-LISTEN:로 수신 소켓을 열고, 뒤쪽 TCP: 또는 UDP:로 목적지를 지정합니다.
- reuseaddr은 재시작 직후 포트 재바인딩 실패를 줄여줍니다.
- fork를 넣으면 연결마다 자식 프로세스를 분기해 동시 접속을 처리합니다.
- bind=0.0.0.0 또는 bind=127.0.0.1로 노출 범위를 제한할 수 있습니다.
- -d -d를 붙이면 디버그 로그가 자세히 나와 원인 추적이 쉬워집니다.
명령 출력 예시
$ socat -d -d TCP-LISTEN:18080,reuseaddr,fork TCP:10.20.30.40:8080
2026/02/19 02:15:03 socat[4211] N listening on AF=2 0.0.0.0:18080
2026/02/19 02:15:11 socat[4211] N accepting connection from AF=2 127.0.0.1:53322 on AF=2 127.0.0.1:18080
2026/02/19 02:15:11 socat[4211] N opening connection to AF=2 10.20.30.40:8080
2026/02/19 02:15:11 socat[4211] N successfully connected from local address AF=2 10.20.30.10:47210
$ ss -lntp | grep 18080
LISTEN 0 128 0.0.0.0:18080 0.0.0.0:* users:(("socat",pid=4211,fd=5))
자주 하는 실수
- fork 없이 실행해서 첫 연결만 처리하고 다음 접속이 막히는 경우가 많습니다.
- 내부 서비스 포트가 localhost 바인딩인지 확인하지 않아, 연결은 됐는데 응답이 없는 상황이 생깁니다.
- 방화벽에서 리스닝 포트를 열지 않아 socat 문제로 오해하는 경우가 자주 있습니다.
검증 방법
# 리스닝 확인
ss -lntup | grep -E '8080|18080|5353'
# 로컬 헬스체크
curl -i http://127.0.0.1:18080/health
# 패킷 흐름 확인
sudo tcpdump -ni any port 18080 -c 20
curl 응답 코드가 200/204인지 먼저 확인하고, 실패하면 tcpdump에서 수신과 송신이 모두 보이는지 분리해서 봅니다. 수신만 있고 송신이 없으면 목적지 지정이 틀렸을 가능성이 큽니다.
운영 팁
임시 운영이라도 systemd-run으로 감싸 두면 종료와 로그 확인이 훨씬 편합니다. 외부 노출이 필요 없는 점검은 bind=127.0.0.1로 제한해 사고 면적을 줄이는 쪽이 안전합니다. 장기 운영이면 socat 대신 HAProxy나 nginx stream으로 이관하는 편이 관리성이 좋습니다.
출처
- socat 매뉴얼
- Ubuntu Manpages
- DigitalOcean Community (socat 사용 사례)