본문 바로가기
개발 및 운영/프로그래밍

프록시 환경 libwebsockets 에서 실제 클라이언트 IP 헤더 패치

by Joseph.Lee 2015. 7. 31.

2015.07.04. 01:48



클라이언트가 Proxy서버를 통해서 WebSocket서버로 접근을 해야 하는 상황(베스천 호스트)에서

libwebsockets 라이브러리를 이용하면 실제 클라이언트의 IP을 받아오지 못하고 프록시 서버의 IP만 알 수 있습니다.

libwebsockets_get_peer_addresses 이용 )

그래서... 방법이 없나... 하다가... 없더라 구요...ㅎ...

왜 프록시 환경은 고려하지 않은건지...ㅠㅠ

libwebsockets 에서 X-Forwarded-For 헤더를 읽어올 수 없었습니다.

결국 소스를 수정하는 방법밖에 없어서 수정했습니다.

다행이 lws_hdr_copy 관련된 부분을 쉽게 찾아 수정하기 많이 어렵진 않았습니다...

뭐... 보시면 아시겠지만 lws_token_indexes 순서 맞춰주는게 어려웠죠...ㅠ

(다음 패치때는 정식으로 지원하길...)


libwebsockets-1.4 소스 패치 파일입니다.

첨부파일 또는 https://www.dropbox.com/s/rhji8qn991bb4rk/libwebsocket.patch?dl=0


소스디렉토리에 들어가서 (libwebsockets)

patch -p1 < libwebsocket.patch 하시면 됩니다.


char realip[128];

if (lws_hdr_total_length(wsi, WSI_TOKEN_X_FORWARDED_FOR)) {

lws_hdr_copy(wsi, realip, sizeof(realip), WSI_TOKEN_X_FORWARDED_FOR);

}


이런식으로 X-Forwarded-For 헤더가 있으면 실제 IP을 받아오는 식으로 하시면 됩니다.


WSI_TOKEN_X_FORWARDED_SERVER

WSI_TOKEN_X_FORWARDED_FOR

WSI_TOKEN_X_FORWARDED_HOST

이렇게 3가지 추가하였습니다.


참고로 sockaddr_in 같은 형식으로 변환하려면 getaddrinfo함수를 이용하시면 됩니다.

반응형

댓글