iptables詳解

Iptables詳解

目前的Linux防火牆機制主要是以 iptables 爲主的,而 iptables 可以使用指令來下達,也可以透過編寫 shell script 來進行指令的整合編輯。
1
、防火牆順序規則。
2
IPtables通常包括三個表格(FliterNATManglefilter主要跟 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
iptablesNAT功能
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章