사물인터넷(IoT)2016. 7. 6. 18:44

지난 NodeMCU 관련 글 7편 에서 ESP8266 보드(Amica Board)에 간단한 웹서버를 만들어 보았습니다. 하지만 공유기의 내부 IP 를 통해서만 접속이 가능 했습니다. IoT 의 개념이 외부에서도 집안의 장치에 마음대로 접근해서 컨트롤 하는 것이 목표이기 때문에 외부에서 접속이 안된다면 별 의미가 없습니다. 공유기의 DDNS 서비스와 포트포워딩 기능을 이용하여 지난번 구현 하였던 웹서버를 외부에서도 접속할 수 있도록 해 보겠습니다. 사실 이 글은 NodeMCU 글이라기 보다는 공유기 설정 관련 글이지만 어차피 NodeMCU 시리즈를 엮는데 필요할 것 같아서 8편 글로 올립니다.


이 글에서 사용한 공유기는 ipTime 유무선 공유기 입니다. 하지만 다른 회사의 공유기를 사용하고 있는 분들이라도 DDNS나 포트포워딩의 개념은 같으므로 적용하는데 별 어려움은 없을 것 입니다.



■ DDNS 서비스란?

먼저 DDNS는 Dynamic DNS 의 약자 입니다. 동적 DNS 라고 하는데 먼저 DNS의 개념을 알아야 합니다.  DNS는 도메인 네임을 IP로 바꿔주어서 인터넷에 연결할 수 있도록 합니다.  모든 인터넷 서버는 IP를 가지고 있으니까요. 우리가 www.naver.com 이라는 도메임을 주소창에 치면 DNS 서버가 이것을 받아서 해당되는 IP를 가지고 있는 서버로 연결해 주는 것이죠. 그런데 Naver 같은 회사는 고정 IP 를 서버에 사용 합니다. 그래서 IP가 변할 일이 없습니다. 반면 가정의 인터넷은 IP가 변합니다.(물론 고정 IP서비스도 있긴 함) 동적 IP를 할당하는 것이죠. IP는 한정된 자원이기 때문에 하나의 IP를 여러사람이 돌아가면서 쓰도록 해 놓은 것 입니다. 고로 기존의 DNS 서비스에는 등록이 불가능 합니다. 이럴 경우 DDNS 라는 서비스를 사용하게 됩니다. 


ipTime 같은 경우는 iptime.org 라는 DDNS 서비스를 자사의 공유기 사용자들에게 무료로 사용하도록 해 주고 있습니다. 서비스에 가입을 하면 공유기가 공인IP를 모니터링 하게 되고 IP가 변경될 경우 이 공인 IP를 DDNS 서비스에 등록해서 계속 갱신하도록 해 줍니다. 고로 xxxxxx.iptime.org 라는 자신만의 도메인으로 가정의 웹서버에 접속 할 수 있도록 해 주는 원리 입니다.


하지만 ipTime 같은 경우는 자체의 DDNS 서비스를 구현하고 공유기 구매자들에게 무료로 제공하고 있지만 그렇지 않은 경우도 많습니다. 그러므로 DDNS 기능을 사용하기 위해서는 공유기 구입 전 공유기가 DDNS 서비스를 지원하는지 알아봐야 합니다. 만약 DDNS 서비스가 지원되지 않는다면 자신의 공인 IP를 알아내서 연결하는 방법을 쓸 수 있습니다. 자신의 공인 IP를 알아내는 방법은 [여기] 를 클릭하면 알 수 있습니다.

 


■ 포트포워딩 이란?

포트포워딩이랑 공유기에서 DDNS 등을 통해 외부에서 요청이 들어올 경우 설정해 놓은 웹서버로 연결해주는 기능 입니다. 예를 들어 xxxxxx.iptime.org:8080 이라고 외부에서 브라우저에 주소를 쳐서 연결을 요청하는 경우 먼저 DDNS 서비스가 이를 공인 IP로 변경해 줍니다. xxxxxx.iptime.org:8080 -> 218.237.234.156:8080 이런 식으로 변경이 됩니다. 그러면 218.237.234.156 IP를 쓰고 있는 공유기를 찾아서 요청 정보를 공유기가 받습니다. 공유기에서는 포트포워딩 목록을 보고 내부 IP 인 192.168.0.18:8080 을 사용하는 NodeMCU 웹서버로 요청을 보내 줍니다. 그럼 NodeMCU 에서는 준비된 응답(HTML)을 보내주게되는 것입니다.


이제 공유기를 실제로 설정해 보겠습니다.


ipTime 공유기의 관리자에 들어 갑니다. 접속 IP 는 192.168.0.1 입니다. 관리화면으로 이동 합니다.


