- 物联网开发系列:
- 物联网开发之旅① WiFi to Ethernet: 树莓派共享无线连接至有线网口,自动通过Captive Poartal验证
- 物联网开发番外篇之 Captive Portal验证原理
文章目录
- 背景
- 实现工具
- 实现细节
- 一、将无线连接共享到以太网
- 1. 配置静态IP地址
- 2. 启用IP转发
- 3. 配置NAT(网络地址转换)
- 4. 自动应用iptables规则
- 二、自动通过WiFi的登录验证
- 1. 编写登录脚本
- 2. 编写网络检查脚本
- 3. 使用`systemd`定时器
- 总结
- 参考
背景
在物联网开发中,大多数设备都是通过无线局域网进行通信的,在局域网下非常容易实现,但是有些时候我们需要在远程对物联网设备进行管理,例如在公司关掉在家忘了关掉的空调,或者在家查看公司物联网设备的工作状态,这时候就需要将局域网的设备暴露到互联网上。
最简单的方式当然是通过一根网线将局域网路由器连接到有互联网的路由器,但是有些情况下这种方法并不可行,否则就不会有本文了。
不便之处在于公司只能够提供一个WiFi连接,这就需要将无线连接获取到的互联网连接共享到局域网设备中。
另外,公司提供的无线连接通常具有captive portal功能,WiFi本身是不加密的,但是连接上之后需要通过一个账号密码进行验证才能上网。
因此要解决这个问题就要完成两个主要任务:
- 将无线连接共享到以太网
- 自动通过公司的Captive Portal认证
再次注意本文的需求,是将无线连接共享到有线网口,目前大多数网上的方案都是将以太网共享到WiFi,这没什么难度,开个热点就好了。
具体网络拓扑可以参考以下图片
实现工具
要将无线连接共享到以太网并自动通过WiFi的登录验证,我们需要选择适当的工具和方法。以下是选择这些工具的原因:
- 使用
nmcli
工具:nmcli
是NetworkManager的命令行接口,可以方便地管理网络连接。 - 使用
iptables
进行NAT:iptables
是Linux内核的包过滤系统,可以配置NAT(网络地址转换)来共享网络连接。 - 编写Shell脚本:通过编写Shell脚本,可以自动化WiFi连接和登录验证。
- 使用
systemd
定时器:systemd
是现代Linux系统的初始化系统和服务管理器,可以用来定时运行任务。
实现细节
一、将无线连接共享到以太网
1. 配置静态IP地址
首先,需要为以太网接口(eth0
)配置一个静态IP地址,以便作为网络共享的网关。
编辑/etc/dhcpcd.conf
文件:
sudo nano /etc/dhcpcd.conf
添加以下内容,为eth0
配置静态IP地址:
interface eth0
static ip_address=192.168.0.1/24
static routers=
static domain_name_servers=
保存并退出编辑器,然后重启网络服务:
sudo systemctl restart dhcpcd
2. 启用IP转发
编辑/etc/sysctl.conf
文件,启用IP转发:
sudo nano /etc/sysctl.conf
取消以下行的注释:
net.ipv4.ip_forward=1
使更改立即生效:
sudo sysctl -p
3. 配置NAT(网络地址转换)
配置iptables
以共享无线连接到以太网:
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
将iptables
规则保存到文件中:
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
4. 自动应用iptables规则
编辑/etc/rc.local
文件,在exit 0
之前添加以下内容,以便在启动时自动应用iptables
规则:
sudo nano /etc/rc.local
添加以下内容:
iptables-restore < /etc/iptables.ipv4.nat
保存并退出编辑器。
小插曲:当我设置好转发之后,发现网络十分不稳定,研究之后发现是树莓派的射频功率不够,导致无线连接不稳定。改进方法有两个,一是给树莓派连接外置天线,可以参考这个视频(有点硬核)。我图省事就选了另一种方法,买个USB无线网卡(建议买免驱动的,省事)。
二、自动通过WiFi的登录验证
关于WiFi的Captive Portal认证功能,可以点击这里了解更多。
要让树莓派自动通过Captive Portal的登录认证,主要思想是抓取一个登录界面的数据包进行分析,将点击登陆时提交的账号密码的过程替换成脚本自动提交。
编写一个自动登录脚本,包含自动连接WiFi,自动提交登录账号密码,检查登录结果。
在系统上电初始化完成后运行登录脚本完成登录,同时运行一个30s的定时任务检查互联网连接是否正常,如不正常则运行一次登录脚本。
1. 编写登录脚本
创建一个名为login.sh
的脚本,用于连接到WiFi并通过登录验证:
nano /home/pi/auto_login/login.sh
添加以下内容:
#!/bin/bash
# 连接到WiFi网络
sudo nmcli device wifi connect 'Your SSID'
# 等待连接建立
sleep 5
# 检查WiFi连接状态
nmcli device status
# 检查IP地址
ip addr show wlan0
# 提交登录表单并输出详细信息
curl -X POST https://[your login domain] \
-d "username=[your account]" \
-d "password=[your password]" \
-d "buttonClicked=4" \
-d "redirect_url=" \
-d "err_flag=0" \
-d "info_flag=0" \
-d "info_msg=0" \
-v
# 检查登录结果
curl -I http://github.com
保存并退出编辑器,然后使脚本可执行:
chmod +x /home/pi/auto_login/login.sh
2. 编写网络检查脚本
创建一个名为network_check.sh
的脚本,用于定期检查网络连接状态:
nano /home/pi/auto_login/network_check.sh
添加以下内容:
#!/bin/bash
LOGFILE="/var/log/network-reconnect.log"
TARGET="http://github.com" # 注意选择合适的网站,我选择http://www.baidu.com的时候就会获取到不能用的IP导致系统误以为网络没连接上
while true; do
echo "$(date): Checking network connectivity..." >> $LOGFILE
# 检查网络连接状态
if ! ping -c 1 -W 1 github.com > /dev/null; then
echo "$(date): Network is down or unable to access internet, running login script..." >> $LOGFILE
/home/pi/auto_login/login.sh >> $LOGFILE 2>&1
else
echo "$(date): Network is up and internet is accessible." >> $LOGFILE
fi
# 等待 30 秒
sleep 30
done
保存并退出编辑器,然后使脚本可执行:
chmod +x /home/pi/auto_login/network_check.sh
3. 使用systemd
定时器
创建一个systemd
服务文件:
sudo nano /etc/systemd/system/network_check.service
添加以下内容:
[Unit]
Description=Network Check Script
[Service]
Type=simple
ExecStart=/home/pi/auto_login/network_check.sh
保存并退出编辑器。
创建一个systemd
定时器文件:
sudo nano /etc/systemd/system/network_check.timer
添加以下内容:
[Unit]
Description=Run Network Check Script every 30 seconds
[Timer]
OnBootSec=30s
OnUnitActiveSec=30s
Unit=network_check.service
[Install]
WantedBy=timers.target
保存并退出编辑器。
重新加载systemd
配置,并启用和启动定时器:
sudo systemctl daemon-reload
sudo systemctl enable network_check.timer
sudo systemctl start network_check.timer
总结
本文分享了使用树莓派将WiFi连接的互联网共享至以太网,并且通过脚本实现登录界面的自动认证。
希望这篇博客能帮助到你。如果你有任何问题或需要进一步帮助,请在评论区留言。
参考
https://blog.csdn.net/weixin_45501411/article/details/103772070