用途

让普通单网口的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