1. 程式人生 > >基於嵌入式Linux系統的3G/4G路由器設計——iptables nat 模式

基於嵌入式Linux系統的3G/4G路由器設計——iptables nat 模式

1. 3G/4G路由器設計方案

  本路由器的設計是基於三個模組來實現的,分別為3G模組、WiFi模組和Linux硬體平臺,如圖1所示。3G模組的功能是利用運營商的無線資料卡進行PPP撥號,使得路由器能通過運營商網路連線至網際網路。WiFi模組的功能是使得無線網絡卡工作在AP(Access Point)模式,並配置動態主機配置協議的指令碼檔案,來建立一個2.4 GHz的WiFi無線區域網。Linux硬體平臺模組的功能主要有兩個方面,一方面要支援無線網絡卡和無線資料卡的驅動,另一方面要通過嵌入式Linux系統中的iptables資料包過濾系統將無線區域網和3G/4G網路連通。智慧終端等裝置通過WiFi通道接人到該路由器所提供的無線區域網中,分配到一個IP地址之後,則通過該無線區域網的閘道器進行資料包的接收和傳送,而該閘道器則通過3G/4G模組上的網路撥號介面來接收和傳送資料包至3G/4G 網路,從而實現了該路由器的設計方案。

  3G/4G路由器設計方案圖

  圖1 3G/4G路由器設計方案圖

  2. 3G/4G路由器硬體結構

  根據3G/4G路由器設計方案,其硬體結構的三大模組分別採用深圳天謨公司生產的Devkit8500D評估板、華為公司的E392型無線上網絡卡和TP-Link公司的TL-WN821N型無線網絡卡。

  Devkit8500D評估板的基本結構如圖2所示。該硬體平臺採用的是TI公司的DM3730微處理器。

  終端硬體結構圖

  圖2 終端硬體結構圖

  E392型無線上網絡卡採用高通公司的MDM9x00多模晶片組,同時支援TD-SCDMA/WCDMA 的3G 網路標準和LTE-TDD/FDD 的4G 網路標準。目前,利用3G網路中已經部署升級的HSPA+技術,下行峰值速率可以達到21 Mbps,上行峰值速率可以達到5.76 Mbps;部分地區採用64QAM 調製技術和MIMO技術對HsPA+進行再次升級,下行峰值速率可以達到42 Mbps左右;而即將部署的4G網路,下行峰值速率可以達到i00 Mbps,上行峰值速率可以達到50 Mbps。

  TL-WN821N 型無線網絡卡是基於Realtek公司的RTL8192cu晶片設計的,採用MIMO技術和空頻道檢測技術,支援802.11n/b/g,效能穩定且能夠提供最大300 Mbps的無線傳輸速率,完全滿足智慧終端等裝置的頻寬需求。
