Socket 프로그램: 방화벽 유무 확인, 방화벽 있을시 뒷단 host ?

hbsnow의 이미지

TCP로 소켓프로그램을 구상중에 있습니다.
설계중에 문제점이 있어서 질문을 올립니다.
많은 토의가 있엇으면 합니다.

1. 외부에서 접속할 host에 대해 방화벽이 설치되었는 네트웍인지 아닌지를 확인할수 있는 방법을 알고 싶습니다.
well-known ports 접속시도로 체크정도 생각을 해봤습니다.

2. 방화벽이 설치되었음을 확인했을때 그 네트웍에 있는 host를 접속하려면 어떻게 해야 합니까?
일반적으로 ip부여해서 socket를 만들어서 tcp 접속을 한다면 방화벽에서 차단당할것으로 봅니다만...

pynoos의 이미지

1.
어떤 호스트의 port에 접근하는데, 그 포트가 어떤 것에 의해 막혀있는지 알고 싶다는 얘기시지요?

그 어떤것이 방화벽이 될 수도 있고, 단순히 router의 필터가 될 수도 있겠습니다.

일반적인 socket 응답으로는 알 수 없습니다.
무슨 전문적인 툴을 도입하지 않는한... 힘들겠지요.

2.
이른 바 해킹이네요.

"단순한 클라이언트 프로그래밍"으로 어떤 서버를 막아 놓은 방화벽을 뚫거나 우회해서 접속시도를 성공시키는 방법은 없습니다.

hbsnow의 이미지

먼저 접속은 Client에서 해야 겟지요
C-S환경에서 Client가 Server에게 메세지를 보낸다면 Server이 Client에게 답변을 주는거지요

근데 문제가 중간에 방화벽이 있을때 방화벽이 있는 네트웍에 Clinet인지 그렇지 않은지를 체크할수 있는 방법..
그리고 방화벽이 있는 네트웍에 Clinet가 메세지를 보낸거라면 응답을 보낼때 필요한 사항이 있는지...
그냥 일반적으로 보낸 IP에다가 다시 메세지를 보내면 되는건지.... 가 궁금합니다.

mach의 이미지

hbsnow wrote:
먼저 접속은 Client에서 해야 겟지요
C-S환경에서 Client가 Server에게 메세지를 보낸다면 Server이 Client에게 답변을 주는거지요

근데 문제가 중간에 방화벽이 있을때 방화벽이 있는 네트웍에 Clinet인지 그렇지 않은지를 체크할수 있는 방법..
그리고 방화벽이 있는 네트웍에 Clinet가 메세지를 보낸거라면 응답을 보낼때 필요한 사항이 있는지...
그냥 일반적으로 보낸 IP에다가 다시 메세지를 보내면 되는건지.... 가 궁금합니다.


방화벽내의 클라이언트가 접속을 시도했고(이때 방화벽설정이 내부에서 외부로의 연결시도는 허용이라고 가정), 이 때 연결된 회선(TCP연결)을 통해서 메시지 전송이 이뤄진다면 서버에서 보내는 데이터도 아무 관계없이 유통이 됩니다.
클라이언트가 특정목적으로 수정가능하게 제작된 것이라면, 클라이언트에서 서버로 일단 접속후 클라이언트에서 새로운 포트를 열어놓고(마치 서버처럼) 서버에서 접속을 시도하게 하면(마치 클라이언트처럼) 클라이언트가 방화벽내에 있는지를 검사할 수 있을것으로 보입니다.
* 참고로 rfc들 중에서 ftp 관련 rfc를 찾아서 passive, active connection에 대해 살펴보시기 바랍니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

pynoos의 이미지

구체적인 상황을 알면 다른 조언이 있을 수 있겠지만.

질문하신 것만을 한정하여 답변을 드리자면,

client가 방화벽안에 있는 무언가와 얘기할 수 있는 일반적인 방법이 없습니다.
즉, client가 방화벽 관리 서버(?)와 통신하여, 방화벽 안의 특정 IP와 통신하려고 할 때 취할 수 있는 방법이 일반적이지 않다는 것입니다.

방화벽 안의 서버에서 도는 서비스가 자신이 방화벽안에 있다는 것을 알고,
그 방화벽이 외부와 통신할 수 있도록 socks4,5 proxy 같은 것을 지원해 준다면
socks4,5 proxy들이 외부에서 들어오는 client call을 접수하여
안으로 전달시키는 방법이 있긴합니다. 이것은 어쨌든 간단한 C/S 환경은 아니죠.

hbsnow의 이미지

client-방화벽 - <인터넷> - server

구성을 이렇답니다.

1. 클라이언트가 접속을 server로 해오면 server는 그 클라이언트 앞단에 방화벽이 존재하는지 체크를 할수 있어야 합니다.

2. 존재한다면 그대로 전송을 하고
존재하지 않는다면 다른 서버를 통해서 통신을 하는 형태를 가져가려합니다.

조언을 부탁드립니다.

pynoos의 이미지

쩝.....

