構(gòu)建環(huán)境:
系統(tǒng):Ubuntu 14.04
網(wǎng)卡:兩張有線網(wǎng)卡,TL-WN821N
路由器硬件結(jié)構(gòu):
如圖:? ?
上圖所示,我們常用的家用路由器由三部分組成,包括左下角的交換芯片組,右下角的WIFI芯片和上方的CPU。一般路由器會(huì)有5個(gè)接口,這5個(gè)接口最終會(huì)通過交換芯片匯聚成一路觸發(fā)CPU中斷。由于交換芯片是可編程的,可以將WAN口單獨(dú)劃入一個(gè)VLAN,這樣可以將WAN和LAN區(qū)分開。而WIFI芯片則通過br0與LAN橋接在一起。
我們準(zhǔn)備兩張有線網(wǎng)卡和一張無線網(wǎng)卡。我們可以用一張有線網(wǎng)卡模擬圖中的WAN口,一張網(wǎng)卡模擬lan口,TL-WN821模擬WIFI芯片。
設(shè)置無線接口為AP模式:
1、安裝hostapd ?apt-get install hostapd
2、nmcli nm wifi off ?#改變NetworkManager里的狀態(tài),關(guān)閉wifi,同時(shí)軟鎖定
3、rfkill unblock wlan #啟用wifi設(shè)備,不同于網(wǎng)絡(luò)狀態(tài)中的啟用wifi(后者改變NetworkManager里的狀態(tài))
完成上面3步后,ifconfig 查看無線接口假設(shè)為wlan1
橋接LAN和無線接口:
1、下載brctl源碼包:http://www.linuxfromscratch.org/blfs/view/svn/basicnet/bridge-utils.html
autoconf
./configure
make
make install
2、新建橋接口brctl braddr br0 ; ifconfig br0 up
3、橋接無線接口到br0,并激活無線配置,添加配置無線配置文件/etc/hostapd/wpa2.conf,內(nèi)容如下
interface=wlan1//接口名字
bridge=br0
driver=nl80211
ssid=my_router_test//ssid
hw_mode=g //模式
channel=11 //頻道
wpa=2
wpa_passphrase=12345678//密碼
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
啟動(dòng)無線配置
hostapd -B /etc/hostapd/wpa2.conf
4、查看橋接口brctl show 發(fā)現(xiàn)wan1 已經(jīng)在br0下面了。
5、假如如還用其他有線網(wǎng)卡,如eth1,可以通過brctl addif br0 eth1 將eth1加入br0橋
路由器軟件結(jié)構(gòu)
如圖上圖所示,web server一般用于用戶頁面配置參數(shù)使用,web server通過CGI調(diào)用flash set命令工具將參數(shù)保存到flash,隨后CGI啟動(dòng)初始化腳本,腳本將所需參數(shù)通過flash get讀取出來,并用讀取的參數(shù)重啟各個(gè)應(yīng)用。
配置DHCP服務(wù)器(用于給連接路由器的設(shè)備分配IP)
這里用的是isc-dhcp-server,你也可以使用其它的dhcp服務(wù)器程序
1、安裝isc-dhcp-server,sudo?apt-get?install?isc-dhcp-server
2、修改dhcp server所綁定的接口,修改/etc/default/isc-dhcp-server文件的”INTERFACES”字段改為br0。
3、修改/etc/dhcp/dhcpd.conf文件,修改分配的DNS地址option?domain-name-servers后面改為8.8.8.8,?114.114.114.114
配置DHCP地址池,在文件尾部添加
subnet 192.168.1.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.1.2 192.168.1.100;
option broadcast-address 192.168.1.255;
option routers 192.168.1.1;
}
4、重啟接口ifconfigbr0?192.168.1.1?netmask?255.255.255.0?up
5、重啟DHCP服務(wù)器/etc/init.d/isc-dhcp-server?restart
IPtables
Iptables主要作用是用于攔截,修改,標(biāo)記數(shù)據(jù)包。
iptables默認(rèn)有5 條鏈,他們對(duì)應(yīng)處理數(shù)據(jù)包的5個(gè)掛在點(diǎn)。5個(gè)掛載點(diǎn)的位置如圖所示:
PREROUTING:數(shù)據(jù)包進(jìn)入路由表之前
INPUT:通過路由表后目的地為本機(jī)
FORWARD:通過路由表后,目的地不為本機(jī)
OUTPUT:由本機(jī)產(chǎn)生,向外轉(zhuǎn)發(fā)
POSTROUTIONG:發(fā)送到網(wǎng)卡接口之前
iptables另外還有3個(gè)做特定處理的表。
mangle?表用于標(biāo)記數(shù)據(jù)包
nat用于轉(zhuǎn)換地址
filter用戶過濾數(shù)據(jù)包
Iptables鏈與表的關(guān)系如圖:
如上圖所示PREROUTING和POSTROUTING是不能進(jìn)行過濾操作的,且各個(gè)表在鏈中的處理順序是mangle > nat > filter
NAT:
為了成功的與公網(wǎng)進(jìn)行通信,我們需要把我們的私有地址轉(zhuǎn)換成我們唯一的公網(wǎng)地址才行。
1、開啟LINUX的路由轉(zhuǎn)發(fā)功能 sudo sysctl -w net.ipv4.ip_forward=1
2、iptables -F ?清理iptable所有表的所有規(guī)則
iptables -t nat -F 指定清理iptable nat表的所有規(guī)則
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE //將路由后從eth0接口出去的包,進(jìn)行源IP地址偽裝,偽裝成該接口的IP地址。
最后將命令整理成init.sh shell腳本,設(shè)置成開機(jī)自啟動(dòng)就完成了。