1. 程式人生 > >linux 嵌入式環境使用iptables防火牆的一些體驗

linux 嵌入式環境使用iptables防火牆的一些體驗

 近期剛剛轉到linux伺服器開發組,因為需求問題需要開發一部分內網環境路由、策略控制方面的內容,走了很多彎路,現在總結一下!完全是隨筆,比較亂。

這裡不介紹如何下載安裝!

 路由方面由於初期不清楚linux核心提供IP轉發功能,去選擇開源路由器原始碼去學習,比如quagga、番茄等,但是分割其中的內容加入現有系統比較麻煩,quagga還是不錯的,屬於程序模組也比較方便加入系統,操作上比較類似Cisco,後來因為一些偶然的因素髮現linux開啟IP轉發之後就可以實現一部分需求上的內容,於是放棄其他開源專案,轉向linux自身的挖掘。

作為內網控制幾個方面比較重要:上網控制、內網訪問/控制隔離。

上網控制:內網對於外網的訪問應該受到限制,比如授信外網站點,域名過濾,重定向等

內網訪問/控制隔離:伺服器埠控制,外網埠控制重定向等

實際使用中用到的模組或者命令:系統設定sysctl.conf、iptables、ipset以及其他相關的擴充套件模組!

linux防火牆由使用者層iptables以及核心netfilter構成,要使用這部分內容首先需要開啟核心IP轉發:sysctl.conf(一般位於/etc/sysctl.conf),修改其中的.......ip_forward = 0 改為 1即可,之後使用 sysctl -p 命令使其立即生效或者使用 echo "1" > /proc/sys/net/ipv4/ip_forward,當然這個命令屬於當前有效,重啟即失效,但是對於每次重啟都需要重新進行配置的專案來說也無不可.

iptables部分:使用者層主要操作命令。整個的資料轉發過程需要經過5個鏈PREROUTING,INPUT,OUTPUR,FORWARD,POSTROUTING,主要操作mangle、filter、nat表,不做詳細介紹,這部分網上相關內容很多也很詳細!過濾部分的內容完全可以只做PREROUTING、POSTROUTING兩個部分以及nat表。

iptables可以做的常用內容有資料包是否允許通過、埠是否被允許、哪種協議是被允許的、哪些關鍵字是應該被過濾的等等,部分內容需要擴充套件模組支援。

關於擴充套件模組建議直接下載完整版的iptables直接編譯,那樣功能應該比較齊全。另外最好下載ipset支援部分,ipset屬於地址池管理,在控制不連續地址或者具有大量不同的地址劃分中個人感覺用處很大!

先說下iptables相關的部分,很重的一點iptables命令順序執行,匹配其中之一立即跳出否則按照預設處理!所以編排命令列表的順序很重要。

格式:

1、iptables -t nat -A(I) PREROUTING -s 192.168.1.10 -p tcp --dport 80 -j ACCEPT     允許源地址192.168.1.10的TCP協議,目標埠是80的訪問通過

2、iptables -t nat -A(I) PREROUTING -d 192.168.1.10 -p tcp   ! --dport 80 -j ACCEPT 允許目標地址192.168.1.10的TCP協議,目標埠不是80的訪問通過

3、iptables -t nat -A(I) PREROUTING -s 192.168.1.10 -p tcp --dport 80 -j DROP(其他)  禁止

4、iptables -t nat -A(I) PREROUTING -s 192.168.1.0/24 -p udp --dport 8000:8001 -j DNAT --to-destination 192.168.1.100(伺服器)  將192.168.1.0網段的8000到8001的udp連線跳轉到伺服器192.168.1.100上(更換目標地址為192.168.1.100)  也就是做DNAT轉換

5、iptables -t nat -A POSTROUTING -d 192.168.1.100 -p all -j MASQUERADE  開啟地址偽裝

以上5條為基礎命令部分  一般情況下都會支援這些內容,合理的利用可以做到控制IP或者網段或者不同協議埠的訪問控制,普通使用上應該足夠.

下面介紹下擴充套件部分:

擴充套件主要使用 -m 引數支援,常用擴充套件模組 multiport , string , set ,state ,連線數控制,防攻擊處理等,這裡只說下多埠multiport,以及多不連續IP的處理.。

多埠:iptables .....  -p tcp -m multiport --dports(sports,ports) 80,443,8080  -j .。。  分別匹配目標埠,源埠,所有兩類埠

不連續IP:連續IP可以使用  iprange模組 如:-m iprange --src(dst)-range  192.168.1.1-192.168.1.110  這樣。但是對於不連續IP沒有很好的支援,所以選擇擴充套件模組ipset,

使用ipset需要iptables版本1.4.4以上,使用的時候只編譯對應iptables版本即可,需要的核心模組在使用時使用insmod加入即可。

再說下ipset效能:測試中對於1W一下咯IP使用單個IPSET大約需要4S左右,3W以上之後時間變得很長大概10秒以上增幅!所以如果需要控制的ip中如果存在連續IP最好自己手寫對於這種情況的擴充套件模組。可以參照iprange的寫法。

重要的事情要說三遍:順序很重要X3!