linux透明防火牆(網橋模式)

一、網絡結構
 在現有網絡中增加防火牆,主要作用爲控制內部上網等等。要求可以靈活控制,包括時間段不同控制,流量限制等。
 現有網絡拓撲圖:
 
 由於安裝防火牆時要求不需要修改內網服務器和PC機配置,所以採用透明防火牆(網橋模式)。
 修改後拓撲圖:
 防火牆需要三塊網卡,其中兩塊網卡做網橋,一塊網卡配置ip做爲管理用網卡。內部網絡要訪問不同網段,數據包需要路由轉換,這時就要通過防火牆才能到達路由。防火牆採用linux系統,使用iptables和ebtables進行過濾數據包。經過測試交換機劃分vlan在路由器終結數據包,這樣的數據包可以在iptables和ebtables中進行分析處理。網橋在網絡的第二層,iptables和ebtables在linux 2.6內核中可以分析到第二層的數據包。
二、防火牆工具分析
 1)iptables說明
Iptables對數據包的處理流程:數據包進入系統,經過IP校驗後經過PREROUTING鏈中的Mangle和Nat的處理;再經過路由查找,決定該數據包需要轉發還是發給本機;如果該數據包是發給本機的,則經過INPUT鏈的Mangle和Filter處理後再傳遞給上層協議;如果需要轉發,則發給FORWARD鏈的Mangle和Filter進行處理;本機網絡層以上各層產生的數據包通過OUTPUT鏈的Mangle、Nat、Filter處理後,再進行路由選擇;所有需要發送到網絡中的數據包,都必須經過POSTROUTING鏈的Mangle和Nat進行處理。
 2)ebtalbles說明
Ebtables對數據幀的處理過程:數據幀進入數據鏈路層,首先經過BROURING鏈的Broute處理,決定是直接路由該數據幀還是讓它進入到PREROUTING鏈,如果數據幀的目的地址和源地址在同一個網段,網橋會屏蔽它;如果數據幀是多播幀或廣播幀,則要在同一網段中除了接收端口以外的其他端口發送這個數據幀。接下來,數據幀到達PREROUTING鏈後可以改變目的MAC地址(DNAT);當數據幀通過PREROUTING鏈後,Ebtables將會根據該數據幀的目的MAC地址決定是否轉發該幀,如果這個幀的目的MAC是本機的,就會進入到INPUT鏈,在這個鏈中,可以過濾進入本機的數據幀,通過INPUT鏈後,就到達網絡層,數據幀變成數據包;如果數據幀的目的MAC不是本機的,它進入FORWARD鏈,FORWARD鏈將過濾數據幀;然後這個數據幀就會到達POSTROUTING鏈,在這裏可以改變數據幀的源MAC地址(SNAT)。由本機產生的幀,首先判斷是否需要Bridging,如果不需要則進行直接路由;如果需要就會進入到OUTPUT鏈中,以對數據幀改變目的MAC地址(DNAT)和過濾,接下來這個幀到達POSTROUTING鏈,這個鏈可以改變數據幀的源MAC地址(SNAT);最後,這個幀就到達了NIC。
 3)橋接方式的處理流程
當數據幀進入Linux網橋後,先通過Ebtables的BROUTING鏈和PREROUTING鏈;接下來,經過Iptables的PREROUTING鏈,這時還是在數據鏈路層,而不是在Iptables通常起作用的網絡層,這就是br_nf幫助數據幀在數據鏈路層可以經過Iptables鏈的作用;然後,經過Ebtables的FORWARD鏈和Iptables的FORWARD鏈;最後,先後經過Ebtables和Iptables的POSTROUTING鏈。
 4)總結
從前面的敘述,可以看到無論橋接還是路由方式,數據幀都會經過Iptables的FORWARD鏈,這樣就可以利用Iptables/Ebtables設計一個網橋防火牆。
Linux2.6中的Ebtables/ Iptables是一個非常強大的防火牆系統,可以同時在數據鏈路層和網絡層對數據幀或數據包進行過濾、地址轉換、數據包傳輸特性的改變。利用Ebtables/ Iptables可以構建一個網橋路由器,尤其重要的是它還可以連接不同協議的網絡,實現過濾等功能。因此,利用Ebtables/Iptables可以構建一種簡單宜用、功能強大、經濟高效的網橋防火牆。
由於iptables功能比ebtables更強大,應用也較爲廣泛,所以一般都使用iptables來做防火牆。
三、系統安裝
 centos linux 5.0是使用linux 2.6內核的操作系統。
 1)系統安裝