ipTime 공유기의 DDNS 설정 입니다. 고급설정 -> 특수기능 하위에 있습니다. 저의 경우 이미 만들어 놓은 DDNS 도메인이 있어서 저렇게 나옵니다. 추가 버튼을 눌러서 서비스에 가입을 해 주면 됩니다. 접속 도메인에 사용할 자신만의 호스트이름과 이메일, 비밀번호 등을 설정하면 쉽게 추가할 수 있습니다.


 DDNS설정이 끝났으면 포트포워딩을 설정 합니다. 고급설정 -> NAT/라우터관리 하위에 있습니다. 아랫 부분에 새로운 포트포워딩 규칙을 적는 곳이 있습니다. 적절한 이름을 적어주고 프로토콜은 http, tcp 를 선택합니다. 포트는 저 같은 경우는 8080을 할당해 주었습니다. 이렇게 하게되면 지난 NodeMCU 7편에서 설정했던 webserver.lua 의 소스의 포트 설정 부분을 80 에서 8080으로 바꾸어서 다시 업로드 해 주어야 합니다. 그리고 NodeMCU 에 할당된 내부 IP를 적어 줍니다. 모든 것을 이상없이 적었으면 '적용' 버튼을 누르면 됩니다. 


새 포트포워드 규칙이 생성되었습니다. 맨위 오른쪽의 저장 버튼을 눌러서 전체 설정을 한 번 더 저장해 줍니다.


이제 테스트를 하면 됩니다. 테스트 전 [NodeMCU Lua 사용해보기 #7 - 간단한 웹서버 만들어보기] 에서 만들었던 NodeMCU 는 전원이 꼭 들어가 있어야 합니다. 그리고 위에서 말 했지만 다시 말하자면 webserver.lua 의 포트를 아래와 같이 수정해서 다시 업로드 해 주어야 합니다.


1
2
3
4
5
6
7
8
9
-- a simple HTTP server
srv = net.createServer(net.TCP)
srv:listen(8080, function(conn) -- 서비스 포트 수정
    conn:on("receive", function(sck, payload)
        print(payload)
        sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1> Hello, NodeMCU.</h1>")
    end)
    conn:on("sent", function(sck) sck:close() end)
end)
cs


3번째 줄의 포트번호 설정이 80 -> 8080 으로 변경 되었습니다. 나머지는 같습니다.


이제 외부에서 NodeMCU 웹서버가 제대로 응답을 해 주는지 확인을 해 봐야 합니다. 직접 확인을 하기 위해 근처의 PC방이나 친구집에 가서 테스트 할 수도 있겠지만 제일 쉬운 방법은 스마트폰의 와이파이를 끄고 LTE 나 3G로 연결해서 스마트폰의 브라우저로 확인해 보는 것입니다.


저의 스마트폰 브라우저에서 DDNS에서 설정한 호스트명으로 연결한 모습 입니다. (저의 호스트명은 지웠습니다. 개인적으로 사용하고 있는 DDNS 서비스라서요.) 외부에서도 연결이 잘 됩니다. 이제 나만의 NodeMCU 웹서버는 인터넷 연결만 가능하면 미국이건 중국이건 아프리카건 어디에서든 연결이 가능한 서버가 된 것입니다.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. a

    외부에서 접속할 때, 웹페이지로 send를 이용해 출력할 내용이 많아지면 버벅거리면서 잘 안되거나 아예 에러가뜨면서 자동 리셋이됩니다.
    근데 같은 코딩인데도 외부에서가 아니라 같은 IP에서 접속하면 매끄럽게 잘되구요.

    그리고 출력할 내용이 좀 적어지면 외부에서 접속해도 매끄럽게 잘됩니다.

    혹시 이런경우를 겪어보셨나요?? 왜이러는걸까요??

    2017.03.07 18:48 [ ADDR : EDIT/ DEL : REPLY ]
    • 저는 그런 경우는 없었습니다. 원격지에서도 테스트 해 봤거든요

      2017.03.07 18:50 신고 [ ADDR : EDIT/ DEL ]
    • a

      저도 이곳 게시글 보면서 간단한 테스트를 할때는 원격지에서 잘됬는데 웹페이지로 출력할 양이 좀 많아지면 원격지에서 할 때 뻑이나버리네요..ㅠㅠ

      2017.03.07 19:29 [ ADDR : EDIT/ DEL ]
    • 아마도 ESP8266 하드웨어가 서버역할을 하긴 하지만
      복잡한 웹을 처리하기에는 무리가 있을것 같아요.
      ESP8266 은 꼭 필요한 부분만 처리를 하고 나머지 처리는 전용 웹서버에 맏기는 것이 옳다고 봅니다.

      또는

      웹에 대한 모든 처리(UI, 입력 등)는 웹서버에서 하고 ESP8266 은 그 웹서버에 연결되어 처리하는 방식도 괜찮을 것 같아요.

      즉, 웹서버에서 LED를 끄는 액션을 취하고 어떤 값이 변경되었다면 ESP8266 이 그 값을 가져와서 해당되는 제어를 하는 것이죠.
      아마 웹에 대한 처리를 하지 않고 웹서버와만 통신을 하기 때문에 뻑이 나지는 않을듯 합니다.
      참고로 웹서버와 ESP8266 의 통신은 MQTT 를 이용해도 좋을 것 같네요.

      위 내용을 아직 저는 해보지 않았습니다. ^^
      그런데 될 것 같아요.

      2017.03.08 00:07 신고 [ ADDR : EDIT/ DEL ]