一、基本上,依据防火墙管理的范围,我们可以将防火墙区分为网域型与单一主机型的控管。在单一主机型的控管方面,主要的防火墙有封包过滤型的Netfilter与依据服务软件程序作为分析的TCP Wrappers两种。若以区域型的防火墙而言,由于此类防火墙都是当作路由器角色,因此防火墙类型主要则有封包过滤的Netfilter与利用代理服务器(proxy server)进行存取代理的方式了。
<1>、TCP Wrappers:
由于主要是透過分析服務器程序來管控,因此與啟動的端口無關,只與程序的名稱有關,舉例來說,我們知道FTP可以啟動在非正規的port21進行臨聽,當你透過Linux內建的TCP wrappers限制FTP時,那麼你只要知道FTP的軟件名稱(vsftpd),然后對他作限制,則不管FTP啟動在哪個端口,都會被該規則管理。
TCP Wrappers:就是透過/etc/hosts.allow,/etc/hosts.deny這兩個文件來管理的一個類似防火墻的機制,但不是所有的軟件都可以通過這兩個檔案來進行處理,只有滿足以下條件之一的才可以,兩個條件分別是:
(1)由super daemon(xinetd)所管理的服務
===>yum install xinetd
===>chkconfig xinetd on
===>chkconfig --list
(2)有支援libwrap.so模塊的服務
===>ldd $(which rsyslogd sshd xinetd httpd)
===>for name in rsyslogd sshd xinetd httpd
do
echo $name
ldd $(which $name) | grep libwrap
done
<2>、iptables
iptables的表格(table)與鏈(chain)
預設的情況下,咱們linux的iptables至少就有三個表格,包括管理本機進出的filter,管理后端主機(防火墻內部的其它計算機)的nat,管理特殊旗標使用的mangle。
(1)filter(過濾器):主要跟進入linux本機的封包有關,這個是預設的table。
INPUT:主要與想要進入我們linux本機的封包有關;
OUTPUT:主要與我們linux本機所要送出的封包有關;
FORWARD:與linux本機比較沒有關系,他可以轉遞封包到后端的計算機中,與nat table相關性較高。
(2)nat:這個表格主要在進行來源與目的ip或port的轉換,與linux本機較無關,主要與linux主機后的局域網絡內計算機較有相關。
PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)
POSTROUTING:在進行路由判斷之后所要進行的規則(SNAT/MASQUERADE)
OUTPUT:與發關出去的封包有關
<3>iptables的語法
CentOS默認的iptables分析:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD(policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT(policy ACCEPT)
target prot opt source destination
(1)只要是封包狀態為RELATED,ESTABLISHED就予以接受
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
(2)只要封包協議是icmp類型的,就予以放行
-A INPUT -p icmp -j ACCEPT
(3)無論任何來源(0.0.0.0/0)且要去任何目標的封包,不論任何封包格式(prot為all),通通都接受
-A INPUT -i lo -j ACCEPT
(4)只要是傳給port22的主動式聯機tcp封包就接受
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
(5)全部的封包信息通通拒絕
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-witch icmp-host-prohibited
<4>、如何清空防火墻的規則
iptables [-t tables] [-FXZ]
選項與參數:
-F:清除所有的已訂定的規則
-X:殺掉所有使用者“自定義”的chain,具體是指tables
-Z:將所有chain的計數與流量統計都歸零
iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
<5>封包的基礎比對
(1)IP,網域及接口裝置
iptables [-AI 鏈名] [-io 網絡接口] [-p 協議] [-s來源IP/網域] [-d目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]
-A:新增加一條規則,該規則增加在原本規則的最后面。
-I:插入一條規則,如果沒有指定此規則的順序,默認是插入變成第一條規則。
-io:網絡接口 -i封包所進入的那個網絡接口,例如eth0,lo等接口,需與INPUT鏈配合。
-p:協定,設定此規則適用于哪種封包格式,主要的封包格式有:tcp,udp,icmp,all
-s與-d:ip:192.168.0.100,網域:192.168.0.0/24,192.168.0.0/255.255.255.0
若規范為不許時,則加上!即可,例如-s ! 192.168.100.0/24表示不許192.168.100.0/24之封包來源
例子:設定lo成為受信任的裝置,亦即進出lo的封包都予以接受
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP
(2)TCP、UDP的規則比對:針對端口設定
iptables [-AI鏈] [-io網絡接口] [-p tcp,udp] [-s來源IP/網域] [--sport端口范圍] [-d目標IP/綱域] [--dport端口范圍] -j [ACCEPT|DROP|REJECT]
例子:iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport ssh -j DROP
將來自任何地主來源port 1:1023的主動聯機到本機端的1:1023聯機丟棄
iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP
(3)iptables外掛模塊:mac與state
iptables -A INPUT [-m state] [--state 狀態]
選項與參數
-m:一些iptables的外掛模塊,常見的有
state:狀態模塊
mac:網絡卡硬件地址
--state:一些封包的狀態,主要有:
INVALID:無效的封包,例如數據破損的封包狀態
ESTABLISHED:已經聯機成功的聯機狀態
NEW:想要新建立聯機的封包狀態
RELATED:這個最常用!表示這個封包是與我們主機發送出去的封包有關
例:只要已建立或相關封包就予以通過,只要是不合法封包就丟棄
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
針對局域肉絡內的aa:bb:cc:dd:ee:ff主機開放其聯機
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
(4)icmp封包規則的比對:針對是否響應ping來設計(拿掉ICMP type 8)
iptables -A INPUT [-p icmp] [--icmp-type 類型] -j ACCEPT
選項與參數:
--icmp-type:后面必須要接icmp的封包類型,也可以使用代號
例:#!/bin/bash
icmp_type="0 3 4 11 12 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done
<6>IPV4的核心管理功能:/proc/sys/net/ipv4/*
(1)/proc/sys/net/ipv4/tcp_syncookies
預防阻斷式服務(DoS)攻擊法當中的一種方式,可以啟用核心的SYN Cookie模塊,這個SYN Cookie模式可以在系統用來啟動隨機聯機的端口(1024:65535)即將用完時自動啟動。透過此一機制可以大大的降低無效的SYN等待端口,而避免SYN Flooding的DoS攻擊,如何啟動此模塊呢?如下:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
不過總的來說,這個設定值還是不錯的,只是不適合用在負載已經很高的服務器內,因為負載太高的主機有時會讓核心誤判受到SYN Flooding的攻擊。
(2)/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
用于阻斷ping flooding,那如何避免呢,取消icmp類型8的icmp封包回應就是了,我們可以透過防火墻來抵檔,這也是比較建義的方式,當然也可以讓核心自動取消ping的響應,不過你必須了解,某些局域網絡內常見的服務會使用ping的方式來偵測是否有重復的ip,所以你最好不要取消所有的ping響應比較好。
核心取消ping回應的設定值有兩個,分別是/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts,僅有ping broadcasts地址時才取消ping的回應,/proc/sys/net/ipv4/icmp_echo_ignore_all,全部的ping都不回應。因此只設定取消icmp_echo_ignore_broadcasts就好了。
(3)/proc/sys/net/ipv4/conf/網絡接口/*
核心還可以針對不同的網絡接口進行不一樣的參數設定,網絡接口的相關設定放置在/proc/sys/net/ipv4/conf當中,每個接口都以接口代號做為其代表,例如eth0接口的相關設定數據在/proc/sys/net/ipv4/conf/eth0內,那麼網絡接口的設定數據有哪些比較需要注意的呢?
rp_filter===>稱為逆向路徑過濾,可以藉由分析網絡接口的路由信息配全封包的來源地址,來分析該封包是否為合理。
log_martians===>這個設定數據可以用來啟動記錄不合法的ip來源,舉例來說,包括來源為0.0.0.0、127.x.x.x及class E的ip來源,因為這些來源的ip不應該應用于internet。
accept_source_route===>或許某些路由器會啟動這個設定值,不過目前的設備很少使用到這種來源路由,因此你可以取消這個設定值。建意關閉
accept_redirects、send_redirects===>這兩個設定值是為了方便在同一個實體網段內有2個或2個以上ip網域時,它們之間傳遞數據時不經過路由器而是直接傳遞。建意關閉
<7>NAT表
若內部LAN有任何一部主機想要傳送封包出去時,那麼這個封包要如何透過linux主機而傳送出去,過程是這樣的:
1==>先經過NAT table的PREROUTING鏈
2==>經由路由判斷確定這個封包是要進入本機與否,若不進入本機,則下一步
3==>再經過Filter table的FORWARD鏈
4==>通過NAT table的POSTROUTING鏈,最后傳送出去。
SNAT主要是應付內部LAN連接到Internet的使用方式,至于DNAT則主要用在內部主機想要架設可以讓Internet存取的服務器。
(1)最簡單的ip分享功能
在NAT服務器的設定方面,最容易出錯的地方就是路由了,特別是在拔號產生ppp0這個對外接口的環境下,這個問題最嚴重,如果你的public IP取得的方式是拔接或cable modem時,你的配置文件/etc/sysconfig/network,ifcfg-eth0,ifcfg-eth1等檔案,千萬不要設定GATEWAY,否則就會出現兩個default gateway。
(2)事實上,除了ip偽裝(MASQUERADE)之外,我們還可以直接指定修改IP封包表頭的來源IP呢!
假設對外的ip固定為192.168.1.100,若不想使用偽裝,該如何處理
-->iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.100
(3)若果對個的publicIP有很多個
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.100-192.168.1.105
(4)假設內網有部主機ip為192.168.100.10,該主機是可對Internet開放的www服務器,你該如何透過NAT機制,將www封包傳到該主機上。
iptables -t nat -A PREROUTING -i eth0-p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80
(5)端口轉換
-j REDIRECT --to-ports<port number>
這個也挺常見的,基本上,就是進行本機上面port的轉換就是了!
不過,特別留意的是,這個動作僅能夠在nat table的PREROUTING以及OUTPUT鏈上面實行而已。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
<8>iptables實例
#!/bin/bash
EXTIF="eth0"
INIF="eth1"
INNET="192.168.100.0/24"
export EXTIF INIF INNET
#第一部分,針對本機的防火墻設定
#1、先設定好核心的網絡功能
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians};
do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects, send_redirects}
do
echo "0" > $i
done
#2.清除規則,設定默認政策及開放lo與相關的設定值
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#3.啟動額外的防火墻script模塊
if [ -f /usr/local/virus/iptables/iptables.deny ]; then
sh /usr/local/virus/iptables/iptables.deny
fi
if [-f /usr/local/virus/iptables/iptables.allow ]; then
sh /usr/local/virus/iptables/iptables.allow
fi
if [-f /usr/local/virus/httpd-err/iptables.http ]; then
sh /usr/local/virus/httpd-err/iptables.http
fi
#4.允計某些類型的ICMP封包進入
AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done
#5.允許某些服務的進入
iptables -A INPUT -p tcp -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT #FTP
iptables -A INPUT -p tcp -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT #SSH
iptables -A INPUT -p tcp -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT #SMTP
iptables -A INPUT -p udp -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT #DNS
iptables -A INPUT -p tcp -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT #DNS
iptables -A INPUT -p tcp -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT #WWW
iptables -A INPUT -p tcp -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT #POP3
iptables -A INPUT -p tcp -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT #HTTPS
#第二部分 針對后端主機的防火墻設定
#1、先加載一些有用的模塊
modules="ip_tables iptables_nat ip_nat_fty ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
testmod=`lsmod | grep "^${mod}" | awk '{print $1}'`
if [ "$testmod" == "" ]; then
modprobe $mod
done
#2.清除NATtable的規則
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
#3.若有內部接口的存在(雙網卡)開放成為路由器,且為ip分享器
if [ "$INIF" != " " ]; then
iptables -A INPUT -i $INIF -j ACCEPT
echo "1" > /proc/sys/net/ipv4/ip_forward
if [ "$INNET" != " " ]; then
for innet in $INNET
do #其中MASQUERADE為ppp0這個情況下,publicIP不固定的情況
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
done
fi
fi
#4、NAT服務器后端的LAN內對外之服務器設定
iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to-destination 192.168.1.210:80
#5、特殊的功能,包括Windows遠程桌面所產生的規則,假設桌面主機為1.2.3.4
iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000 -j DNAT --to-destination 192.168.100.10
iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389 -j DNAT --to-destination 192.168.100.20
#6、最終將這些功能儲存下來
/etc/init.d/iptables save