1.輸入linux text選擇text安裝模式。
2.安裝時語言環境選English。
3.鍵盤類型選us。
4.鼠標選擇No-mouse。
5.安裝類型選Custom。
6.分區設置:
  /boot ext3  100M   啓動分區
  /  ext3  10G    系統分區
  Swap swap 1G    虛擬內存
  /var  ext3  剩餘空間  日誌分區
7.使用GRUB Boot loader。
8.不增加參數在Boot Loader Configuration。
9.不爲Boot Loader設置密碼。
10.設置Boot Loader啓動Linux。
11.將Boot Loader安裝在硬盤的MBR。
12.網絡設置,默認安裝後進行配置。
13.主機名稱視情況而定,預定爲UC-WEB-數字。
14.防火牆的安全級別設爲No firewall。
15.語言支持選English (USA) 和Chinese (P.R. of China)。
16.默認語言爲English (USA)。
17.時區選Asia/Shanghai。
18.Root Password爲:redhat
19.Authentication Configuration啓用Use Shadow Passwords和Enable MD5 Passwords。
20.Package Group選擇:
      @ Editors
21.不必創建Boot Diskette。
22.配置顯示選項,指定啓動時進入文本模式。
OS安裝完畢。
2)系統配置
1.禁用多於服務
rm /etc/rc.d/rc3.d/* -rf
chkconfig crond on
chkconfig network on
chkconfig rsync on
chkconfig sshd on
chkconfig syslog on
chkconfig xinetd on
chkconfig iptables on
2.定時同步時間
crontab -e
加入
10 03 * * * /usr/sbin/ntpdate -u tick.ucla.edu tock.gpsclock.com ntp.nasa.gov timekeeper.isi.edu usno.pa-x.dec.com
3.關閉ipv6
echo "alias net-pf-10 off" >> /etc/modprobe.conf.dist
4.修改默認啓動內核
vi /boot/grub/gurb.conf
   修改默認啓動內核爲2.6內核,不要使用加有xen(虛擬技術)的內核。
四、防火牆的實現
1)配置網卡
1.網橋配置
brctl add br0
建立網橋
touch /etc/sysconfig/network-scripts/ifcfg-br0
建立網橋配置文件ifcfg-br0
vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=0.0.0.0
ONBOOT=yes
2.添加網卡到網橋
把eth1和eth2兩網卡添加到網橋中。eth0一般爲主板集成網卡性能不好,所以用作管理網卡
初始化網卡
ifconfig  eth1 0.0.0.0 up
ifconfig  eth1 0.0.0.0 up
添加網卡到網橋
brctl addif  br0 eth0 eth1
查看網橋信息
brctl show
修改eth1網卡配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth1
           DEVICE=eth1
           TYPE=Ethernet
           BOOTPROTO=static
IPADDR=0.0.0.0
           ONBOOT=yes
           BRIDGE=br0
修改eth2網卡配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth2
           DEVICE=eth2
           TYPE=Ethernet
           BOOTPROTO=static
IPADDR=0.0.0.0
           ONBOOT=yes
           BRIDGE=br0
3.配置管理網卡
修改eth0網卡配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth0
           DEVICE=eth0
           TYPE=Ethernet
           BOOTPROTO=static
IPADDR=10.0.254.252
NETMASK=255.255.252.0
GATEWAY=10.0.254.254
           ONBOOT=yes
           BRIDGE=br0
2)防火牆配置
實施防火牆策略的一般過程是先禁止所有的轉發數據幀或數據包通過,然後再根據需要設定數據幀或數據包的過濾規則。
1. 禁止所有
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
清除iptables中全部規則
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
修改默認策略
2. 允許訪問規則
iptables -A FORWARD -p icmp -m limit –limit 4/s -j ACCEPT
允許icmp
Iptables -A FORWARD -d 10.0.254.0/255.255.255.0 –j ACCEPT
允許任何地址訪問254網段
Iptables -A FORWARD -s 10.0.2.36 –j ACCEPT
允許10.0.2.36訪問任何地址
3.定時修改
將訪問列表寫在一個shell腳本中,在crontab –e中定時執行腳本。
附Ebtables使用規則如下:
ebtables [-t table] -[ADI] chain rule-specification [match-extensions] [watcher-extensions]
-t table :一般爲FORWARD鏈。
-ADI:A添加到現有鏈的末尾;D刪除規則鏈(必須指明規則鏈號);I插入新的規則鏈(必須指明規則鏈號)。
-P:規則表的默認規則的設置。可以DROP,ACCEPT,RETURN。
-F:對所有的規則表的規則鏈清空。
-L:指明規則表。可加參數,–Lc,–Ln
-p:指明使用的協議類型,ipv4,arp等可選(使用時必選)詳情見/etc/ethertypes
–ip-proto:IP包的類型,1爲ICMP包,6爲TCP包,17爲UDP包,在/etc/protocols下有詳細說明
–ip-src:IP包的源地址
–ip-dst:IP包的目的地址
–ip-sport:IP包的源端口
–ip-dport:IP包的目的端口
-i:指明從那片網卡進入
-o:指明從那片網卡出去
簡單配置規則如下:
#!/bin/bash
echo "The ebtables start !"
ebtables -P FORWARD ACCEPT 
ebtables -P INPUT ACCEPT
ebtables -P OUTPUT ACCEPT
ebtables -F 
ebtables -A FORWARD -p ipv4 -i eth0/eth1 –ip-proto (6/17) –ip-dst(目的IP)  –ip-dport(目的端口) -j DROP
ebtables -A FPRWARD -p ipv4 -i eth0/eth1 –ip-proto (7/17) –ip-src(源IP) –ip-sport(源端口) -j
DROP
 
附iptables 基本命令使用舉例
一、鏈的基本操作
1、清除所有的規則。
1)清除預設表filter中所有規則鏈中的規則。
# iptables -F
2)清除預設表filter中使用者自定鏈中的規則。
#iptables -X
#iptables -Z
2、設置鏈的默認策略。一般有兩種方法。
1)首先允許所有的包,然後再禁止有危險的包通過放火牆。
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT
2)首先禁止所有的包,然後根據需要的服務允許特定的包通過防火牆。
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
3、列出表/鏈中的所有規則。默認只列出filter表。
#iptables -L
4、向鏈中添加規則。下面的語句用於開放網絡接口:
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -i eth0 -j ACEPT
#iptables -A OUTPUT -o eth1 -j ACCEPT
#iptables -A FORWARD -i eth1 -j ACCEPT
#iptables -A FORWARD -0 eth1 -j ACCEPT
注意:由於本地進程不會經過FORWARD鏈,因此迴環接口lo只在INPUT和OUTPUT兩個鏈上作用。
5、使用者自定義鏈。
#iptables -N custom
#iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP
#iptables -A INPUT -s 0/0 -d 0/0 -j DROP
二、設置基本的規則匹配
1、指定協議匹配。
1)匹配指定協議。
#iptables -A INPUT -p tcp
2)匹配指定協議之外的所有協議。
#iptables -A INPUT -p !tcp
2、指定地址匹配。
1)指定匹配的主機。

#iptables -A INPUT -s 192.168.0.18
2)指定匹配的網絡。
#iptables -A INPUT -s 192.168.2.0/24
3)匹配指定主機之外的地址。
#iptables -A FORWARD -s !192.168.0.19
4)匹配指定網絡之外的網絡。
#iptables -A FORWARD -s ! 192.168.3.0/24
3、指定網絡接口匹配。
1)指定單一的網絡接口匹配。

#iptables -A INPUT -i eth0
#iptables -A FORWARD -o eth0
2)指定同類型的網絡接口匹配。
#iptables -A FORWARD -o ppp+
4、指定端口匹配。
1)指定單一端口匹配。

#iptables -A INPUT -p tcp –sport www
#iptables -A INPUT -p udp –dport 53
2)匹配指定端口之外的端口。
#iptables -A INPUT -p tcp –dport !22
3)匹配端口範圍。
#iptables -A INPUT -p tcp –sport 22:80
4)匹配ICMP端口和ICMP類型。
#iptables -A INOUT -p icmp –icimp-type 8
5)指定ip碎片。
每個網絡接口都有一個MTU(最大傳輸單元),這個參數定義了可以通過的數據包的最大尺寸。如果一個數據包大於這個參數值時,系統會將其劃分成更小的數據包(稱爲ip碎片)來傳輸,而接受方則對這些ip碎片再進行重組以還原整個包。這樣會導致一個問題:當系統將大數據包劃分成ip碎片傳輸時,第一個碎片含有完整的包頭信息(IP+TCP、UDP和ICMP),但是後續的碎片只有包頭的部分信息(如源地址、目的地址)。因此,檢查後面的ip碎片的頭部(象有TCP、UDP和ICMP一樣)是不可能的。假如有這樣的一條規則:
#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT
並且這時的FORWARD的policy爲DROP時,系統只會讓第一個ip碎片通過,而餘下的碎片因爲包頭信息不完整而無法通過。可以通過—fragment/-f 選項來指定第二個及以後的ip碎片解決上述問題。
#iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
注意現在有許多進行ip碎片***的實例,如DoS***,因此允許ip碎片通過是有安全隱患的,對於這一點可以採用iptables的匹配擴展來進行限制。
三、設置擴展的規則匹配(舉例已忽略目標動作)
1、多端口匹配。
1)匹配多個源端口。
#iptables -A INPUT -p tcp -m multiport –sport 22,53,80,110
2)匹配多個目的端口。
#iptables -A INPUT -p tcp -m multiport –dpoort 22,53,80
3)匹配多端口(無論是源端口還是目的端口)
#iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
2、指定TCP匹配擴展
使用 –tcp-flags 選項可以根據tcp包的標誌位進行過濾。
#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN
#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK
上實例中第一個表示SYN、ACK、FIN的標誌都檢查,但是隻有SYN匹配。第二個表示ALL(SYN,ACK,FIN,RST,URG,PSH)的標誌都檢查,但是隻有設置了SYN和ACK的匹配。
#iptables -A FORWARD -p tcp –syn
選項—syn相當於”–tcp-flags SYN,RST,ACK SYN”的簡寫。
3、limit速率匹配擴展。
1)指定單位時間內允許通過的數據包個數,單位時間可以是/second、/minute、/hour、/day或使用第一個子母。
#iptables -A INPUT -m limit –limit 300/hour
2 )指定觸發事件的閥值。
#iptables -A INPUT -m limit –limit-burst 10
用來比對一次同時涌入的封包是否超過10個,超過此上限的包將直接丟棄。
3)同時指定速率限制和觸發閥值。
#iptables -A INPUT -p icmp -m limit –-limit 3/m –limit-burst 3
表示每分鐘允許的最大包數量爲限制速率(本例爲3)加上當前的觸發閥值burst數。任何情況下,都可保證3個數據包通過,觸發閥值burst相當於允許額外的包數量。
4)基於狀態的匹配擴展(連接跟蹤)
每個網絡連接包括以下信息:源地址、目標地址、源端口、目的端口,稱爲套接字對(socket pairs);協議類型、連接狀態(TCP協議)和超時時間等。防火牆把這些信息稱爲狀態(stateful)。狀態包過濾防火牆能在內存中維護一個跟蹤狀態的表,比簡單包過濾防火牆具有更大的安全性,命令格式如下:
iptables -m state –-state [!]state [,state,state,state]
其中,state表是一個逗號分割的列表,用來指定連接狀態,4種:
>NEW: 該包想要開始一個新的連接(重新連接或連接重定向)
>RELATED:該包是屬於某個已經建立的連接所建立的新連接。舉例:
FTP的數據傳輸連接和控制連接之間就是RELATED關係。
>ESTABLISHED:該包屬於某個已經建立的連接。
>INVALID:該包不匹配於任何連接,通常這些包被DROP。
例如:
(1)在INPUT鏈添加一條規則,匹配已經建立的連接或由已經建立的連接所建立的新連接。即匹配所有的TCP迴應包。
#iptables -A INPUT -m state –state RELATED,ESTABLISHED
(2)在INPUT鏈鏈添加一條規則,匹配所有從非eth0接口來的連接請求包。
#iptables -A INPUT -m state -–state NEW -i !eth0
又如,對於ftp連接可以使用下面的連接跟蹤:
(1)被動(Passive)ftp連接模式。
#iptables -A INPUT -p tcp –sport 1024: –dport 1024: -m state –-state ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -p tcp –sport 1024: –dport 1024: -m
state -–state ESTABLISHED,RELATED -j ACCEPT
(2)主動(Active)ftp連接模式
#iptables -A INNPUT -p tcp –sport 20 -m state –-state ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -p tcp –OUTPUT -p tcp –dport 20 -m state –state ESTABLISHED -j ACCEPT
5)TOS匹配擴展。
四、設置目標擴展

目標擴展由內核模塊組成,而且iptables的一個可選擴展提供了新的命令行選項。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章