KRX(한국거래소) 시세 정보는 보통 코스콤(Koscom)의 KOSMOS 시스템을 통해 UDP Multicast 방식으로 전송됩니다. 개발 서버에서 이 데이터를 확인하기 위해서는 단순히 포트를 여는 것을 넘어, **Multicast Group에 가입(Join)**하고 패킷을 캡처하는 과정이 필요합니다.
주요 상황별 커맨드를 정리해 드립니다.
1. 네트워크 환경 확인
Multicast 패킷이 들어오는 인터페이스를 먼저 확인해야 합니다.
# 네트워크 인터페이스 리스트 확인 (예: eth0, enp0s3 등)
ip addr
# 멀티캐스트 라우팅 경로 확인
route -n
# 만약 멀티캐스트 대역(224.0.0.0/4)에 대한 경로가 없다면 추가 (필요 시)
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
2. tcpdump를 이용한 패킷 수신 확인 (가장 기본)
데이터가 실제로 네트워크 카드까지 도달하고 있는지 확인합니다. KRX 시세는 바이너리(ASCII/EBCDIC 혼합 또는 Binary)이므로 -X 옵션이 유용합니다.
# 특정 포트(예: 12345)로 들어오는 UDP 패킷 확인
sudo tcpdump -i eth0 udp port 12345 -X -nn
# 특정 멀티캐스트 IP와 포트를 지정하여 확인
sudo tcpdump -i eth0 host 239.XXX.XXX.XXX and udp port 12345 -vv
-
-i: 인터페이스명
-
-X: 데이터 내용을 Hex와 ASCII로 표시
-
-nn: 호스트와 포트 번호를 이름이 아닌 숫자로 표시
3. socat를 이용한 멀티캐스트 그룹 가입 및 데이터 출력
tcpdump는 단순히 흐르는 패킷을 보지만, 개발 서버의 OS가 해당 멀티캐스트 그룹에 가입(IGMP Join)해야 패킷을 지속적으로 받아올 수 있습니다. socat은 이를 간편하게 수행합니다.
# 멀티캐스트 그룹에 가입하여 데이터를 표준 출력으로 확인
# IP: 239.1.1.1, PORT: 12345 가정
socat UDP4-RECVFROM:12345,ip-add-membership=239.1.1.1:eth0,fork -
4. tshark (Wireshark CLI)를 이용한 상세 분석
패킷의 구조를 좀 더 명확히 보고 싶을 때 사용합니다.
# 패킷을 캡처하여 파일로 저장 (나중에 Wireshark GUI에서 분석 가능)
sudo tshark -i eth0 -f "udp port 12345" -w krx_test.pcap
# 실시간으로 페이로드(데이터)만 추출해서 보기
sudo tshark -i eth0 -f "udp port 12345" -T fields -e data
5. Python 스크립트를 이용한 수신 테스트 (추천)

실제 개발 환경에서는 프로그램이 데이터를 처리해야 하므로, 간단한 수신 스크립트를 작성해 보는 것이 가장 확실합니다. KRX 시세는 전문 규격(Fixed Length)이므로 바이트 단위로 읽어야 합니다.
import socket
import struct
MCAST_GRP = '239.1.1.1' # 코스콤에서 제공한 그룹 IP
MCAST_PORT = 12345 # 코스콤에서 제공한 포트
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 포트 바인딩
sock.bind(('', MCAST_PORT))
# 멀티캐스트 그룹 가입 설정
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
print(f"Listening for KRX data on {MCAST_GRP}:{MCAST_PORT}...")
while True:
data, addr = sock.recvfrom(2048) # 보통 시세 패킷은 1500바이트 이하
print(f"Received {len(data)} bytes from {addr}")
print(data) # 데이터 전문 출력
6. 방화벽 확인 (중요)
데이터가 보이지 않는다면 방화벽에서 UDP 및 해당 포트를 차단하고 있을 확률이 매우 높습니다.
# ufw 사용 시
sudo ufw allow 12345/udp
# iptables 사용 시
sudo iptables -A INPUT -p udp --dport 12345 -j ACCEPT
요약 체크리스트
-
회선 확인: 코스콤 전용선 또는 VPN이 연결되어 있는가?
-
IP/Port: 수신하려는 시세 정보(주식, 선물, 옵션 등)의 정확한 Multicast IP와 Port를 알고 있는가?
-
IGMP: 서버가 IGMP Join 메시지를 보내고 있는가? (socat이나 Python 예제 사용)
-
MTU: 네트워크 장비의 MTU 설정이 패킷 크기보다 작아서 짤리고 있지는 않은가?
가장 먼저 **tcpdump**로 패킷이 인터페이스에 찍히는지 확인하신 후, 데이터가 안 들어온다면 IGMP Join(가입) 절차가 누락되었는지 확인해 보시기 바랍니다.