很多時候,總有些奇怪的需求,這時候是發揮我們的聰明才智的時候!!
有客戶的需求是:
描述下需求:現今有一個控制設備,里面有WIFI,物聯網絡,以太網2個,其中有一個以太網2是鏈接內部設備,而其余幾個均可連接公網。要求是使得內部設備也能正常的訪問公網。
這種需要的確有點讓人摸不着頭腦,其實這就是一種路由的問題,在這里以太網2與其他網絡設備是在同一個設備中(linux,android,Ubuntu等),也就是說他們內部是有聯系的。
那其實就是需要將以太網2的網絡請求定向至其他能夠連接公網的設備接口上。
解決:
在linux和android設備上都有一些關於網絡的命令:iptable,ip rule,dhcp等。
這里的話我們得熟悉dhcpsd(dhcp服務端)與dhcpcd(dhcp客戶端),這里是這樣的,我們的ip是被自動分配的,而分配IP的自然是dhcpsd我們的服務端,我們家里用的路由器就是dhcpsd,而我們手機上則會運行dhcpcd來獲取ip。這里的話,我們需要使用一個dhcpsd,來為以太網卡2下的設備分配IP地址。
添加路由規則,這里我也使用過ip rule去添加,但是效果不太好,也有可能是我學藝不精。這里使用的是iptable去完成的一個轉發規則。
首先,我們呢,使用iptable來實驗一下,如何試驗,試驗工具呢?
試驗工具:PC,android手機一台,Wireshark(抓包工具),Packet Sender(發包工具)
試驗目的:在PC端向連接同一網段WIFI的手機的5060端口發送數據包,然后手機通過路由表直接轉發給PC機的5060端口,使得PC監聽5060端口好像能收到自己從另個端口發來數據。
1.首先得使用Wireshark設備過濾項。
2.然后使用Packet Sender組織數據准備發到手機phone ip:5060。
3.編寫腳本:
iptables -t nat -A PREROUTING -d 192.168.0.194 -p tcp --dport 5060 -j DNAT --to-destination 192.168.0.121:5060 iptables -t nat -A POSTROUTING -s 192.168.0.121/24 -j SNAT --to 192.168.0.194
4.執行腳本,並執行發送命令,這樣通過抓包工具就能收到PC未知端口發向PC5060的數據。
我們來分析下腳本:
iptables :四張表+五條鏈+規則組成 表: 1.nat 地址轉發規則 2.mangle 訪問控制,規則匹配 3.raw 數據博狀態跟蹤與分析 4.filter 修改數據包,改變包頭中的內容 鏈: 1.INPUT 到達本機內部的報文的位置 2.OUTPUT 由本機內部發出的報文的位置 路由本機要發給目標的IP 3.FORWARD 由本機轉發的報文的位置 4.PREROUTING 報文進入本機的路由前的位置 5.POSTROUTING 報文路由后流出本機的位置 規則自己添加 iptables [-t 表名] <-A|-I|-D|-R> 鏈名 [規則編號] [-i|-o 網卡名稱] [-p 協議類型] [-s 源IP地址|源子網] [-sport 源端口號] [-d 目標IP地址|目標子網] [-dport 目標端口號] [-m 模式 [模式選項]] -j 動作 [動作選項]
這里192.168.0.121為PC機,192.168.0.194為路由機(手機)。
那么第一條命令這樣解析:iptable -t(表) 在nat表中改報文進入本機的路由前的位置 目標為192.168.0.194,協議為tcp,且端口為5060的數據包 -j(動作)DNAT(目標地址)替換為192.168.0.121:5060。這樣就發回去了!
但是這樣抓到的包是PC發到PC,我們想把來源信息也修改下,所以就有了第二句:
nat 表,報文路由后流出本機的位置 -s來源為192.168.0.121/24 的源地址替換為192.168.0.194。
好的,想必我們已經大致熟悉了iptable的使用方法,當然如果還有不了解什么源地址,目標地址的,請搜索關鍵詞:網絡基礎,報文,路由。這些基礎知識是必需的,先把這些基礎了解的才能更好地學習強大的iptable命令。
我們再嘗試寫一些小的試驗:
#將所有發送給192.168.0.121的數據包丟棄。
iptables -A OUTPUT -d 192.168.0.121 -j DROP
#拒絕所有來自192.168.0.0網段的數據
iptables -A INPUT -s 192.168.0.0/24 -j REJECT
iptables -t raw -A PREROUTING -d 192.168.0.0 -j REJECT
上面已經做了拒絕網關的處理,那我們是不是無法上網了?對的網關的數據都會被拒絕或丟棄,那可咋辦?
別急,既然可以添加表,當然也可以刪除表,使用:
iptables -t raw -F 或者 iptables -F #清除所有規則
接下來就是我們的重頭戲了!!!
怎么使用WIFI,4G分享網絡給我們的以太網口?我記着在我上學那會兒,學校斷網,大家為了打LOL都是開動了腦筋,使用數據流量,怎么分享呢,大都數使用的是WIFI熱點分享出自己的數據流量,但是這樣的信號會差很多,延遲高一些,有些機智的朋友使用USB來共享(現在android基本都有),使用USB作為一個虛擬的網卡,數據流量走向USB口。我想其中的原理大概是一樣的吧。
我們這里直接附上代碼:
wlan_0=$(ifconfig -a wlan0|grep "inet addr");
#echo $wlan_0;
wlan_0=${wlan_0:20:13};
#echo $wlan_0;
echo 1 > /proc/sys/net/ipv4/ip_forward; #啟用IP轉發 ifconfig eth1 192.168.100.1 netmask 255.255.255.0; ip route add 192.168.100.0/24 dev eth1 table local_network proto static scope link; #這句不明白什么意思,知道是網友可以留言告訴我 ifconfig eth1:1 192.168.100.4 netmask 255.255.255.0 up; #給eth1綁定第二個網卡 iptables -t nat -A POSTROUTING -o wlan0 -s 192.168.100.0/24 -j MASQUERADE #地址偽裝,將wifi的ip替換為源ip地址 iptables -t nat -A PREROUTING -i eth1 -d 192.168.100.4 -j DNAT --to $wlan_0 #從eth1,IP為192.168.100.4流入的數據包做DNAT轉換轉發到內部wlan_0上 iptables -t nat -A POSTROUTING -o eth1 -s $wlan_0 -j SNAT --to 192.168.100.4 #從eth_1流出,源地址為wlan_0的數據做SNAT轉換到外部192.168.100.4 busybox udhcpd -fS /system/data/eth1_udhcpd.conf& #啟動dhcpd服務端為底下的設備自動分配IP地址 這樣,就能使用WIFI的網絡分享給我們下面的以太網口了,其余的網絡如法炮制。
eth1_udhcpd.conf文件如下:
start 192.168.100.2
end 192.168.100.200
interface eth0
opt dns 192.168.100.1
option subnet 255.255.255.0
opt router 192.168.100.1
max_leases 234
option domain local
option lease 120
這里再附上一些值得學習的鏈接:
https://blog.csdn.net/yujing2013/article/details/53482751 四網卡和一個網橋
https://blog.csdn.net/u012758088/article/details/76255543
https://blog.csdn.net/renwotao2009/article/details/51225359?utm_source=blogxgwz1
https://blog.csdn.net/sxy2475/article/details/78295447
https://blog.csdn.net/renwotao2009/article/details/51225359/
https://blog.csdn.net/kwame211/article/details/78800940 bctrl用法
https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.cmds2/dhcpcd.htm
https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.cmds2/dhcpsd.htm
https://www.isc.org/downloads/ dhcp源碼
https://www.cnblogs.com/ssooking/p/7890192.html iptables語法1
https://blog.csdn.net/sxy2475/article/details/78295447 iptables語法2
https://blog.csdn.net/luotong86/article/details/38688119 udhcpd配置文件英文說明
http://blog.51cto.com/moonsilver/215123 udhcpd配置中文說明
https://blog.csdn.net/chengxuyuanyonghu/article/details/64441374