1、防火牆順序規則。
2、IPtables通常包括三個表格(Fliter、NAT、Mangle)filter∶主要跟 Linux 本機有關,是預設的 table 。通常下面有三個鏈(chain)
INPUT∶主要與數據包想要進入我們 Linux 本機有關;
OUTPUT∶主要與 Linux 本機所要送出的數據有關;
FORWARD∶這個與 Linux 本機比較沒有關係,他可以將數據包轉發到後端的電腦中,與 nat 這個 table 相關
NAT:主要用來做源與目的IP或者端口的轉換,與linux本機無關。
PREROUTING∶在進行路由判斷之前所要進行的規則(DNAT/REDIRECT) POSTROUTING∶在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE) OUTPUT∶與發送出去的封包有關
mangle∶這個表格主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鏈。由於這個表格與特殊旗標相關性較高,所以像咱們這種單純的環境當中,較少使用 mangle 這個表格。
3、iptables命令詳解
iptables [-t tables] [-L] [-nv]
-t ∶後面接 table ,例如 nat 或 filter ,若省略此項目,則使用預設的 filter
-L ∶列出目前的 table 的規則
-n ∶不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多!
-v ∶列出更多的資訊,包括通過該規則的封包總位元數、相關的網路介面等
iptables [-t tables] [-FXZ]參數∶
-F ∶清除所有的已訂定的規則;
-X ∶殺掉所有使用者 "自訂" 的 chain (應該說的是 tables )
-Z ∶將所有的 chain 的計數與流量統計都歸零
iptables -P [INPUT,OUTPUT,FORWARD][ACCEPT,DROP](默認操作filter表格)
iptables -t -nat -P[PREROUTING,POSTROUTING,OUTPUT][ACCEPT,DROP]參數∶
-P ∶定義默認策略( Policy )。注意,這個 P 爲大寫啊!
ACCEPT ∶該封包可接受
DROP ∶該封包直接丟棄,不會讓 client 端知道爲何被丟棄。
iptables [-AI 鏈] [-io 網路介面] [-p 協議] [-s 來源IP/掩碼] [-d 目標IP/掩碼] -j [ACCEPT|DROP]
-AI 鏈∶針對某的鏈進行規則的 "插入" 或 "增加"
-A ∶新增加一條規則,該規則增加在原本規則的最後面
-I ∶插入一條規則。如果沒有指定此規則的順序,預設是插入變成第一條規則。例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5 號鏈 ∶有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。
-io :網路介面∶設定數據包進出的介面規範
-i ∶數據包所進入的那網路介面,例如eth0, lo 等介面。需與 INPUT 配合;
-o ∶數據包所傳出的那個網路介面,需與 OUTPUT 鏈配合;
-p :協議∶設定此規則適用於哪種數據包格式主要的數據包格式有∶ tcp, udp, icmp 及 all 。
-s :來源 IP/掩碼∶設定此規則之數據包的來源項目,可指定單純的 IP 或包括掩碼。若規範爲『不許』時,則加上 ! 即可,例如∶
-s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之數據包來源;
-d :目標 IP/掩碼∶同 -s ,只不過這裏指的是目標的 IP 或網域。
-j ∶後面接動作,主要的動作有接受 (ACCEPT)、丟棄 (DROP) 及記錄 (LOG)
[root@linux ~]# iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP
[root@linux ~]# iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
iptables [-AI 鏈] [-io 網路介面] [-p tcp,udp] [-s 來源IP/網域] [--sport 端口範圍]
> [-d 目標IP/網域] [--dport 端口範圍] -j [ACCEPT|DROP]參數∶
--sport 端口範圍∶限制來源的端口號碼,端口號碼可以是連續的,例如 1024:65535
--dport 端口範圍∶限制目標的端口號碼。
iptables -A INPUT -m state --state 狀態參數∶
-m ∶一些 iptables 的模組,主要常見的有∶
state ∶狀態模組
mac ∶網路卡硬體位址 (hardware address)
--state ∶一些數據包的狀態,主要有∶
INVALID ∶無效的數據包,例如資料破損的數據包狀態
ESTABLISHED∶已經連線成功的連線狀態;
NEW ∶想要新建立連線的數據包狀態;
RELATED ∶這個最常用!表示這個數據包是與我們主機發送出去的數據包有關
[email=root@linux]root@linux[/email]
~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@linux ~]# iptables -A INPUT -m state --state INVALID -j DROP
針對區域網路內的 aa:bb:cc:dd:ee:ff 主機開放其連線
[root@linux ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT參數∶
--mac-source ∶就是來源主機的 MAC
5、其餘的一些防***手段。
除了 iptables 這個防火牆軟體之外,其實咱們 Linux kernel 2.6 提供很多核心預設的***抵擋機制喔!由於是核心的網路功能,所以相關的設定資料都是放置在 /proc/sys/net/ipv4/ 這個目錄當中。 至於該目錄下各個檔案的詳細資料,可以參考核心的說明文件∶/usr/src/linux-{version}/networking/ip-sysctl.txt。通常可設定如下:
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; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo "0" > $i
done
6、iptables的NAT功能
NAT 的全名是 Network Address Translation,字面上的意思是『網路位址的轉換』。什麼是 NAT? SNAT? DNAT?
NAT 主機的重點就在於 NAT table 的兩條重要的鏈∶PREROUTING 與 POSTROUTING。 那這兩條鏈有什麼重要的功能呢?重點在於修改 IP 嘛!但是這兩條鏈修改的 IP 是不一樣的! POSTROUTING 在修改來源 IP ,PREROUTING 則在修改目標 IP 。 由於修改的 IP 不一樣,所以就稱爲 來源 NAT (Source NAT, SNAT) 及目標 NAT (Destination NAT, DNAT)。在實際使用中,來源NAT一般用來給局域網機器提供internet上網服務。目標NAT一般用來提供DMZ區提供網際網絡服務(Ftp,http,mail等)。
7、範例。
[root@linux ~]# mkdir -p /usr/local/virus/iptables
[root@linux ~]# cd /usr/local/virus/iptables
[root@linux iptables]# vi iptables.rule
#!/bin/bash
# 請先輸入您的相關參數,不要輸入錯誤了!
EXTIF="eth1" # 這個是可以連上 Public IP 的網路介面
INIF="eth0" # 內部 LAN 的連接介面;若無請填 ""
INNET="192.168.1.0/24" # 內部 LAN 的網域,若沒有內部 LAN 請設定爲 ""
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; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo "0" > $i
done
# 2. 清除規則、設定預設政策及開放 lo 與相關的設定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin; 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 -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
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# 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 22 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport 25 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --sport 53 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --sport 53 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 80 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 -j ACCEPT # HTTPS
# 第二部份,針對後端主機的防火牆設定!##############################
# 1. 先載入一些有用的模組
modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
testmod=`lsmod | grep "${mod} "`
if [ "$testmod" == "" ]; then
modprobe $mod
fi
done
# 2. 清除 NAT table 的規則吧!
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 #這一行在讓 NAT 主機可接受來自內部LAN數據包
echo "1" > /proc/sys/net/ipv4/ip_forward #這一行則是在讓你的 Linux 具有 router 能力
if [ "$INNET" != "" ]; then
for innet in $INNET
do
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
# 這一行最關鍵!就是加入 nat table 封包僞裝。重點在那MASQUERADE !這個設定值 就是『 IP #僞裝成爲封包出去 (-o) 的那塊裝置上的 IP 』!以上面的例子來說,就是 $EXTIF ,也就是 #eth1 啦! 所以封包來源只要來自$innet (也就是內部 LAN 的其他主機) ,只要該封包可透過 #eth1 傳送出去, 那就會自動的修改 IP 的來源表頭成爲 eth1 的 public IP
done
fi
fi
# 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,
# 可能是 MTU 的問題,那你可以將底下這一行給他取消註解來啓動 MTU 限#制範圍
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss
# --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
# 4. 內部服務器的設定∶
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to 192.168.1.210:80
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 倒數第二行將訪問80的數據映射到192.168.1.210.最後一行是將訪問80端口的數據重定向#到8080端口。
[root@linux iptables]# vi iptables.allow
#!/bin/bash
# 底下則填寫你允許進入本機的其他網域或主機啊!
iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT
# 底下則是關於抵擋的檔案設定法!
[root@linux iptables]# vi iptables.deny
#!/bin/bash
# 底下填寫的是『你要抵擋的那個咚咚!』
iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP
[root@linux iptables]# chmod 700 iptables.*
如果你希望一開機就自動執行這個 script 的話,請將這個檔案的完整檔名寫入 /etc/rc.d/rc.local 當中,有點像底下這樣∶
[root@linux ~]# vi /etc/rc.d/rc.local
.....其他省略.....
# 1. Firewall
/usr/local/virus/iptables/iptables.rule
.....其他省略.....
OK。