Peter 工程日誌

如何使用OpenWRT設定自動連線公開網路與路由器整合為AP分享器?

前言

最近,我服務的單位接了一個專案計畫,需要將系統、運動器材與復健(健身)器材皆導入至指定的場域,並於場域提供身體量測、檢測與遊戲等服務。由於場域沒有提供一般的無線網路,而是以iTaiwan這樣的開放網路作為網際網路的連線與使用。而這樣的開放網路通常需要透過驗證網頁執行驗證後才能夠連上網際網路;有鑑於此,我們需要使用一個自動化的方式並自動驗證iTaiwan網站,同時自動連到網際網路的作法。

前置條件

要達成前言中的目的,需要有幾項項網通設備與裝置才能夠做到,這樣才能夠達成自動化的目標。

建置步驟

建置步驟分為WWAN與AP兩個部分,首先是WWAN部分。OpenWRT是一個適用於嵌入式裝置的Linux發行版,有別於一般唯讀型的韌體,此韌體提供讀寫的機制能夠去更改與加上網路設定。

這裡我們使用的是樹莓派5作為安裝OpenWRT的開發板,一開始要先到OpenWRT的韌體官網尋找支援的開發板所對應的韌體檔案,網站為:「https://firmware-selector.openwrt.org」。

進入網站之後,可以輸入「Raspberry Pi 5」、「Raspberry Pi 4」或其他關鍵字尋找對應的韌體檔案,以「Raspberry Pi 5」關鍵字與選擇「24.10.4」版本為例,可以得到下列的韌體檔案截圖:

選擇前述截圖的「FACTORY」模式,下載回來為GZip壓縮檔案,接著使用「RPI Imager」作為燒錄此映像檔案記憶卡可以搭配USB讀卡機進行燒錄,將記憶卡燒錄完成後將其插入至樹莓派。

將樹莓派開機,OpenWRT預設的閘道器為192.168.1.1,並將此IP位址輸入至網頁瀏覽器進行瀏覽,網頁會出現OpenWRT的登入畫面,預設使用者為root、預設密碼為空。

需要修改OpenWRT的root密碼有幾種方式,第1種為透過網頁修改;第2種為以SSH遠端登入後進行修改,假設選擇第2種修改使用者資訊的方式如下:


# 以ssh方式登入至OpenWRT路由器

# 由於預設沒有設定密碼,所以僅需要按下Enter鍵後即登入頁面

ssh root@192.168.1.1

# 使用passwd指令將root密碼做修改

# 若設定的密碼過於簡單,則會需要將設定的密碼輸入兩次

passwd

若為初始化的OpenWRT,則有些指令的對應套件尚未安裝,因此需要先行安裝;但是,此OpenWRT尚未連接至網際網路,可以先使用有線或無線網路先行連線。
執行的指令如下:

# 更新套件來源位址,在OpenWRT為opkg指令作為套件管理器
opkg update

# 安裝cURL、python3與python3-pip等套件
opkg install curl python3 python3-pip

# 使用pip3安裝requests套件
pip3 install requests

完成OpenWRT的root使用者密碼設定與套件的安裝之後,開始設定「iTaiwan」網路,切換至「Network」的Wireless,並選擇Radio網路,此為無線網路搜尋(Scan)。

在Scan過程中,若在iTaiwan無線網路熱點,則會找到SSID名為「iTaiwan」,選擇此無線網路並按下「Join Network」。

由於是開放網路,因此大多為偵測到並為預設設定,因此按下「Submit」後,記得按下「Save&Apply」將網路設定更新至OpenWRT。

再來,就會發現連至iTaiwan後,會需要在下列的網頁按下「我同意&免費上網」後,才能夠開始上網。

從截圖的資訊得知,是不是將此網頁網址截取下來後,去點擊此按鈕背後傳送的網站訊息即可?重點不是這頁面的網址而是此網址會依據不同的iTaiwan熱點去產生需要在點擊「我同意&免費上網」按鈕後傳送的資訊。若從Windows筆電登入iTaiwan來分析使用此開放網路的步驟,則我們可以得到下列步驟:

  1. Windows作業系統會偵測到此開放網路需要登入,當開啟網頁瀏覽器時,會先自動瀏覽「http://www.msftconnecttest.com/redirect」網址。
  2. 前述網址目的為Windows作業系統中,作為偵測目前網路的狀態,若已經能夠正常連線至網際網路,則會導向至微軟相關的網站。
  3. 若未連上網際網路,則會導向至iTaiwan的同意免費上網的網站,此網址則會包含需要截取的資訊,例如:umac參數對應的MAC位址等。
  4. 解析前述的網頁內容,會發現點擊頁面的「」按鈕,實際上會發送HTTP的POST請求至「https://wlangw.hinet.net/v2_0/itaiwan_auth/auth_page.php」並帶「username」與「password」欄位,以「application/x-www-form-urlencoded」內容類型來發送此表單內容。
  5. 發送的username格式為「{umac}@itw」與password欄位內容固定為「myegov」。

從上述的iTaiwan網頁步驟得知,這樣的身分驗證方法與「CHT Wi-Fi 」熱點上網驗證方式類似,不同之處在於iTaiwan為行政院所建置且背後委託的電信商可能是中華電信(居多數)、遠傳電信與台灣大哥大等。因此提供上網的電信商很多種,但是登入方法皆為iTaiwan並作為頁面點擊同意的方式。依照前述的步驟,我們可以將其轉換成Python實作的腳本來自動化登入iTaiwan。Python程式碼如下:


import sys
import requests
from urllib.parse import urlparse, parse_qs

ini_url = 'http://www.msftconnecttest.com/redirect'
session = requests.Session()

response = session.get(ini_url, allow_redirects=False)
redirect_url = response.headers['Location']
if 'go.microsoft.com' in redirect_url:
    print('iTaiwan is successful.')
    sys.exit(0)

parsed_query = parse_qs(urlparse(redirect_url).query)
if 'umac' in parsed_query:
    umac = parsed_query['umac'][0]

session.get(redirect_url)

payload = {
'username': f'{umac}@itw',
'password': 'myegov',
}
response = session.post(
'https://wlangw.hinet.net/v2_0/itaiwan_auth/auth_page.php',
data=payload,
headers={'Referer': 'https://gov.tw'}
)

if response.ok is False:
    print('Login iTaiwan is failed.')
    sys.exit(1)

print('Login iTaiwan is successful.')

假設前述的程式檔案名稱為「login_itaiwan.py」,執行後,則會自動判斷是否需要執行iTaiwan之自動化驗證作法。iTaiwan有下列幾項的限制:

結語

iTaiwan算是公共無線上網的服務,自動化驗證方式仍是由於場域的需要與限制所需要實作的方法。實務上,出門在外也很少使用這樣的公開網路;因此除了設計與實作自動化驗證的方式之外,也需要注意網路傳輸的加密等議題。若想要將樹莓派WWAN與AP結合,則可以考慮找市面上能夠刷機成OpenWRT韌體的路由器或OpenWRT官方所發布的「OpenWrt One」。

例如:ASUS品牌中某些型號的路由器或OpenWRT官方開發板等。至於如何將路由器刷機成OpenWRT韌體,則是另一篇文章所探討的議題了。

參考資料

Exit mobile version