할말이 없네용... ^^

프로토콜을 자체 제작하는 것이라면,

NAT 가 일어나는지 확인 할 수 있을 것입니다.

접속한 다음 클라이언트가 protocol 상에서 자신의 bind IP를 전송하도록하고

서버는 현재 접속한 socket의 remote IP와 프로토콜 상에서 올라오는 IP를 비교하는 방법으로 NAT 존재 여부를 알 수 있을 것입니다. 그러나 모든 NAT가 방화벽은 아니라는 것도 염두에 두셔야 겠지요. 단지 NAT는 NAT일 뿐입니다.

2 번의 존재한다면 그대로 전송을 한다는 것이 무슨 말인지 알 수가 없군요...

ssehoony의 이미지

방화벽의 셋팅에 따라 방화벽 넘어로 접속하는 방법이 다양하겠죠.
어떤 방화벽은 well known 포트로의 접속 패킷만 필터링 하는 것도 있겠지만
보안에 신경을 많이 쓰는 관리자라면 ping 패킷 까지도 필터링 해버리기
때문에 가장 심하게 생각을 한다면 핑도 안가고 모든 접속 요청 패킷을
필터링 하는 방화벽이라고 한다면 외부에서 방화벽 안쪽으로 접속 할 수 있는
방법은 없습니다. ( 있다면 그 순간부터 그건 방화벽이 아니지요 )

제가 생각하기에
클라이어트 A -- 방화벽 -- 인터넷 -- 서버 A, 서버 B
이런식의 구성도 일때
클A 가 서A 에 접속하고 적당한 인증 후에 서B 가 클A 에 접속해서 기타 통신을 하시게 하고 싶다는 이야기 인듯한데요.

위의 제 추측이 맞다는 가정하에 다른 해결 방법을 말씀 드리면

실제로는 서B 가 클라이언트가 되고 클A가 서버가 되는 입장이 되겠지요. (connection 요청을 누가 하느냐 하는 관점에서 봤을때)
이렇게 되면 방화벽에 의해서 접속 요청 패킷이 필터링 되버릴 수가 있어서 고민을 하고 계신다면, 꼭 그렇게 해결하실 필요 없습니다.

일단 클A랑 서A하고 통신을 하고 적당한 처리를 한후 인증이 됐다면
클A에게 다음에 접속할 서B 의 ip 와 포트를 가르쳐 줘서 클A가 서B에 접속하도록 하는거죠.
해킹을 통해서 서B에 다이렉트로 접속을 하는 사용자를 걱정하신다면 서A가 클A를 인증한후 클A의 ip 를 서B에 넘겨주고 서B는 특정 시간동안에 서A 에게서 넘겨 받은 ip 에서 오는 접속요구를 받아주는 방식을 사용한다면 보안도 어느정도 해결이 되리라고 봅니다.

방화벽이 문제가 된다면 이런식으로 우회해서 분산환경을 만드시는게 좋을 듯 하네요.

maximus의 이미지

제가 질문 하신분의 의도를 잘못 이해하는건지도 모르겠습니다만...
별 문제 없을것 같은데요..

C-S 환경에 process 가 C-> S -> C 아닌가요 ?
중간에 C 도 Server 가 되는 환경입니까 ?

아닌것 같은데요..

아니라면 걱정할 필요 없는 사항 아닌가요 ? 클라이언트에서 Binding 되는 port 는 무작위이기 때문에 라우터에서 보통 destination 필터링을 합니다만.. 이 문제 역시 S 가 80 포트로 서버를 작성하면 ^^

여튼 제 생각이 맞다면 별 문제없을듯 합니다..

만약 C 가 Server 로도 구동이 된다면 Socks 를 쓰는 방법이외에는 별 도리가 없을듯 합니다.. 관리지가 포트를 열어 주면은야 좋겠지만요..

방화벽 유무 확인은 의외로 간단합니다.. (NAT port forwarding 포함)

접속 할 포트를 C 에서 먼져 걸어 놓구선 S에 몇번 포트가 잘 생성 됐다 이렇게 신호를 보내서 그정보를 갖구 S 에서 접속 해보면 되는거죠.. 그럼 되는거 아닌가요 ?

=================================
:: how about a cup of tea ? ::
=================================

hbsnow의 이미지

A <-> SERVER

가상ip, 방화벽 체크 시도를 위해

A가 서버로 CONNECT를 하고나서 A가 BIND하고 LISTEN한 소켓에 포트를 SEND 해줍니다

그러면 SERVER는 A가 알려준 PORT로 CONNECT를 수행해보면 A가 가상 IP인지 방화벽내에 있는지를 알수 있을것입니다.

가상아이피를 가진 A가 접근했을때 Connect를 하면 리턴되기까지 많은 시간이 소요되며 리턴값은 connection timed out입니다.
고정아이피는 Network is unreachable 이라 리턴이 바로 됩니다.

접근이 불가능한건 매한가지 인데 리턴되는 형태는 다른것 같습니다.

고수님들의 조언을 구합니다

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.