對于Internet上的系統,不管是什麼情況都要明确一點:網絡是不安全的。是以,雖然建立一個防火牆并不能保證系統100%安全,但卻是絕對必要的。
防火牆定義:
所謂防火牆是工作在網絡或主機的邊緣,對進出的資料包根據定義的規則進行檢查,并做出相應處理的一套元件。
防火牆類型:
根據工作的層次來劃分,常見的防火牆工作在OSI模型的第三層,稱為網絡層防火牆,工作在OSI第七層的稱為應用層防火牆。
網絡層防火牆又稱為包過濾型防火牆,它内置于linux系統的核心,在網絡層或傳輸層對經過的資料包進行篩選,篩選的依據是系統内設定的過濾規則。通過檢查資料流中每個資料包的源位址、目的位址、所有的協定、端口号等因素,來決定是否允許該資料包通過。
應用層防火牆又稱為代理伺服器型防火牆,代理伺服器實際上是運作在防火牆上的一種伺服器程式。伺服器監聽客戶機的請求,當内網的客戶機請求與外網的真實伺服器連接配接時,用戶端首先連接配接代理伺服器,然後再由代理伺服器與外網的真實伺服器連接配接,取得客戶想要的資訊,然後再把資訊傳回給客戶。
防火牆工作模式:

