web proxy에서 client ip를 유지하는 것에 대한 질문입니다.

karkayan의 이미지

보통의 경우 web proxy를 거쳐서 접속하게 되면, 서버에서 보이는 client의 ip는 proxy server의 ip가 된다고 알고 있습니다. 이건 proxy server에서 web server로 http request를 보내게 될테니 당연한 것 같구요.

그런데 proxy를 거쳤을때 server에 client의 ip를 전달할 수 있는 공통적인 방법이 있을까요?

몇가지 방법을 생각해 봤는데,

1. proxy에서 web server로 request를 보낼 때 http header에 client의 ip를 따로 적는다.
이 방법의 경우에는 web server측에서도 별도로 header 정보를 처리해야 할 것 같아서, 기존의 코드와 호환이 되지 않을 것 같습니다. HTTP 1.1에 client의 정보를 적을 수 있는 header 항목이 따로 있는지 살펴봤는데 없는 것 같더군요.

2. proxy에서 web server로 request를 보낼 때 raw socket등을 사용해서 packet의 ip를 client의 ip로 적는다.
이렇게 하면 보낼 수야 있겠지만, tcp 통신 상에서라든가 여러모로 이상해 질 것 같네요. 중간에 router에서도 packet을 drop시켜 버릴 가능성이 높은 것 같고. 이 방법은 proxy server가 web server 앞에서 일종의 gateway 역할을 해주는 경우에 적용이 가능 할 것 같은데, 원하는 것은 gateway 형태의 구성이 아니라 별개의 web server와 별개의 proxy 형태의 구성이라서 안 될것 같습니다.

저는 아무리 생각해도 서버 측에서 별도의 처리 과정 없이는 불가능 할 것 같은데, 아는 분이 방법은 모르겠는데 된다고 들었다라고 하시네요. (물론 된다고 말한 측에다가 맡기면 되지만, 꽤 많은 돈이 들어서 프로젝트에 적용이 힘들다고 하시네요)

혹시 이런 경우에 어떤 방법이 사용될 수 있을까요?

godyang의 이미지

예전에 KT에서 공유기 탐지를 하면서 자바애플릿을 이용해서 실제 클라이언트의 IP를 수집한 적이 있었습니다.

http://wariua.egloos.com/2255292

플래시를 사용해도 비슷하게 구현할 수 있다고 합니다.

이걸 약간 응용해서(?) 비슷한 프로그램을 구현한 뒤에, 웹페이지 속에 몰래(!) 숨겨두는 방법을 쓰면 될 것 같습니다.

장점은 클라이언트의 실제 IP를 알 수 있다는 것이고...
단점은 NAT를 사용하는 환경에서는 가상 IP가 표시되겠네요. 또한 클라이언트에서 자바애플릿, 플래시와 같은 addon을 꺼버리면 문제가 되겠네요.

또 다른 방법은 클라이언트가 접속할 때 해당 IP에서 프록시 서버가 동작하는지 확인하는 것도 있겠으나... 자칫 해킹시도로 오인받을 수도 있으니...

글 쓰고나니 전부 서버 측에서 별도의 처리에 해당되는 작업이긴 합니다만...
그래도 구현하는데 큰 노력과 비용은 들지 않을 것 같습니다.

ymir의 이미지

Linux Kernel 2.6.28.x 부터 Netfilter 쪽에 Transparent Proxy (tproxy 4.1.0) 가 추가되었습니다.
Squid 와 같은 http cache program 에서 transparent proxy 를 구성할 때 사용되던 겁니다.

Tproxy 는 non-local ip 에 대해 bind 를 할 수 있으니..
web proxy 에서는 client 의 ip 로 bind 를 하고, server 에 connect 를 하면 됩니다.

그 이전 버전의 kernel 에 대해서는 patch 형태로 받을 수 있습니다.
http://www.balabit.com/downloads/files/tproxy/

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

brucewang의 이미지

문의 드립니다.

Tproxy의 경우는 클라이언트가 존재하는 네트워크 영역에 존재해서 packet 수집및 forward를 하게 되어 있는 것 처럼 설명이 되어 있는데요,
외부 네트워크의 WebServer들에 대해서는 역시나 Tproxy쪽의 ip가 소스 ip가 되는게 아닐까요? 그렇지 않으면 경로상의 여러 라우터에서 제대로 라우팅이 되지 않지 않을까요?

원글님의 경우 다양한 외부 네트워크에 존재하는 타겟 Web server에서 클라이언트의 ip를 확인할 수 있도록 해주기를 바라시는 것 같은데..

-------------------------------------------------
$yes 4 8 15 16 23 42

-------------------------------------------------
$yes 4 8 15 16 23 42

karkayan의 이미지

brucewang님 말씀 처럼 제가 생각하고 있는 경우가 client, proxy, web server가 모두 별개의 네트워크에서 돌아가고 있는 상황을 생각하고 있는 거라서,
라우터에서 라우팅이 제대로 되지 않을까 하는 문제로 고민하고 있었습니다.

제가 원글에서의 설명이 조금 불분명했던 모양이네요.

이놈의 떨어지는 문재때문에...

ymir의 이미지

답글이 늦었습니다.. ;;

g/w 형태의 routing mode 나 bridge mode 로 세팅 가능하니까..
위치는 client 쪽이던 서버 쪽이던, routing 경로상의 어디든 설정 가능할 것으로 보입니다.
말 그대로 transparent 하게 장비의 존재를 감추고..
서버에 client 가 proxy 를 거치지 않고, 직접 접속한 것처럼 보이게 합니다.
에, 이 경우에는 서버에게 proxy 를 쓰고 있다는 것을 알리면서..
client 의 IP 를 알려주는 방식은 될 수 없습니다..
원글의 의도와는 약간 다른 듯 합니다만, 이런 방식도 참고가 되실 듯 하여 올렸습니다.

참고로, proxy appl. 에는 netfilter 의 dnat 를 통해 packet 이 전달되므로..
netfilter 에서 제공하는 getsockopt(..,SO_ORIGINAL_DST, ..) 를 사용하여..
original destination address 를 가져오도록 작성해야 합니다.
client 와 server 에는 별도로 변경사항이 필요 없구요..

추가>
음... 본문을 여러번 읽어보니...
proxy 를 만들어 쓰는게 아니라, 그냥 알려진 공개 proxy 를 사용했을 때의 경우인것 같네요.. ;;
그런 경우라면, 이건 그닥 도움이 안 되는 글이로군요... ;;;;;

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

brucewang의 이미지

궁금증을 풀어주셔서 감사합니다.
Tproxy 소스로 보다 구성이 자유로운 소규모용 보안장비를 만들수도 있겠네요.

-------------------------------------------------
$yes 4 8 15 16 23 42

-------------------------------------------------
$yes 4 8 15 16 23 42

danskesb의 이미지

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.