路由器Linux系統

  3. 3G/4G路由器關鍵技術

  3G/4G路由器是指利用WiFi的2.4GHz頻段,組建一個無線區域網,並配置無線區域網的基本資訊,通過Linux系統的 iptables將無線區域網接人到3G/4G網路中。其關鍵技術具體分為3G/4G 網路的接入、無線區域網的組建以及iptables的連通三個部分。

  3.1 3G/4G網路的接入

  該無線路由器利用E392型多模無線上網絡卡在嵌入式Linux系統中進行PPP撥號,分別接入到TD-SCDMA,WCDMA以及TD-LTE實驗網中。其具體實現流程如圖3所示。

  3G/4G網路接入流程圖

  圖3 3G/4G網路接入流程圖

  3.1.1 多模無線上網絡卡驅動載入

  當一個新的USB裝置接入到Linux主機中,主機首先會通過控制端點讀入此裝置的配置,介面和端點等資訊,利用控制管道完成控制型傳輸,然後主機再對該裝置進行列舉。列舉即讀取該 裝置的許多重要資訊,其中最重要的是讀取該裝置的生產商識別碼(VID)以及產品識別碼(PID),將這兩個識別碼分別與USB核心中意存在的各個識別碼進行匹配。若匹配成功,即的利用Linux系統的USB核心成功實現了 該裝置的USB驅動的載入。

  本設計方案中採用的嵌入式Linux系統的核心版本號為2.6.32,該核心中與USB裝置的VID和PID號相關的原始碼存在 kernel/drivers/usb/serial/option.c中,修改該檔案並新增本 終端設計方案中所採用的華為E392無線上網絡卡的VID和PID,過程如下:

  # define HUAWEI_VENDOR_ID 0x12D1

  # define HUAWEI_PRODUCT_E1446 0x1446

  {USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID,

  HUAWEI_PRODUCT_E1446,0xff,0xff,0xff)}

  然後配置嵌入式Linux系統核心中的Devices driver→usb support→usb Serial Converter Support選項,使得Linux系統核心支援USB串列埠轉換,然後選擇按模組重新編譯核心,生成option.ko和usbserial.ko 驅動檔案。最後載入這兩個驅動檔案並插上該多模無線上網絡卡,完成驅動載入。

  3.1.2 終端模式轉換

  在3.1.1節中實現的是USB裝置的載入,即Linux系統識別出無線上網絡卡為USB裝置並能與之通訊。而一般 USB無線上網絡卡裝置都具有兩個USB子裝置模式,即usb-storage子裝置模式和modern子裝置模式。此時 Linux系統預設會將該裝置識別為usb-storage子裝置模式,需要通過USB裝置的模式轉換工具usb- modeswitch將USB裝置的工作模式轉換為modem模式,這樣才能使得無線上網絡卡能夠正常工作。

  首先需要將usb- modeswitch工具移植至開發板,移植過程如下:

  ① 下載並解壓usb-modeswitch一1.2.5.tar.bz2。

  ② 進入usb-modeswitch目錄,修改Makefile,指定交叉編譯器:

  CC = arm-none-linux-gnueabi - gcc

  $(PROG):&(OBJS)&(CC) - o $(PROG)&(OBJS)

  & (CFLAGS)… 。 - I/home/libusb- 0.1.12/instal1/inc1ude

  &(LIB) … 。 - L/home/libusb- 0.1.12/install/lib

  ③ make。

  將生成的usb_modeswitch二進位制執行檔案拷人Linux系統中,並修改usb_modeswitch目錄下usb_mode- switch.conf配置檔案,在該檔案末新增該無線上網絡卡的VID裝置號和其usb-storage子裝置PID裝置號,然後指定其modern子裝置號。具體配置資訊如下:

  Default Vendor = 12D1

  Default Product = 1446

  Target Vendor = 12D1

  Target Product = 1506

  CheckSuccess = 20

  HuaweiMode = O

  通過命令usb_modeswitch - W - c usb_modeswitch.conf對無線上網絡卡進行USB裝置的模式轉換,轉換成功後無線上網絡卡即工作在調變解調器模式下,同時可通過命令 ls/dev可以檢視到Linux系統生成4個虛擬USB轉串列埠裝置,即ttyUSB0,ttyUSB1,ttyUSB2和ttyUSB3,可以通過這幾個串列埠進行PPP撥號,使得3G/4G路由器可以接至TD-SCDMA、WCDMA以及TD-LTE實驗網中。

  3.2 無線區域網的組建

  該無線路由器利用無線網絡卡在嵌入式Linux系統中組建一個小型的無線區域網,一方面提供給智慧終端等裝置接入,另一方面將無線區域網接入至3G/4G 網路。其基本流程如圖4所示。

  無線區域網組建流程圖

  圖4 無線區域網組建流程圖

  3.2.1 無線網絡卡驅動載入

  TL-WN821N 型無線網絡卡採用的WLAN晶片組為Realtek公司的提供的RTI 8192cu晶片,Realtek公司提供了基於Linux系統的該晶片組驅動原始碼,根據 編譯環境及Linux核心對驅動原始碼進行編譯,即可生成該無線USB網絡卡的驅動。具體步驟如下:

  ① 下載驅動原始碼rtl8188c 8192c usb linux - v3.4.4- 4749.2.121105.tar.gz,並解壓。

  ② 進入到驅動原始碼包中,修改Makefile檔案,指定編譯環境及Linux核心:

  CONFIG_PLATFORM_NEW = y

  ifeq($(CONFIG_PLATFORM_NEW ),y)

  EXTRA_CFLAGS + = - DCONFIG_LLTTLE_ENDIAN

  ARCH :arm

  CROSS_COM PILE := arm-none-linux-gnueabi-

  KSRC=/home/linux-2.6.32-devkit8500

  endif

  ③ make,生成該無線網絡卡的驅動8192cu.ko。

  然後載入該驅動,再通過命令ifconfig wlan0 up,將無線網絡卡的網口wlan0掛載至Linux系統中,可通過ifconfig命令檢視該網口的基本配置資訊。

  3.2.2 AP模式轉換

  將無線網絡卡驅動載入成功之後,該無線網絡卡的預設工作模式為工作站模式,即作為客戶端搜尋周圍的無線接人點,以接人到其他的無線區域網中,而 3G/4G路由器需要利用無線網絡卡的模式轉換工具hostapd將該網絡卡的工作模式由工作站模式切換為AP模式,也稱接入點模式,並利用該模式建立一個無線區域網。hostapd在Linux系統中的移植過程如下:

  ① 下載並解壓hostapd_0.8_rtw_20120803.zip。

  ② 進入主目錄,修改Makefile,指定交叉編譯器:

  CC = arm-none-linux-gnueabi-gcc

  ③ make。

  生成hostapd、hostapd_cli,將這兩個二進位制檔案和rtl_hostapd.conf複製到嵌入式Linux系統中。在 rtl_hostapd.conf配置檔案中,可以設定該無線網絡卡的服務集標識(SSID)、支援的802.11協議版本、工作頻率、無線通道以及加密的方式等一系列該無線區域網的配置資訊。通過執行命令hostapd rtl_hostapd.conf-B,完成該無線網絡卡的工作模式的切換。

  3.2.3 DHCP配置

  在無線網絡卡的AP模式切換完成之後,需要通過DH-CP協議配置該無線區域網的動態地址池及其閘道器,該無線區域網會根據DHCP協議從配置的地址池中,自動給接入到該無線區域網的智慧終端等裝置分配一個IP地址。其DHCP協議的配置檔案dhcp.conf具體如下:

  start 192.168.0.20

  end 192.168.0.254

  interface wlan0

  opt dns 8.8.4.4

  opt subnet 255.255.255.0

  opt router 192.168.0.1

  opt lease 864000

  然後在Linux系統中執行udhcp-fS dhcp.conf,啟動DHCP協議。之後該無線網絡卡會建立一個無線區域網,並給接入到此無線區域網中的智慧終端等裝置自動分配一3.3 iptables連通

  在實現3G/4G 網路的接人和無線區域網的組建之後,該路由器採用Linux系統中的IP資訊報過濾系統,即iptables,將3G/4G網路和組建好的無線區域網連通。iptables系統需要Linux系統核心中的網路資料包過濾框架的支援,需要重新配置核心,選中核心中Networking Support → Networking options → Network packet filtering framework,將其框架編譯進Linux核心,然後需要對iptables進行移植,其移植過程如下:

  ① 下載並解壓iptablesj.4.3.1.tar.gz。

  ② 進入主目錄,配置編譯選項:

  。 /configure-prefix=/usr/local/iptables--host = arm-none-linux-gnueabi--with-curnel=/home/SD_tools/linux-2.6.32-devkit85O0

  ③ make並make install。

  將生成的iptahles二進位制執行檔案複製到Linux系統中,並編寫iptables系統的執行指令碼檔案net-share,該執行指令碼檔案配置了IP資料包的流向、進入網路的介面等一系列規則,該路由器進入3G/4G 網路的介面為無線上網絡卡進行撥號後產生的pppO網路介面,其內容如下:

  echo‘1’》 /pr0c/sys/net/ipv4/ip- forward

  iptables -F

  iptables -P INPUT ACCEPT

  iptables -P OUTPUT ACCEPT

  iptables -P FORW ARD ACCEPT

  iptables -t nat-A POSTROUTING -o ppp0-j MASQUERADE

  在Linux系統中執行指令碼檔案./net-share,即完成了無線區域網至3G/4G網路的連通,從而實現了3G/4G路由器的設計。

