Guest WIFI QR code generator for display on local network webpage (visible from TV, smartphones...) and random password rotation - XIYO/asuswrt-merlin.ng-kr GitHub Wiki
์ ๋ ์ ํ๋ก์ ํธ๋ฅผ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค. ์ TV๋ ํ ํ๋ฉด์์ ๋ฐ์ฒ ๋ฒํผ์ ํตํด ์ ๊ทผํ ์ ์๋ ์ ์ฒด ํ๋ฉด์ ์น ํ์ด์ง๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ TV์์ ์น๊ตฌ์ ์น์ฒ์ด ๋ฐฉ๋ฌธํ ๋ ํธ๋ฆฌํ๊ฒ ๋ด ๊ฒ์คํธ Wi-Fi QR ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋คํธ์ํฌ์ ๊ฐ๋จํ๊ฒ ์ฐธ์ฌํ ์ ์๊ฒ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์ต๋๋ค.
(์ฌ๊ธฐ, ์ฌ๊ธฐ ๋ฐ ์ฌ๊ธฐ์์ ์๊ฐ์ ๋ฐ์์, ๋งค์ผ ๋ฐค cron ์์ ์ ์ํด ์คํ๋๋ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ์์ ์ ์ํํฉ๋๋ค:
- ๋งค์ผ ๋ฐค ๊ฒ์คํธ Wi-Fi ๋น๋ฐ๋ฒํธ๋ฅผ ์๋ก์ด ๋ฌด์์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
- ๋ก์ปฌ๋ก ํธ์คํ ๋ ์น ํ์ด์ง๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์๋ก์ด ๋น๋ฐ๋ฒํธ๋ฅผ ํ๋ฌธ ๋ฐ QR ์ฝ๋๋ก ํ์ํฉ๋๋ค.
์ด ์คํฌ๋ฆฝํธ์ ๋ํ ์ง๋ฌธ๊ณผ ์๊ฒฌ์ ์ด SNB ํฌ๋ผ ์ค๋ ๋์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์ด ์์ ์ ์ํํ๋ ค๋ฉด ๋ช ๊ฐ์ง ์ ์ ์กฐ๊ฑด์ด ํ์ํฉ๋๋ค:
- ๋จผ์ , ๋ช ๊ฐ์ง ๋ค๋ฅธ ํจํค์ง๋ฅผ ์ค์นํ๋ ค๋ฉด ๋ผ์ฐํฐ์ Entware๊ฐ ์์ด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ํด์๋ ์ฐ๊ฒฐ๋ USB ์ ์ฅ ์ฅ์น๊ฐ ํ์ํฉ๋๋ค.
- lighttpd ๋ฐ ์ ํ์ ์ผ๋ก lighttpd-mod-access (์ ๊ทผ ๊ถํ์ ์ ์ดํ๊ธฐ ์ํด ํ์ํ๋ฉฐ ํธ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋๋ ์ถ๊ฐ ๊ฐ๋ฅํ์ง๋ง php๋ ํ์ํ์ง ์์)
- qrencode: WIFI ๋น๋ฐ๋ฒํธ๋ฅผ QR ์ฝ๋๋ก ๋ณํํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.* coreutils-base64: QR ์ฝ๋๋ฅผ ๋ฐ์ดํฐ URI๋ก ํฌ๋งทํ๋ ค๋ฉด ํ์ํฉ๋๋ค.
Entware์ lighttpd ์ค์ ์ ์์ธํ ๋ด์ฉ์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค. ์ด์ ๊ดํ ๋ง์ ์๋ฃ๋ค์ด ๋์์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.## ์คํฌ๋ฆฝํธ
๋ค์์ ์คํฌ๋ฆฝํธ์ ๋๋ค. ์ ๋ jffs์ ๋๋ฌด ๋ง์ด ์ฐ๋ ๊ฒ์ ์ข์ํ์ง ์์ผ๋ฏ๋ก ์ด๋ฅผ /mnt/MERLIN/rotateGuestPassword.sh ๊ฒฝ๋ก์ USB ํค์ ๋์์ต๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ๊ธฐ๋ณธ HTML ํ์ผ์ ์์ฑํ๊ณ ์น ์๋ฒ์ ์ง์ ๋ฐฐ์นํฉ๋๋ค.
#!/bin/sh
## ์คํฌ๋ฆฝํธ์ ์ค์
```# ์ฌ์ฉํ ๊ฒ์คํธ ๋คํธ์ํฌ ๋ชฉ๋ก# ์ด ์์ ์์๋ 2.4GHz ๋ฐ 5GHz ๋คํธ์ํฌ ์ค ์ฒซ ๋ฒ์งธ ๋คํธ์ํฌ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.# ๋ค์๊ณผ ๊ฐ์ด "nvram show | grep ssid | grep "^w""์ ๊ฐ์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๋ฌด์ ๋คํธ์ํฌ ๋ชฉ๋ก์ ์ป์ ์ ์์ต๋๋ค.# ์ด ๋ช
๋ น์ ๋คํธ์ํฌ์ SSID๋ฅผ ๋์ดํ๋ฉฐ ํ์ํ ๋ถ๋ถ์ ๋ฐ์ค ์์ ์๋ ๋ถ๋ถ์
๋๋ค.# ๋ผ์ฐํฐ์ ์ํ๋ ๋งํผ ๋ง์ ๋คํธ์ํฌ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ TV์์ ํ์ํ ๋ ์คํฌ๋กค์ด ํ์ํ์ง ์๊ณ ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ต๋ 2๊ฐ์ ๋คํธ์ํฌ๊ฐ ๊ฐ์ฅ ์ข์ต๋๋ค.
wl_list="wl0.1 wl1.1"# ์น ์๋ฒ์ HTML ํ์ผ์ ์ ์ฅํ ๊ฒฝ๋ก
html_file="/opt/share/www/guest_wifi.html"# ์์ฑ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํ ๋ฌธ์ ๋ชฉ๋ก.# ๋น๋ฐ๋ฒํธ ์์ฑ ๋ช
๋ น์ ๊นจ๋จ๋ฆด ์ ์๋ ๋น์ํ๋ฒณ ๋ฌธ์์ ์ฃผ์ํ์ธ์...# ์ผ๋ถ ์ฌ๋๋ค์ ์ค๋ฅ๋ฅผ ํผํ๊ธฐ ์ํด I, i ๋ฐ 1์ ์ ๊ฑฐํ์ง๋ง QR ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๋ฉด ์๊ดํ์ง ์์ ๊ฒ์
๋๋ค...
char_list="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz123456789"# ์์ฑ๋ ๋น๋ฐ๋ฒํธ์ ๊ธธ์ด# ๋น๋ฐ๋ฒํธ๋ 8์์์ 63์ ์ฌ์ด์ฌ์ผ ํฉ๋๋ค.
pw_length=20
## ์คํฌ๋ฆฝํธ ์ค์ ์ข
๋ฃ# ๋ฌด์์ ๋น๋ฐ๋ฒํธ ๊ฐ์ ธ์ค๊ธฐ
getRandomPassword(){
random_password=`cat /dev/urandom | env LC_CTYPE=C tr -dc "$char_list" | head -c $pw_length; echo;`
}# ์์ HTML ํ์ผ ์์ฑ ์์
cat <<EOF > "$html_file".tmp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ํ ๊ฒ์คํธ ์์ดํ์ด</title>
<style>
html {
background:#e9dcc3;
text-align:center;
font-family:Verdana,Arial,Helvetica
}
.container {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 660px;
margin: auto;
}
.item {
margin: auto 50px;
width: 660px;
display: inline-block;
height: 660px;
background-color: #fff;
border-top: solid 10px #e9dcc3;
border-bottom: solid 10px #e9dcc3;
}
img {
margin:auto;
max-height:450px;
max-width:450px;
}
</style>
</head>
<body>
<div class="container">
EOF# ๋คํธ์ํฌ ๋ชฉ๋ก ๋ฐ๋ณต
for wl in $wl_list
do
# ๋น๋ฐ๋ฒํธ ์์ฑ
getRandomPassword
# ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๋คํธ์ํฌ์ SSID ๊ฐ์ ธ์ค๊ธฐ
ssid=`nvram get "$wl"_ssid`
# ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๋คํธ์ํฌ์ ์๋ก์ด ๋น๋ฐ๋ฒํธ ์ค์
nvram set "$wl"_wpa_psk="$random_password"
# HTML ์์ ํ์ผ์ ์ด ๋คํธ์ํฌ์ ๋ํ ๋ธ๋ก ์ถ๊ฐ
cat <<EOF >> "$html_file".tmp
<div class="item">
<h1>๊ฒ์คํธ ์์ดํ์ด</h1>
EOF
๋คํธ์ํฌ ๋ชฉ๋ก์ ๋ฐ๋ณตํฉ๋๋ค.
```
for wl in $wl_list
do
# ๋น๋ฐ๋ฒํธ ์์ฑ
getRandomPassword
# ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๋คํธ์ํฌ์ SSID ๊ฐ์ ธ์ค๊ธฐ
ssid=`nvram get "$wl"_ssid`
# ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๋คํธ์ํฌ์ ์๋ก์ด ๋น๋ฐ๋ฒํธ ์ค์
nvram set "$wl"_wpa_psk="$random_password"
# HTML ์์ ํ์ผ์ ์ด ๋คํธ์ํฌ์ ๋ํ ๋ธ๋ก ์ถ๊ฐ
cat <<EOF >> "$html_file".tmp
<div class="item">
<h1>๊ฒ์คํธ ์์ดํ์ด</h1>
EOF
```
# QR ์ฝ๋๋ฅผ ๋ฐ์ดํฐ URI ์ด๋ฏธ์ง๋ก ์ถ๊ฐ
```
echo " <img src=\"data:image/svg+xml;base64,"$(qrencode -o - "WIFI:S:$ssid;T:WPA;P:$random_password;;" -s 10 -t SVG | base64 | tr -d '\r\n')"\" />" >> "$html_file".tmp
```
# ๋ธ๋ก ์์ฑ ๋ง๋ฌด๋ฆฌ
```
cat <<EOF >> "$html_file".tmp
<h2>
SSID : $ssid<br />
๋ณด์ : WPA / WPA2<br />
๋น๋ฐ๋ฒํธ : $random_password
</h2>
</div>
EOF
done
```# ์์ HTML ํ์ผ ์์ฑ ์๋ฃ
```
cat <<EOF >> "$html_file".tmp
</div>
</body>
</html>
EOF
```# ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํ์ฌ ๋ค์ ๋ถํ
ํด๋ ์ ์งํ๊ธฐ
```
nvram commit
```# ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ํด WIFI ์ฌ์์
```
service restart_wireless
```# ์ต์ข
HTML ํ์ผ ๋ฎ์ด์ฐ๊ธฐ
```
mv -f "$html_file".tmp "$html_file"
```
### Cron ์์
ํฌ๋ก ์์
์ ๋งค์ผ ๋ฐค์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด cru ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ค์ ํ์ต๋๋ค.
```
cru a rotateGuestPassword "0 4 * * * /mnt/MERLIN/rotateGuestPassword.sh"
```
## ์น ํ์ด์ง์ ์ก์ธ์ค
๊ธฐ๋ณธ lighttpd ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ํฌํธ 81์์ ์์ ๋๊ธฐํ๊ณ ์๋ ๊ฒฝ์ฐ ์์ฑ๋ QR ์ฝ๋๊ฐ ํฌํจ๋ ์น ํ์ด์ง๋ http://192.168.0.1:81/guest_wifi.html์ ํตํด ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ 192.168.0.1์ ๋ผ์ฐํฐ IP์ด๊ณ $html_file๋ก /opt/share/www/guest_wifi.html์ ์ ํํ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ TV๋ฅผ ํ ํ๋ฉด์ผ๋ก ์ด ์น ํ์ด์ง๋ฅผ ์ด๋๋ก ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ฌผ๋ก ์ก์ธ์ค ์ ์ด๋ฅผ ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ ๋ก์ปฌ ๋คํธ์ํฌ์ ๋ชจ๋ ๊ธฐ๊ธฐ์์ ์ด ์น ํ์ด์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค. TV๋ฅผ ํ์ํ ํ์๊ฐ ์์ต๋๋ค.
## ๊ณ ์ง, ์ฐธ๊ณ ์ฌํญ ๋ฐ ๊ฐ์ ์ฌํญ
์ด ์คํฌ๋ฆฝํธ๋ ํ์ฌ ์ํ ๊ทธ๋๋ก ์ ๊ณต๋๋ฉฐ ์ง์ ๋๋ ๋ณด์ฆ์ ์ ๊ณตํ์ง ์์ต๋๋ค. Merlin 386.3_2์์ ๋ด AX3000์์ ์ ์๋ํ์ง๋ง ๊ทธ ์ด์์ ๋งํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์กฐ๊ธ ๋๋ฌ์ฐ๋ฉฐ ์ต์ํ์ด์ง๋ง ๋จ์ผ ํ์ผ์ด๋ฉฐ ๋จ์ผ HTML ํ์ผ์ ์์ฑํฉ๋๋ค. ๊ต์ก ๋ชฉ์ ์ผ๋ก ๋ ๊ฐ๋จํ์ต๋๋ค. ๊ฐ์ ํ ์ฌ์ง๊ฐ ๋ง์ด ์์ผ๋ฏ๋ก ์๊ฒฌ์ ๋จ๊ธฐ๊ฑฐ๋ ์กฐ์ ํ์ญ์์ค.
ํ์ฌ entware์์ ์ฌ์ฉ ๊ฐ๋ฅํ qrencode ๋ฒ์ ์ PNG ํ์ผ์ ์์ฑํ ์ ์์ผ๋ฏ๋ก SVG ํ์์ ์ฌ์ฉํฉ๋๋ค. ๋ฌผ๋ก ๋ฐ์ดํฐ URI ๋์ ์ svg ํ์ผ์ ์์ฑํ๊ณ ์น ์๋ฒ์ ์ ์ฅํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
HTML ํ์ผ์ ์คํฌ๋ฆฝํธ์ ์ํด ๋ณ๊ฒฝ๋๋ ๋ณ์๋ง ๋ณ๊ฒฝํ ํ
ํ๋ฆฟ์์ ์์ฑ๋ ์ ์์ต๋๋ค. HTML ๋ ์ด์์์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.ํ์ฌ HTML ๋ ์ด์์์์ 25์ ์ด์์ ๋น๋ฐ๋ฒํธ ๊ธธ์ด๋ฅผ ์ ํํ๋ฉด ์ ๋๋ก ํ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฐ ๊ธด ๋น๋ฐ๋ฒํธ๊ฐ ํ์ํ ๋งํผ ์ ๊ฒฝ ์ฐ์ ๋ค๋ฉด ๊ทธ๊ฒ์ ์์ ํ๋ ๊ฒ์ ์ฌ๋ฌ๋ถ์ ๋ชซ์
๋๋ค.