Linux系統下封殺非法IP [轉]

http://www.net130.com  作者:楊鵬

不久前,一位朋友想把他管理的局域網出口全部進行IP和MAC地址綁定,以防止非法用戶上網。該局域網是用Linux實現Internet接入和管理。整個網絡包括數棟樓房,分別通過交換機級聯到總的Internet出口。網絡使用了10.0.0.x到10.0.3.x/255.255.252.0這樣的子網,總容量應該有1016(254×4)臺主機。目前有大約400位合法上網用戶,這些用戶可能會隨時增減。在Linux系統下,想利用MAC原理對IP進行封殺,從而達到對某個IP地址或IP地址段的管理和控制,可以通過Linux系統提供的ARP來實現。

構思

決定使用ARP綁定後,接下來就要考慮ARP的實現方法。ARP(Address Resolution Protocol)協議是用來向對方的計算機、網絡設備通知自己IP對應的MAC地址的。如果所有非法用戶都被賦予了錯誤的MAC地址,那麼他們是無法通過這臺服務器上網的。因此,ARP綁定要求必須將所有可能的IP地址全部與MAC地址綁定,才能夠杜絕非法用戶(當然,用戶修改MAC地址除外)。

經過一番思索,確定了初步的構思。首先,用Linux Shell的循環方法生成一張包含從10.0.0.1到10.0.3.254的無效MAC地址匹配表,稱之爲全局表。然後根據DHCP服務器的數據得到一張合法用戶的IP和MAC地址表,稱之爲合法表。接着,讀取合法表中每個用戶的IP,並在全局表中尋找匹配的IP,如果找到的話就用合法用戶的MAC地址替換原來無效的MAC地址。最後,這張全局表中的合法用戶匹配正確MAC地址,而非法用戶匹配無效的MAC地址。只要用戶把這張表寫入系統ARP緩存,非法用戶就不能通過簡單的盜取IP方法來通過網關了。

實現

首先生成一張初始的全局表。它包含所有IP地址,每個IP地址與一個非法的MAC地址匹配。它的格式必須是arp命令能夠識別的。初始化全局表的腳本爲init,內容如下:

#!/bin/bash
ipprefix=10.0.
count1=0
while (( $count1 < 4 ))
do
 count2=1
 while (( $count2 < 255 ))
 do
  echo“$ipprefix$count1.$count2  00e000000001”
  let $count2+=1
 done
 let $count1+=1
done
 


寫好後存檔,用“chmod +x init”命令使得腳本可執行。然後運行腳本init > arp,就可以將結果保存到當前目錄的arp文件中。該文件就是10.0.0.1到10.0.3.254所有IP地址與MAC地址00e000000001綁定的ARP表,看上去該文件類似於下面這樣:

10.0.0.1  00e000000001
10.0.0.2  00e000000001
10.0.0.3  00e000000001
10.0.0.4        00e000000001
10.0.0.5    00e000000001
... ...
 


需要注意的是,Shell腳本語法雖然和C語言類似,但對格式要求很嚴格,有些地方不能加空格,有些地方則必須加空格。比如let $count1+=1就不能寫成let $count1 += 1;相反,while (( $count1 < 4 )) 也不能寫成while (($count1<4)),括號與語句之間必需有空格。

接下來通過DHCP服務器得到合法用戶的IP與MAC地址匹配表(即合法用戶表),假設是valid.arp文件。編寫一個腳本一行一行地讀取該表,每得到一個IP地址記錄,就在前面生成的arp文件中查找同樣的IP。如果找到的話,那麼就用valid.arp中該IP的MAC地址替換arp文件中該IP的MAC地址。valid.arp文件可能像下面這樣:

10.0.0.2  00e00a0f1d2c
...
10.0.1.25 00e0b2c3d5c1
...
 


查找替換腳本爲replace,內容如下:

#!/bin/bash
# 定義並初始化三個變量,分別是合法用戶表、全局表和作交換用的表
validArp=valid.arp
globalArp=arp
tmpArp=tmp.arp

count=1
# 371是合法用戶的總數,也就是valid.arp表的記錄數,然後加1
while (( count < 371 ))   
do
 #“ sed -n‘“$count”p’$validArp”命令將每次打印valid.arp文件中的第$count個記錄
 # 例如,當$count=1的時候,該命令將打印: 10.0.0.2 00e00a0f1d2c2
 # eval $getValid將會執行$getValid變量所包含的語句,並將結果賦給變量$curRec
getValid=“sed -n‘“$count”p’$validArp”
 curRec=‘eval $getValid’
 # echo $curRec | awk‘{print $1}’命令將打印$curRec內容的第一個字段,也就是IP地址
 # 然後我們將這個IP地址賦值給$curIP變量
getIP=“echo $curRec|awk‘{print /$1}’”
   curIP=‘eval $getIP’
 # 這樣我們就得到了合法用戶的IP及IP和MAC地址對,接下來是最關鍵的一步
 # 下面兩條語句在全局表中查找與得到的IP匹配的項目,找到後就在該記錄後面添加合法用戶的IP
 和MAC地址對,然後刪除舊的非法IP和MAC地址對,並將結果存入一個新的文件tmp.arp
replace=“sed -e‘/$curIP/>/a/ $curRec’ -e‘/$curIP/>/d’$globalArp >$tmpArp”
 eval $replace然後用新的文件覆蓋全局表文件,並將計數器加1,供下次循環
cp -f  $tmpArp $globalArp
 let count+=1
done
 


到此腳本結束。需要注意的地方有兩個:第一,所有包含“eval”命令的語句,使用的都是反引號,也就是通常位於Tab鍵上面的那個引號,這樣變量才能得到語句執行的結果,而非語句本身;第二,如果出現變量和其它字母在一起的情況,用雙引號將變量包含,否則會出現錯誤的變量名,例如下面這條語句:

getValid=“sed -n‘“$count”p’$validArp”

如果不用雙引號把變量$count包起來,Shell會認爲用戶的變量是$countp,而不是$count。

在執行完replace後,再查看arp文件,會發現其中所有在valid.arp文件中存在的IP和MAC地址對,其中的初始化MAC地址已被替換爲正確的MAC地址。

最後,將得到的arp文件拷貝爲/etc/ethers,在系統啓動時運行“arp -f”,就可以實現IP和MAC地址匹配了。

總結

通過這件事不難發現,Linux繼承了Unix的優秀傳統,具備強大和完善的系統管理方法。只要用戶掌握一些常用的命令與工具,就可以極大地提高系統管理效率,降低管理的工作強度。學習和掌握這些方法,是每個合格的Linux系統管理員都應該做到的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章