用途
让普通单网口的linux,通过插USB无线/有线网卡,热插拔变成一个路由器.
基本原理
网桥(VLAN/BR-LAN)+ipv4转发+iptables NAT转发 +DHCP 服务器
brctl网桥管理
需要安装的模块
kmod-bridge,brctl, CONFIG_VLAN_8021Q
代码实现
## 通过网桥工具,创建LAN网段
brctl addbr br-lan
ifconfig br-lan up
ifconfig br-lan 192.168.20.1 netmask 255.255.255.0
## 把网口加入到LAN
brctl addif br-lan wlan0
brctl addif br-lan eth1
IP转发
需要安装的模块
iptables
逻辑实现
##启用转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
export XTABLES_LIBDIR=/usr/lib/xtables
## eth0是wan口 eth1是lan口
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
##iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i br-lan -o eth0 -j ACCEPT
DHCP 服务器
需要安装的模块
udhcpd
代码实现
## 启动DHCP服务器
dnsmasq -C /tmp/dnsmasq.conf -k &
热插拔
实现热插拔创建lan网络,需要安装的模块
mdev
cat mdev.conf
SUBSYSTEM=net;DEVPATH=.*/net/.*;.* 0:0 0660 */usr/bin/SimConfig usb_net_change
热插拔事件
cat /usr/bin/SimConfig
if [ "$1" = "usb_net_change" ]; then
case "${ACTION}" in
'add'|'')
usb_net_add "${ACTION}" "${MDEV}"
;;
'remove')
usb_net_remove "${MDEV}"
;;
esac
fi
## USB热插拔插入
function usb_net_add {
## 启动有线网卡和无线网卡
log "hotplug: usb_net_add ($1 / $2)"
START_ROUTER
BR_LAN_ADD_ALL
## USB热插拔移除
function usb_net_remove {
log "hotplug: usb_net_remove ($1)"
wlan0Down=`brctl show|grep wlan0|wc -l`
eth1Down=`brctl show|grep eth1|wc -l`
if [ "$wlan0Down" = "0" -a "$eth1Down" = "0" ]; then
ifconfig br-lan down
stop_DHCP_SRV
stop_AP_hostapd
log "hotplug: br-lan Down"
rm /tmp/ROUTER_MODE.Ready
fi
}
}
更多资料
https://www.sohu.com/a/404165656_354899
最后一次更新于2024-09-17