본문 바로가기
강좌

[openwrt 공유기] 와이파이 접속시 로그인 또는 버튼 눌러야 인터넷 되게 만드는 띄우는 방법 (captive portal)

by ProjectDH 2022. 7. 31.

안녕하세요.

제가 몇 달 전에 openwrt를 지원하는 공유기를 당근마켓에서 데려왔습니다. 무려 4달 전이고, HomeAssistant 카페 saranl 님이 샤오미 공유기 mini를 4천원에 데려와서 openwrt를 올렸다는 글에, 저도 한번 시도해보고 싶어졌습니다.

그때 저는 샤오미 공유기 3를 5천원에 데려왔었고, 바로 openwrt 펌웨어를 올렸습니다.

 

openwrt 사이트에 방법은 잘 나와있습니다. (펌웨어 다운그레이드 후에 로그인 후 보이는 토큰값 가지고 ssh 서버를 여는 방식입니다. 그 후에 x-wrt를 올려줬습니다.)

 

https://openwrt.org/toh/xiaomi/mir3

 

openwrt의 장점이라면, 공유기 설정에서 많은 것을 건드릴 수가 있고, openwrt가 리눅스 기반이다 보니 작은 웹서버나 인증 서버 정도는 구축할 수 있습니다.

제가 구매한 샤오미 공유기 3는 램 128MB, 롬 128MB로 php기반 작은 웹서버 설치할 공간은 충분하다고 봅니다.

 

openwrt 펌웨어를 올리면 할 수 있는 것들입니다.

 

- usb단자에 휴대폰이나 lte 라우터 연결해서 usb 테더링 되는 것을 wan 으로 사용하기

ㄴ https://qquack.org/openwrt/usb_tethering/

- 와이파이 브릿지 이용해서 리피터로 사용하기

ㄴ https://qquack.org/openwrt/bridged/

ㄴ https://openwrt.org/docs/guide-user/network/wifi/relay_configuration

- ddns 설정 (dyndns, duckdns, noip 등 많은 서비스가 존재합니다.)

- 포트포워딩 설정

- ssh, sftp 서버 개방 (관리자 설정에서 ssh 개방, sftp는 opkg install openssh-sftp-server 로 설치)

- ftp 서버 열기 (opkg install vsftpd)

ㄴ vpn 서버, 클라이언트 기능 내장 (공유기에 접속되는 트래픽 전체를 vpn 서버를 거치게 할 수 있음 - iptime 공유기에 내장된 openvpn 클라이언트와 비슷합니다.)

- 웹서버 오픈 (uhttpd로 내장 웹서버 열기, php7, 8 연동 가능)

ㄴ https://openwrt.org/docs/guide-user/services/webserver/uhttpd#using_php7

 

이중에서 제가 시도해봤던 것은 lte 라우터를 이용한 usb 테더링, 와이파이 브릿지 기능 이용해서 리피터 모드 사용, 포트포워딩 이었습니다.

ㄴ lte 라우터는 화웨이 e8372를 연결해본 결과, 정상적으로 테더링 되는 것을 확인했습니다.

ㄴ 와이파이 브릿지는 기능은 속도가 많이 빠르지는 않습니다.

 

openwrt는 리눅스를 다룰 줄 알아야 제대로 활용할 것 같더라고요. 명령어로 진행되는게 많습니다.. 영어로 된 자료 (openwrt 공식 문서) 에 자세한 설명이 나와있어서, 영어도 좀 할 줄 알아야 할 것 같습니다.

usb 테더링, 와이파이 브릿지 기능 이용할 것이라면 iptime, asus 공유기 구매해서 쓰는게 시간적으로는 이득입니다.

 

오늘은 와이파이에 접속하면 로그인을 하라고 뜨는 기능을 openwrt 공유기에 설치해보았습니다.

로그인하라고 뜨게 만드는 것을 captive portal 이라고 부릅니다.

 

생각보다 설치 방법은 어렵지 않습니다.

