127.0.0.0/8 에 소켓을 bind 시키는 방법이 있나요?

hansolo의 이미지

리눅스에서 C 로 소켓프로그래밍을 하고 있습니다.

127.0.0.0/8 에다가 소켓을 bind 시키는 방법이 있는지 궁금합니다.

즉, loopback 으로 들어오는 접속만 다 받겠다는 건데요..

inet_aton("127.0.0.0/8", &struct);
bind(..., struct, ...);

이런식으로 하면, bind 시킬때

Cannot assign requested address

라면서 안되네요.

혹은 저런방법이 아니더라도 loopback 으로 들어오는 접속을 IP를 가리지않고 (127.0.0.1 ~ 127.255.255.255 까지) 받아줄 수 있는 방법이 있을까요??

INADDR_ANY 로 bind 하는건 또다른 제약조건 때문에 불가능한 상황입니다.

도움을 부탁드립니다. (_ _)

eungkyu의 이미지

그냥 127.0.0.1로 bind하면 되지 않을까 싶은데요.

hansolo의 이미지

IP를 가리지 않는다는게 listener의 IP를 가리지 않는다는 뜻이었는데, 제가 좀 헷갈리게 질문을 썼나봅니다.

즉,

127.0.0.1 뿐만 아니라

127.0.0.2
127.0.0.3
...
127.100.100.100
...

뭐 이런식으로 127.x.x.x 로 들어오는 모든 연결을 하나의 프로세스가 받아주게 만들고 싶은 거거든요.

eungkyu의 이미지

예를 들면 127.2.2.2 -> 127.0.0.1, 127.2.2.2 -> 127.1.1.1 이런 식으로 연결하는 것을
모두 하나의 프로세스에서 받겠다는 것인가요?

이 문제는 단순히 bind 함수의 문제는 아닌 것으로 보입니다.

lo라는 인터페이스가 127.0.0.1로 세팅되어있기 때문에
127.1.1.1으로 오는 연결을 받을 수 있을지 의문입니다.

두 세개 정도는 lo:0, lo:1 등을 만들어서 가능하겠지만
lo:0, lo:1, lo:2, ... lo:10000 이렇게 인터페이스를 만들 수는 없는 노릇이니까요.

게다가 클라이언트가 127.2.2.2가 되며면 클라이언트용 인터페이스도 만들어야 할거고 =_=

hansolo의 이미지

실험을 해 보았습니다.

실험 1
---------------

        my_addr.sin_family = AF_INET;         /* host byte order */
        my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
        inet_aton("127.2.2.2",&my_addr.sin_addr);
        bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

이런식으로 bind 해서 데몬을 띄우고요, netstat 로 확인해 보면

netstat -an | grep 3490
tcp        0      0 127.2.2.2:3490              0.0.0.0:*                   LISTEN

이런식으로 떠 있습니다.

여기다가 붙여보면,

[hansolo@www persona]$ nc 127.2.2.2 3490
Hello, world!

이렇게 잘 연결이 되거든요..

실험2
--------------

bind 시에 넘겨주는 파라미터의 sockaddr 구조체에 INADDR_ANY 로 세팅해서 bind 시키면,

        my_addr.sin_family = AF_INET;         /* host byte order */
        my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
        my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* auto-fill with my IP */
        bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */
 
        bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

인터넷IP 와 127.x.x.x 모두 잘 연결이 되거든요..

[hansolo@www persona]$ nc 127.2.2.2 3490
Hello, world!
[hansolo@www persona]$ nc 192.168.0.17 3490
Hello, world!

그래서 각각 내린 결론(?)이

실험1 : 별도의 디바이스가 없어도 127.x.x.x 의 주소와 포트로 소켓을 열고 바인딩 할 수 있으며, 해당 호스트에서 연결이 가능하다.

실험2 : bind 시에 하나의 주소 뿐만 아니라 여러개의 주소를 같이 바인딩 하여, 다양한 destination address 를 가진 연결을 하나의 프로세스가 받아줄 수 있다.

라고 생각했습니다.

이 두개를 바탕으로, 제가 원하던 기능인

127.x.x.x 를 목적지로 하는 연결을 받아주는 데몬도 가능하지 않을까 하는 생각을 했던 겁니다.

(INADDR_ANY 같은 일종의 와일드카드 어드레스 를 생각한 것이지요.. INADDR_127S 같은.. ㅎㅎ;)

여기까지가 제 생각이었고요..

헌데 쓰다보니, 왠지 어려울것 같다는 느낌이 드네요.. INADDR_ANY 로 주면 0.0.0.0 으로 bind 되는데, 이건 low레벨 에서 따로 처리로직이 있는 와일드카드 어드레스니까 가능한거지, 제가 생각하는 것 처럼 마음대로 range 를 잡아서 할 수 있을것 같지는 않다는 생각이 좀 들기도 하네요.. ㅜ_ㅜ)

eungkyu의 이미지

lo가 127.0.0.1인데 127.2.2.2에 bind할 수 있다는 사실은 처음 알았네요 :)
그럼에도 불구하고 원하는 것은 힘들 것 같습니다.

bind에는 INADDR_ANY와 특정 ip 이외에 다른 것은 본 일이 없는 것 같네요

monovision의 이미지

그 range 를 꼭 bind 에만 적용할 필요는 없지 않을까 합니다.
0.0.0.0 으로 bind 해 놓고 user level 에서 source ip 를 체킹하면 상관이 없지 않을까 합니다만은....

127.x 를 사용하고자 하신다니.. 좀 특이한 걸 하시나보네요 ㅡ.ㅡ;;;

loopback 디바이스를 사용하는 경우는 LVS 에서 arp 문제 외에는 없었던 것 같거든요.

댓글 달기

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