在Linux系統中提供了一個非常優秀的包過濾型防火牆工具—netfilter/iptables。它功能強大、使用靈活、可以對流入和流出的資訊進行細化控制,且可以在一台低配置機器上很好地運作。這裡我們詳細介紹下iptables的規則及其用法。
Netfilter/iptables最早是與2.4核心版本的Linux系統內建的IP資訊包過濾系統。它由Netfilter和iptables兩個元件組成。
Netfilter元件稱為核心空間,它內建在Linux的核心中。主要由資訊包過濾表(tables)組成,而表由若幹個鍊組成,每條鍊中可以由一條或者多條規則組成。總的來說,Netfilter是表的容器,表是鍊的容器,而鍊又是規則的容器。
Netfilter本身并不對資料包進行過濾,而iptables就是在Netfilter之上建立了防火牆功能,iptables就是由一組有序的規則建立起來的,這些規則與包含共同特征的資料包進行比對,根據規則來判定是放行或丢棄。
表(table):主要包含四種表,filter,nat,mangle,raw.
鍊(chain):主要有5種鍊,PREROUTING,INPUT,OUTPUT,FORWORD,POSTROUTING
filter表是iptables預設的表,主要用于資料包的過濾。
它包含的鍊有:
INPUT:處理進入的資料包
FORWORD:處理轉發的資料包
OUTPUT:處理本地生成的資料包
nat表主要用于網絡位址轉換。
它包含的鍊:
PREROUTING:修改即将到來的資料包
OUTPUT:修改在路由之前本地生成的資料包
POSTROUTING:修改即将出去的資料包
mangle表主要用于對指定的包進行修改。
在linux核心2.4.18之後包含了所有的鍊。
獨立于netfilter連接配接跟蹤子系統起作用的規則應用于raw表。
PREROUTING和OUTPUT
具體比對流程如圖:
iptables指令的格式:
iptables [-t 表名] -指令 [鍊名] 比對條件 目标動作
iptables [-t table] command CHAIN [NUM ] match criteria -j TARGET
對鍊(CHAIN)的操作:
-N:建立一條鍊
-X: 删除一條使用者自定義的鍊
-F: 清空一條鍊,預設清空filter中的鍊
-Z:清空計數器,iptables中的每條規則預設有兩個計數器,用于記錄本條規則多比對到的資料包的個數和大小
-P:定義鍊的預設處理政策
-E:重命名一條鍊
對規則的操作:
-A:追加,在鍊的最後追加一條規則
-I:插入,一般使用-I CHAIN num 指插入哪一條
-R:替換某條規則,-R CHAIN num 替換哪一條
-D:删除一條規則,可以指定num來指定删除哪條規則。
檢視規則:
-L:列對外連結中所有的規則
-L還有許多輔助的子指令,可以和它一起使用
-n: 不要對位址和端口做反解,即隻顯示數字位址
-v:顯示詳細資訊,-vv -vvv v表示詳細程度
-x:顯示計數器的精确值
--line-numbers 顯示規則的行号
比對條件:分2種
1、通用比對
-s --src,--source 指定比對的源位址
-d --dst,--destination 指定比對的目标位址
位址的格式:
IP
NETWORK/MASK
位址前加!可以表示取反
-p {icmp| tcp|udp} 指定協定
-i 資料包的流入接口(INPUT,FORWORD,PREROUTING)
-o 資料包的流出接口(OUTPUT,FORWORD,POSTROUTING)
2、擴充比對:擴充比對中又分為隐式擴充和顯示擴充
1),隐式擴充:是對協定的擴充
-p tcp
--sport PORT[-PORT2] 指定源端口
--dport PORT[-PORT2] 指定目标端口
--tcp-flags {SYN,ACK,URG,RST,PSH,FIN}指定要檢查的位(需要跟2個标志位清單,中用空格隔開)
eg:--tcp-fiags SYN,ACK,RST,FIN SYN
第一個清單表示要檢查的位,第二個清單該标志位必須為1
--syn :專門比對第一次握手。
-p udp
--sport 指定源端口
--dport 指定位址端口
-p icmp
--icmp-type 指icmp類型
0:echo-reply 指給予回應
8:echo-request 指請求回應
2),顯式擴充:由netfilter擴充子產品引入的擴充,用于比對條件
-m :指定子產品 (隻引用子產品的名稱),子產品在/lib/iptables下
-m state :用于實作連接配接的狀态檢測
--state
NEW,通信者發送新的請求狀态
ESTABLISHED,建立連接配接的狀态
RELATED相關聯的,指一個完整的連接配接,需要依賴另一個完整的連接配接
INVALID,非法的,無效的連接配接狀态
-m multiport
--source-ports port1,port2.. 指定多個源端口
--destination-ports port1,port2.. 指定多個目标端口
--ports 無論是源還是目标都予以比對
-m limit 用一令牌桶過濾器限定速率(每時間多少個)
--limit 後接速率 (3/second)
--limit-burst num 最大峰值
-m connlimit 限定連接配接并發速率
[!] --connlimit-above num 指定多于num才滿足條件将被拒絕
-m iprange 用于指定連續的位址比對
--src-range ip-ip 源IP的網段
--dst-range ip-ip 目标IP的網段
eg: -m iprange --src-range 172.16.100.1-172.16.100.100
-m mac mac位址的比對
--mac-source XX:XX:XX:XX:XX:XX
隻能用在PREROUTING,INPUT,FORWORD鍊中
-m string 根據一定的模式和一定的政策來比對字元串
--algo bm|kmp 比對算法
--string “pattern” 比對模式
-m recent 動态指定一個ip位址清單,不讓它們比對
--name NAME
--set 把資料包源位址加到指定清單中
--rcheck 同常和--set 一起用
--remove 從清單中釋放
--second 限定時間 和--rcheck/--update一起使用
--hitcount hits
-m time 基于時間的比對
--datestart 開始日期
--datestop 結束日期
--timestart 開始時間
--timestop 結束時間
--weekdays 周幾
目标動作都有哪些:(TARGET)
ACCEPT 接收
DROP 丢棄
REJECT 拒絕(給予拒絕回應)
REDIRECT 端口重定向
LOG 記錄通路日志
SNAT:
源位址轉換
隐藏内部網絡及其主機
使得衆多内網用戶端能夠使用有限IP位址通路網際網路工作在nat表中的POSTROUTING
-j SNAT
--to-source
DNAT:
目标位址轉換,将内部私有的服務公開給外部,工作在nat表中的PREROUTING
-j DNAT
--to-destination
PNAT: 端口轉換,在DNAT中将使用者通路的目标端口映射為内網伺服器上的一個不同端口,實作方法隻需要為--to-destination 的目标端口的主機添加':8080'式的端口即可。
PNAT本身并不是一個TARGET
下面舉幾個示例來具體看下iptables的用法:
例1:用iptables指令寫一條規則,限制主機172.16.9.2對外部網絡不能通路,别人也不可以通路該主機
自己也ping不出去的
在這裡會檢測到别人ping進來的比對的包
例2、從172.16.9.2這台主機出去的已經建立連接配接的資料包都予以放行
例3、在INPUT鍊中插入第一條規則,表示建立立tcp和已經建立tcp連接配接的主機遠端連接配接以及通路172.16.9.2的網頁的都予以放行
例4、從接口eth0請求通路172.16.9.2的主機5分鐘内不超過3次請求的都予以放行,超過3次的都丢棄
例5、在OUTPUT鍊中新增一條規則,表示從172.16.9.2的80端口出去的裡面包含"sex"字元串的資料包予以丢棄
iptables還可以限制很多功能的,可以自己摸索下哦。
下面我們來示範源位址轉換功能:
假設這樣一種場景,假設192.168.10.2是外網的一台WEB伺服器,中間的那台是NAT伺服器,假設有2塊網卡不再同一位址段内,我們在其上面添加iptables規則,可以實作位址轉換的功能,以使172.16.0.2的pc機能夠連接配接通過該伺服器通路到WEB伺服器上來。
1、搭建的環境:172.16.9.0 網段使用虛拟網卡的僅主機功能
192.168.10.0網段使用橋接功能
2、設定:PC機的網關設為192.168.10.1,WEB伺服器的網關設為172.16.9.1,打開中間NAT伺服器的轉發功能,PC機就可以通路web伺服器了。
這時看下http的通路日志,源位址即是pc機的位址:
tail /var/log/httpd/accecc_log
我們在NAT伺服器上添加一條iptables轉換規則:
再去通過192.168.10.2通路該WEB伺服器(規則會自動生效的,不用重新開機服務)
再次打開通路日志,源位址就會改變的哦:
規則裡面就會有通路該伺服器所比對到的包了:
我們還可以通過遠端通路下WEB伺服器看下源位址是否改變了。
再來看下web伺服器登入的效果:
源位址已經改變了~~
這就是我們所說的源位址轉換了,隻需要一條規則即可,很簡單吧。
由于我的電腦性能不好,開了3台虛拟機已經卡的不能工作了,暫時隻給大家提供源位址轉換的操作,目标位址轉換原理和源位址轉換是一樣的,您可以自己動手操作下哦。^_^
補充:
iptables規則在電腦重新開機後就會消失不見的,如果想要永久儲存規則的話,可以使用 service iptables save 指令,規則就會被儲存在/etc/sysconfig/iptables 檔案中了。
再次用到的時候可以用指令直接恢複即可:
iptables-restore < /etc/sysconfig/iptables
儲存時還可以儲存到指定的檔案中:
iptables-save > /PATH/TO/FILE
iptables-restore < /PATH/TO/FILE