opkg install opennds 이 명령어를 입력하면 자동으로 설치가 되며, 설치 후에는 자동으로 서비스 활성화가 되어서 공유기에 접속해있는 기기는 외부와 어떠한 인터넷 연결도 되지 않습니다. (opennds는 nodogsplash 기반으로 제작된 captive portal 서비스입니다. nodogsplash 보다 더 많은 기능을 지원하며, 꾸준한 업데이트가 이루어지고 있습니다.)

 

공식 문서: https://opennds.readthedocs.io/

 

github 저장소: https://github.com/openNDS/openNDS (GPL-2.0 라이센스)

설치한 이후에 와이파이에 재접속 하게되면 네트워크에 로그인하세요. 라는 창이 뜹니다.

 

이후에 로그인 하는 곳에 들어가면 이렇게 뜹니다.

accept 를 누르면 다음으로 넘어갑니다.

여기에서 Continue를 누르면 최종적으로 인터넷 연결이 완료됩니다.

 

이후로 2시간동안 인터넷을 무제한으로 사용이 가능해졌습니다.

 

/etc/config/opennds에서 여러 옵션을 수정할 수 있습니다.

preauthidletimeout, authidletimeout, sessiontimeout 옵션으로 자동으로 인터넷 사용 허가를 취소시킬 수 있는 것 같습니다.

 

fas 서버 설정을 통해서 별도의 서버로 리다이렉트 후에 그 페이지에서 결제 후에, 혹은 특정 버튼을 눌러야 인터넷 사용이 가능해지게 만들 수도 있습니다.

이때 fas서버로 넘어가는 파라미터를 base64 인코딩해서 넘기거나 AES-256-CEC 암호화를 이용해서 넘길 수 있습니다. (AES-256-CEC 암호화 할 거라면 php-cli, php-openssl을 설치하라는데.. 설치해도 전 되질 않네요.)

 

활성화 하는 옵션입니다. (fas ip, fas 포트, 경로명, fas 보안 레벨)

option fasremoteip '192.168.15.2'

option fasport '80'

option faspath '/index_auth.php'

option fas_secure_enabled '0'

 

아래부터는 fas 보안 레벨에 대한 설명입니다.

 

참고한 곳은 공식 페이지입니다.

https://opennds.readthedocs.io/en/stable/fas.html

 

fas_secure_enabled (보안레벨) 이 0이라면 authaction 주소를 바로 넘겨줍니다. (이 주소에 들어가면 인터넷 사용 가능해짐)

 

리다이렉트 주소: http://192.168.15.2/index_auth.php?authaction=http://gatewayaddress:gatewayport/opennds_auth/?clientip=[clientip]&gatewayname=[gatewayname]&tok=[token]&redir=[requested_url]

 

 

또는 1이라면

하나의 파라미터에 base64 스트링이 들어가고, clientip를 포함한 값이 들어갑니다. 다만 token값은 안 들어가는 것이 확인됩니다. opennds_auth로 인터넷 사용을 허가하려면 token값이 있어야 하는데 token이 없으니 이정도 보안 레벨이라면 안전할 듯 합니다.

 

리다이렉트 주소: http://192.168.15.2/index_auth.php?fas=[b64encodedstring]

 

2,3 부터는 AES-256-CEC 암호화가 되어서 파라미터가 전송되는데, 레벨2는 리다이렉트 되는 주소가 http이고, 레벨3은 리다이렉트 되는 주소가 https입니다.

 

이후에 인증 처리는 openwrt 서버로 커맨드를 보내면 됩니다. ndsctl auth [MAC주소], ndsctl auth [ip주소], ndsctl auth [token] 중에 한 가지 방법으로 인증이 가능합니다.

 

ndsctl json [MAC or ip or token] 을 입력하면 json 구조로 유저의 정보를 받아보실 수 있으며

ndsctl trust [MAC주소] 를 입력하면 해당 MAC 주소의 기기는 인터넷 로그인 페이지를 접속하지 않고도 인터넷을 사용할 수 있습니다.

 

와.. 공공와이파이 접속시 나타나는 페이지는 이렇게 구축되는 구나 (captive portal) 를 이제 알게 되어서

저의 궁금증은 해소가 되었습니다.

궁금증 해소를 위한 저의 연구는 계속됩니다!

 

댓글