上面的內容來源於《嵌入式linux系統的3G/4G路由器設計重慶郵電大學 。在實際除錯的時候,最後面IPtables 操作的時候經常出問題,下面補充一些iptables 相關的知識。

可以參考:

下面是我的執行指令碼,以供參考:

#!/bin/sh 

#載入驅動
insmod 8192cu.ko

#等待驅動載入完成
sleep 1s

#配置WiFi 引數
ifconfig wlan0 up
ifconfig wlan0 192.168.0.1
echo wlan0 up ok

#啟動WiFi AP模式
./hostapd rtl_hostapd_2G.conf -B
echo hostapd ok


#啟動dhcp 自動分配IP 
mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases
udhcpd -fS dhcp.conf &
echo udhcpd ok


#設定執行檔案路徑(為了找到iptabls 命令, iptabls 在/data/目錄 )
export "PATH=/usr/bin:/usr/sbin:/bin:/sbin:/data"

#開啟linux的轉發功能。
echo '1' >> /proc/sys/net/ipv4/ip_forward
echo set path ok

#做一個SNAT,也就是源地址轉換。將來自192.168.0.2/25的地址轉換為192.168.20.222
#192.168.20.222 為有線網絡卡驅動eth0 的IP
#192.168.0.2/25 為WiFi會自動分配的IP
#也就是將連線到WiFi的所有裝置的IP 都裝換為 有線網絡卡的IP
iptables -t nat -A POSTROUTING -s 192.168.0.2/25 -j SNAT --to 192.168.20.222

#上網控制,允許192.168.0.1/32 這個範圍的的IP 訪問網路 
iptables -A FORWARD -s 192.168.0.1/32 -j ACCEPT
echo iptable set ok

    上面最後ipables 使用的是指定轉出ip,也就是將192.168.0.2/25 網段的ip 使用IP:192.168.20.222 轉發出去,對於3G/4G這種行動網路,它撥號後的ip不是固定的,所以不太適合,這裡有一種方法可以直接指定網絡卡,使用虛擬ip,讓系統自動去獲取行動網路的ip。命令如下:

iptables -t nat -A POSTROUTING -s 192.168.0.2/25  -o usb0 -j MASQUERADE

    其中usb0是移動網絡卡網路介面。