表 (table)
包含4個(gè)表:
4個(gè)表的優(yōu)先級(jí)由高到低:raw-->mangle-->nat-->filter
raw---RAW表只使用在PREROUTING鏈和OUTPUT鏈上,因?yàn)閮?yōu)先級(jí)最高,從而可以對(duì)收到的數(shù)據(jù)包在連接跟蹤前進(jìn)行處理。一但用戶使用了RAW表,在某個(gè)鏈上,RAW表處理完后,將跳過NAT表和ip_conntrack處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了.
filter---這個(gè)規(guī)則表是預(yù)設(shè)規(guī)則表,擁有 INPUT、FORWARD 和 OUTPUT 三個(gè)規(guī)則鏈,這個(gè)規(guī)則表顧名思義是用來進(jìn)行封包過濾的理動(dòng)作
net----此規(guī)則表擁有prerouting和postrouting兩個(gè)規(guī)則鏈, 主要功能為進(jìn)行一對(duì)一、一對(duì)多、多對(duì)多等網(wǎng)址轉(zhuǎn)譯工作(SNATDNAT)
mangle--此規(guī)則表擁有prerouting、FORWARD、postrouting三個(gè)規(guī)則鏈,除了進(jìn)行網(wǎng)址轉(zhuǎn)譯工作會(huì)改寫封包外,在某些特殊應(yīng)用可能也必須去改寫封包(ITL、TOS)或者是設(shè)定MARK(將封包作記號(hào),以進(jìn)行后續(xù)的過濾)這時(shí)就必須將這些工作定義在mangles規(guī)則表中
常用命令:
-A 追加規(guī)則-->iptables -A INPUT
-D 刪除規(guī)則-->iptables -D INPUT 1(編號(hào))
-R 修改規(guī)則-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代現(xiàn)行規(guī)則,順序不變(1是位置)
-I 插入規(guī)則-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一條規(guī)則,原本位置上的規(guī)則將會(huì)往后移動(dòng)一個(gè)順位
-L 查看規(guī)則-->iptables -L INPUT 列出規(guī)則鏈中的所有規(guī)則
-N 新的規(guī)則-->iptables -N allowed 定義新的規(guī)則
通用參數(shù):
-p 協(xié)議 例:iptables -A INPUT -p tcp
-s源地址 例:iptables -A INPUT -s 192.168.1.1
-d目的地址 例:iptables -A INPUT -d 192.168.12.1
-sport源端口 例:iptables -A INPUT -p tcp --sport 22
-dport目的端口 例:iptables -A INPUT -p tcp --dport 22
-i指定入口網(wǎng)卡 例:iptables -A INPUT -i eth0
-o指定出口網(wǎng)卡 例:iptables -A FORWARD -o eth0
-j 指定要進(jìn)行的處理動(dòng)作
常用的ACTION:
DROP:丟棄
REJECT:明示拒絕
ACCEPT:接受
SNAT基于原地址的轉(zhuǎn)換
source--指定原地址
比如我們現(xiàn)在要將所有192.168.10.0網(wǎng)段的IP在經(jīng)過的時(shí)候全都轉(zhuǎn)換成172.16.100.1這個(gè)假設(shè)出來的外網(wǎng)地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1(外網(wǎng)有效ip)
這樣,只要是來自本地網(wǎng)絡(luò)的試圖通過網(wǎng)卡訪問網(wǎng)絡(luò)的,都會(huì)被統(tǒng)統(tǒng)轉(zhuǎn)換成172.16.100.1這個(gè)IP.
MASQUERADE(動(dòng)態(tài)偽裝)--家用帶寬獲取的外網(wǎng)ip,就是用到了動(dòng)態(tài)偽裝
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
DNAT目標(biāo)地址轉(zhuǎn)換
destination-指定目標(biāo)地址
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
10.18訪問80端口轉(zhuǎn)換到100.2上
MASQUERADE:源地址偽裝
REDIRECT:重定向:主要用于實(shí)現(xiàn)端口重定向
MARK:打防火墻標(biāo)記的
RETURN:返回 在自定義鏈執(zhí)行完畢后使用返回,來返回原規(guī)則鏈。
鏈 (chain)
每個(gè)表都有自己的一組內(nèi)置鏈,可以對(duì)鏈進(jìn)行自定義,這樣就可以建立一組規(guī)則,
filter表中的input、output和forward鏈
匹配(match)
每個(gè)iptables規(guī)則都包含一組匹配以及一個(gè)目標(biāo),iptables匹配指的是數(shù)據(jù)包必須匹配的條件,只有當(dāng)
數(shù)據(jù)包滿足所有的匹配條件時(shí),iptables才能根據(jù)由該規(guī)則的目標(biāo)所指定的動(dòng)作來處理該數(shù)據(jù)包
匹配都在iptable的命令行中指定
source--匹配源ip地址或網(wǎng)絡(luò)
destination (-d)--匹配目標(biāo)ip地址或網(wǎng)絡(luò)
protocol (-p)--匹配ip值
in-interface (-i)--流入接口(例如,eth0)
out-interface (-o)--流出接口
state--匹配一組連接狀態(tài)
string--匹配應(yīng)用層數(shù)據(jù)字節(jié)序列
comment--在內(nèi)核內(nèi)存中為一個(gè)規(guī)則關(guān)聯(lián)多達(dá)256個(gè)字節(jié)的注釋數(shù)據(jù)
目標(biāo)(target)
iptables支持一組目標(biāo),用于數(shù)據(jù)包匹配一條規(guī)則時(shí)觸發(fā)一個(gè)動(dòng)作
ACCEPT--允許數(shù)據(jù)包通過
DROP--丟棄數(shù)據(jù)包,不對(duì)該數(shù)據(jù)包做進(jìn)一步的處理,對(duì)接收棧而言,就好像該數(shù)據(jù)包從來沒有被接收一樣
LOG--將數(shù)據(jù)包信息記錄到syslog
REJECT--丟棄數(shù)據(jù)包,同時(shí)發(fā)送適當(dāng)?shù)捻憫?yīng)報(bào)文(針對(duì)TCP連接的TCP重要數(shù)據(jù)包或針對(duì)UDP數(shù)據(jù)包的ICMP端口不可達(dá)消息)
RETURN--在調(diào)用鏈中繼續(xù)處理數(shù)據(jù)包
vi /etc/sysconfig/iptables 策略文件
vi /etc/sysconfig/iptables-config 配置文件
iptables缺省具有5條規(guī)則鏈
prerouting(內(nèi)到外) forward(轉(zhuǎn)發(fā)) postrouting(外到內(nèi))
input(輸入) output(輸出)
1.鏈管理命令(這都是立即生效的)
-P :設(shè)置默認(rèn)策略的(設(shè)定默認(rèn)門是關(guān)著的還是開著的)
默認(rèn)策略一般只有兩種
iptables -P INPUT (DROP|ACCEPT)
默認(rèn)是關(guān)的/默認(rèn)是開的
比如:
iptables -P INPUT DROP
這就把默認(rèn)規(guī)則給拒絕了。并且沒有定義哪個(gè)動(dòng)作,所以關(guān)于外界連接的所有規(guī)則包括Xshell連接之類的,遠(yuǎn)程連接都被拒絕了
-F: FLASH,清空規(guī)則鏈的(注意每個(gè)鏈的管理權(quán)限)
iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有鏈
-N:NEW 支持用戶新建一個(gè)鏈
iptables -N inbound_tcp_web 表示附在tcp表上用于檢查web的。
-X: 用于刪除用戶自定義的空鏈
使用方法跟-N相同,但是在刪除之前必須要將里面的鏈給清空昂了
-E:用來Rename chain主要是用來給用戶自定義的鏈重命名
-E oldname newname
-Z:清空鏈,及鏈中默認(rèn)規(guī)則的計(jì)數(shù)器的(有兩個(gè)計(jì)數(shù)器,被匹配到多少個(gè)數(shù)據(jù)包,多少個(gè)字節(jié))
iptables -Z :清空
2.規(guī)則管理命令
-A:追加,在當(dāng)前鏈的最后新增一個(gè)規(guī)則
-I num : 插入,把當(dāng)前規(guī)則插入為第幾條。
-I 3 :插入為第三條
-R num:Replays替換/修改第幾條規(guī)則
格式:iptables -R 3 …………
-D num:刪除,明確指定刪除第幾條規(guī)則
3.查看管理命令 “-L”
附加子命令
-n:以數(shù)字的方式顯示ip,它會(huì)將ip直接顯示出來,如果不加-n,則會(huì)將ip反向解析成主機(jī)名。
-v:顯示詳細(xì)信息
-vv
-vvv :越多越詳細(xì)
-x:在計(jì)數(shù)器上顯示精確值,不做單位換算
--line-numbers : 顯示規(guī)則的行號(hào)
-t nat:顯示所有的關(guān)卡的信息
4.:詳解匹配標(biāo)準(zhǔn)
2.擴(kuò)展匹配
2.1隱含擴(kuò)展:對(duì)協(xié)議的擴(kuò)展
-p tcp :TCP協(xié)議的擴(kuò)展。一般有三種擴(kuò)展
--dport XX-XX:指定目標(biāo)端口,不能指定多個(gè)非連續(xù)端口,只能指定單個(gè)端口,比如
--dport 21 或者 --dport 21-23 (此時(shí)表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的標(biāo)志位(SYN,ACK,F(xiàn)IN,PSH,RST,URG)
對(duì)于它,一般要跟兩個(gè)參數(shù):
1.檢查的標(biāo)志位
2.必須為1的標(biāo)志位
--tcpflags syn,ack,fin,rst syn = --syn
表示檢查這4個(gè)位,這4個(gè)位中syn必須為1,其他的必須為0。所以這個(gè)意思就是用于檢測三次握手的第一次包的。對(duì)于這種專門匹配第一包的SYN為1的包,還有一種簡寫方式,叫做--syn
-p udp:UDP協(xié)議的擴(kuò)展
--dport
--sport
-p icmp:icmp數(shù)據(jù)報(bào)文的擴(kuò)展
--icmp-type:
echo-request(請(qǐng)求回顯),一般用8 來表示
所以 --icmp-type 8 匹配請(qǐng)求回顯數(shù)據(jù)包
echo-reply (響應(yīng)的數(shù)據(jù)包)一般用0來表示
2.2顯式擴(kuò)展(-m)
擴(kuò)展各種模塊
-m multiport:表示啟用多端口擴(kuò)展
之后我們就可以啟用比如 --dports 21,23,80
策略需求:
域名系統(tǒng)(DNS)查詢
文件傳輸協(xié)議(FTP)傳輸
網(wǎng)絡(luò)時(shí)間協(xié)議(NTP)查詢
安全Shell(SSH)會(huì)話
簡單郵件傳輸協(xié)議(SMTP)會(huì)話
通過HTTP/HTTPS進(jìn)行web會(huì)話
whois查詢
外網(wǎng)掃描------- (192.168.10.1(eth1)) (192.168.10.0/24)-------局域網(wǎng)客戶機(jī)(10.50)
外網(wǎng)web--------因特網(wǎng)----------iptables防火墻----------局域網(wǎng)---------------內(nèi)網(wǎng)掃描者(10.200)
外網(wǎng)dns-------- (主機(jī)名:iptables) ----------------web服務(wù)器(20.3)
(71.157.X.X(eth0)) ----------------dns服務(wù)器(10.4)
腳本:
iptables.sh
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe
INT_NET=192.168.10.0/24
####flush existing rules and set chain policy setting to drop(重置現(xiàn)有規(guī)則和鏈策略設(shè)置)
echo "[+] Flushing existing iptables rules..."
$IPTABLES -F-----------------------------(清空規(guī)則鏈)
$IPTABLES -F -t nat----------------------(清空nat表)
$IPTABLES -X-----------------------------(刪除用戶的空鏈)
$IPTABLES -p INPUT DROP------------------(關(guān)閉input端口)
$IPTABLES -p OUTPUT DROP-----------------(關(guān)閉output端口)
$IPTABLES -p FORWARD DROP----------------(關(guān)閉forward端口)
###load connection-tracking modules------(負(fù)載連接模塊)
$MODPROBE ip_conntrack-------------------(加載ip_conntrack模塊)
$MODPROBE iptables_nat-------------------(加載iptables_nat模塊)
$MODPROBE ip_conntrack_ftp---------------(加載ip_conntrack_ftp模塊)
$MODPROBE ip_nat_ftp---------------------(加載ip_nat_ftp模塊)
INPUT鏈
INPUT鏈作為iptables的構(gòu)建快,作用是控制目標(biāo)為本地系統(tǒng)的數(shù)據(jù)包是否可以和本地套接字通信,如果INPUT鏈中的第一條規(guī)則要求IPtables丟棄所以得數(shù)據(jù)包(或者INPUT鏈的策略設(shè)置為DROP),那么所有試圖通過任何ip通信方式(如TCP、UDP或ICMP)與系統(tǒng)直接通信的努力都將失敗。ARP工作在數(shù)據(jù)鏈路層而不是網(wǎng)絡(luò)層,而iptables只過濾ip及其之上協(xié)議的數(shù)據(jù)包,所以iptables不能過濾arp協(xié)議的報(bào)文。
####INPUT chain ########
echo "[+] Setting up INPUT chain ..."
####state tracking rules####
$IPTABLES -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-OPTIONS --log-tcp-options
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##anti-spoofing rules
$IPTABLES -A INPUT -i eth1 -s ! $INI_NET -j LOG --log-prefix "SPOOFED PKT"
$IPTABLES -A INPUT -i eth1 -s ! $INT_NET -j DROP
##ACCEPT rules
$IPTABLES -A INPUT -i eth1 -p tcp -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
##default INPUT LOG rule
$IPTABLES -A INPUT -i ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options
建立OUTPUT鏈規(guī)則集的命令如下所示:
#####OUTPUT chain ####
echo "[+] setting up OUTPUT chain..."
###state tracking rules
$IPTABLES -A OUTPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-options --log-tcp-options
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
###ACCEPT RULES rules for allowing connections out-interface
$IPTABLES -A OUTPUT -p tcp --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 53 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
#### default OUTPUT LOG RULES
$IPTABLES -A OUTPUT -o ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options
FORWARD 鏈
filter表中的forward鏈提供了對(duì)通過防火墻接口轉(zhuǎn)發(fā)數(shù)據(jù)包進(jìn)行訪問控制的能力:
###FORWARD chain####
echo "[+]Setting up FORWARD chain..."
###state tracking rules
$IPTABLES -A FORWARD -m state --state INVALID -j LOG --log-prefix "DROP INVALID" -- log-ip-options --log-tcp-options
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
###anti-spoofing rules
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j LOG --log-prefix "SPOOFED PKT"
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j DROP
###ACCEPT rules
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --DPORT 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -p udp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp icmp --icmp-type echo-request -j ACCEPT
允許通過防火墻發(fā)起ftp、ssh、smtp和whois連接,但這類必須是從子網(wǎng)接口(eth1)上的內(nèi)部子網(wǎng)發(fā)起的,允許來自任何源地址的http、https和dns通信通過防火墻
####default log rule
$IPTABLES -A FORWARD -i ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options
網(wǎng)絡(luò)地址轉(zhuǎn)換
iptables的nat表專用于定義所有的NAT規(guī)則,在這個(gè)表中有兩個(gè)鏈:PREROUTING和POSTROUTING,利用PREROUTING鏈將nat表中的規(guī)則應(yīng)用到還沒有通過內(nèi)核中路由算法確定應(yīng)從哪個(gè)接口傳輸?shù)臄?shù)據(jù)包,在這個(gè)鏈中處理的數(shù)據(jù)包也尚未經(jīng)過filter表中的INPUT或PREROUTING鏈的處理
POSTROUTING鏈負(fù)責(zé)處理經(jīng)過內(nèi)核中的路由算法確定傳輸?shù)奈锢斫涌诓⒓磳脑摻涌诔鋈サ臄?shù)據(jù)包,由這個(gè)鏈處理的數(shù)據(jù)包已通過filter表中的output或forward鏈的檢查
### NAT rules
echo "[+]Setting up NAT rules..."
$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.10.3:80
$IPTABLES -t nat -A PREROUTING -p tcp --dport 443 -i eth0 -j DNAT --to 192.168.10.3:443
$IPTABLES -t nat -A PREROUTING -p tcp --dport 53 -i eth0 -j DNAT --to 192.168.10.4:53
$IPTABLES -t nat -A POSTROUTING -是¥INT_NET -o eth0 -j MASQUERAD
內(nèi)網(wǎng)的web服務(wù)器和DNS服務(wù)器的ip地址分別為192.168.10.3、4,用于提供NAT功能的iptables命令,3個(gè)PREROUTING規(guī)則允許外網(wǎng)的web服務(wù)和DNS請(qǐng)求被發(fā)送給合適的內(nèi)網(wǎng)服務(wù)器,在POSTROUTING規(guī)則允許來自內(nèi)部不可路由網(wǎng)絡(luò)并指向外部因特網(wǎng)的連接看起來就像他們來自IP地址71.157.X.X
構(gòu)建iptable策略的最后一步實(shí)在linux內(nèi)核中啟用ip轉(zhuǎn)發(fā)
###forwarding###
echo "[+] Enabling Ip forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward
測試用到的命令
hping
nc表 (table)
包含4個(gè)表:
4個(gè)表的優(yōu)先級(jí)由高到低:raw-->mangle-->nat-->filter
raw---RAW表只使用在PREROUTING鏈和OUTPUT鏈上,因?yàn)閮?yōu)先級(jí)最高,從而可以對(duì)收到的數(shù)據(jù)包在連接跟蹤前進(jìn)行處理。一但用戶使用了RAW表,在某個(gè)鏈上,RAW表處理完后,將跳過NAT表和ip_conntrack處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了.
filter---這個(gè)規(guī)則表是預(yù)設(shè)規(guī)則表,擁有 INPUT、FORWARD 和 OUTPUT 三個(gè)規(guī)則鏈,這個(gè)規(guī)則表顧名思義是用來進(jìn)行封包過濾的理動(dòng)作
net----此規(guī)則表擁有prerouting和postrouting兩個(gè)規(guī)則鏈, 主要功能為進(jìn)行一對(duì)一、一對(duì)多、多對(duì)多等網(wǎng)址轉(zhuǎn)譯工作(SNATDNAT)
mangle--此規(guī)則表擁有prerouting、FORWARD、postrouting三個(gè)規(guī)則鏈,除了進(jìn)行網(wǎng)址轉(zhuǎn)譯工作會(huì)改寫封包外,在某些特殊應(yīng)用可能也必須去改寫封包(ITL、TOS)或者是設(shè)定MARK(將封包作記號(hào),以進(jìn)行后續(xù)的過濾)這時(shí)就必須將這些工作定義在mangles規(guī)則表中
常用命令:
-A 追加規(guī)則-->iptables -A INPUT
-D 刪除規(guī)則-->iptables -D INPUT 1(編號(hào))
-R 修改規(guī)則-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代現(xiàn)行規(guī)則,順序不變(1是位置)
-I 插入規(guī)則-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一條規(guī)則,原本位置上的規(guī)則將會(huì)往后移動(dòng)一個(gè)順位
-L 查看規(guī)則-->iptables -L INPUT 列出規(guī)則鏈中的所有規(guī)則
-N 新的規(guī)則-->iptables -N allowed 定義新的規(guī)則
通用參數(shù):
-p 協(xié)議 例:iptables -A INPUT -p tcp
-s源地址 例:iptables -A INPUT -s 192.168.1.1
-d目的地址 例:iptables -A INPUT -d 192.168.12.1
-sport源端口 例:iptables -A INPUT -p tcp --sport 22
-dport目的端口 例:iptables -A INPUT -p tcp --dport 22
-i指定入口網(wǎng)卡 例:iptables -A INPUT -i eth0
-o指定出口網(wǎng)卡 例:iptables -A FORWARD -o eth0
-j 指定要進(jìn)行的處理動(dòng)作
常用的ACTION:
DROP:丟棄
REJECT:明示拒絕
ACCEPT:接受
SNAT基于原地址的轉(zhuǎn)換
source--指定原地址
比如我們現(xiàn)在要將所有192.168.10.0網(wǎng)段的IP在經(jīng)過的時(shí)候全都轉(zhuǎn)換成172.16.100.1這個(gè)假設(shè)出來的外網(wǎng)地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1(外網(wǎng)有效ip)
這樣,只要是來自本地網(wǎng)絡(luò)的試圖通過網(wǎng)卡訪問網(wǎng)絡(luò)的,都會(huì)被統(tǒng)統(tǒng)轉(zhuǎn)換成172.16.100.1這個(gè)IP.
MASQUERADE(動(dòng)態(tài)偽裝)--家用帶寬獲取的外網(wǎng)ip,就是用到了動(dòng)態(tài)偽裝
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
DNAT目標(biāo)地址轉(zhuǎn)換
destination-指定目標(biāo)地址
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
10.18訪問80端口轉(zhuǎn)換到100.2上
MASQUERADE:源地址偽裝
REDIRECT:重定向:主要用于實(shí)現(xiàn)端口重定向
MARK:打防火墻標(biāo)記的
RETURN:返回 在自定義鏈執(zhí)行完畢后使用返回,來返回原規(guī)則鏈。
鏈 (chain)
每個(gè)表都有自己的一組內(nèi)置鏈,可以對(duì)鏈進(jìn)行自定義,這樣就可以建立一組規(guī)則,
filter表中的input、output和forward鏈
匹配(match)
每個(gè)iptables規(guī)則都包含一組匹配以及一個(gè)目標(biāo),iptables匹配指的是數(shù)據(jù)包必須匹配的條件,只有當(dāng)
數(shù)據(jù)包滿足所有的匹配條件時(shí),iptables才能根據(jù)由該規(guī)則的目標(biāo)所指定的動(dòng)作來處理該數(shù)據(jù)包
匹配都在iptable的命令行中指定
source--匹配源ip地址或網(wǎng)絡(luò)
destination (-d)--匹配目標(biāo)ip地址或網(wǎng)絡(luò)
protocol (-p)--匹配ip值
in-interface (-i)--流入接口(例如,eth0)
out-interface (-o)--流出接口
state--匹配一組連接狀態(tài)
string--匹配應(yīng)用層數(shù)據(jù)字節(jié)序列
comment--在內(nèi)核內(nèi)存中為一個(gè)規(guī)則關(guān)聯(lián)多達(dá)256個(gè)字節(jié)的注釋數(shù)據(jù)
目標(biāo)(target)
iptables支持一組目標(biāo),用于數(shù)據(jù)包匹配一條規(guī)則時(shí)觸發(fā)一個(gè)動(dòng)作
ACCEPT--允許數(shù)據(jù)包通過
DROP--丟棄數(shù)據(jù)包,不對(duì)該數(shù)據(jù)包做進(jìn)一步的處理,對(duì)接收棧而言,就好像該數(shù)據(jù)包從來沒有被接收一樣
LOG--將數(shù)據(jù)包信息記錄到syslog
REJECT--丟棄數(shù)據(jù)包,同時(shí)發(fā)送適當(dāng)?shù)捻憫?yīng)報(bào)文(針對(duì)TCP連接的TCP重要數(shù)據(jù)包或針對(duì)UDP數(shù)據(jù)包的ICMP端口不可達(dá)消息)
RETURN--在調(diào)用鏈中繼續(xù)處理數(shù)據(jù)包
vi /etc/sysconfig/iptables 策略文件
vi /etc/sysconfig/iptables-config 配置文件
iptables缺省具有5條規(guī)則鏈
prerouting(內(nèi)到外) forward(轉(zhuǎn)發(fā)) postrouting(外到內(nèi))
input(輸入) output(輸出)
1.鏈管理命令(這都是立即生效的)
-P :設(shè)置默認(rèn)策略的(設(shè)定默認(rèn)門是關(guān)著的還是開著的)
默認(rèn)策略一般只有兩種
iptables -P INPUT (DROP|ACCEPT)
默認(rèn)是關(guān)的/默認(rèn)是開的
比如:
iptables -P INPUT DROP
這就把默認(rèn)規(guī)則給拒絕了。并且沒有定義哪個(gè)動(dòng)作,所以關(guān)于外界連接的所有規(guī)則包括Xshell連接之類的,遠(yuǎn)程連接都被拒絕了
-F: FLASH,清空規(guī)則鏈的(注意每個(gè)鏈的管理權(quán)限)
iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有鏈
-N:NEW 支持用戶新建一個(gè)鏈
iptables -N inbound_tcp_web 表示附在tcp表上用于檢查web的。
-X: 用于刪除用戶自定義的空鏈
使用方法跟-N相同,但是在刪除之前必須要將里面的鏈給清空昂了
-E:用來Rename chain主要是用來給用戶自定義的鏈重命名
-E oldname newname
-Z:清空鏈,及鏈中默認(rèn)規(guī)則的計(jì)數(shù)器的(有兩個(gè)計(jì)數(shù)器,被匹配到多少個(gè)數(shù)據(jù)包,多少個(gè)字節(jié))
iptables -Z :清空
2.規(guī)則管理命令
-A:追加,在當(dāng)前鏈的最后新增一個(gè)規(guī)則
-I num : 插入,把當(dāng)前規(guī)則插入為第幾條。
-I 3 :插入為第三條
-R num:Replays替換/修改第幾條規(guī)則
格式:iptables -R 3 …………
-D num:刪除,明確指定刪除第幾條規(guī)則
3.查看管理命令 “-L”
附加子命令
-n:以數(shù)字的方式顯示ip,它會(huì)將ip直接顯示出來,如果不加-n,則會(huì)將ip反向解析成主機(jī)名。
-v:顯示詳細(xì)信息
-vv
-vvv :越多越詳細(xì)
-x:在計(jì)數(shù)器上顯示精確值,不做單位換算
--line-numbers : 顯示規(guī)則的行號(hào)
-t nat:顯示所有的關(guān)卡的信息
4.:詳解匹配標(biāo)準(zhǔn)
2.擴(kuò)展匹配
2.1隱含擴(kuò)展:對(duì)協(xié)議的擴(kuò)展
-p tcp :TCP協(xié)議的擴(kuò)展。一般有三種擴(kuò)展
--dport XX-XX:指定目標(biāo)端口,不能指定多個(gè)非連續(xù)端口,只能指定單個(gè)端口,比如
--dport 21 或者 --dport 21-23 (此時(shí)表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的標(biāo)志位(SYN,ACK,F(xiàn)IN,PSH,RST,URG)
對(duì)于它,一般要跟兩個(gè)參數(shù):
1.檢查的標(biāo)志位
2.必須為1的標(biāo)志位
--tcpflags syn,ack,fin,rst syn = --syn
表示檢查這4個(gè)位,這4個(gè)位中syn必須為1,其他的必須為0。所以這個(gè)意思就是用于檢測三次握手的第一次包的。對(duì)于這種專門匹配第一包的SYN為1的包,還有一種簡寫方式,叫做--syn
-p udp:UDP協(xié)議的擴(kuò)展
--dport
--sport
-p icmp:icmp數(shù)據(jù)報(bào)文的擴(kuò)展
--icmp-type:
echo-request(請(qǐng)求回顯),一般用8 來表示
所以 --icmp-type 8 匹配請(qǐng)求回顯數(shù)據(jù)包
echo-reply (響應(yīng)的數(shù)據(jù)包)一般用0來表示
2.2顯式擴(kuò)展(-m)
擴(kuò)展各種模塊
-m multiport:表示啟用多端口擴(kuò)展
之后我們就可以啟用比如 --dports 21,23,80
策略需求:
域名系統(tǒng)(DNS)查詢
文件傳輸協(xié)議(FTP)傳輸
網(wǎng)絡(luò)時(shí)間協(xié)議(NTP)查詢
安全Shell(SSH)會(huì)話
簡單郵件傳輸協(xié)議(SMTP)會(huì)話
通過HTTP/HTTPS進(jìn)行web會(huì)話
whois查詢
外網(wǎng)掃描------- (192.168.10.1(eth1)) (192.168.10.0/24)-------局域網(wǎng)客戶機(jī)(10.50)
外網(wǎng)web--------因特網(wǎng)----------iptables防火墻----------局域網(wǎng)---------------內(nèi)網(wǎng)掃描者(10.200)
外網(wǎng)dns-------- (主機(jī)名:iptables) ----------------web服務(wù)器(20.3)
(71.157.X.X(eth0)) ----------------dns服務(wù)器(10.4)
腳本:
iptables.sh
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe
INT_NET=192.168.10.0/24
####flush existing rules and set chain policy setting to drop(重置現(xiàn)有規(guī)則和鏈策略設(shè)置)
echo "[+] Flushing existing iptables rules..."
$IPTABLES -F-----------------------------(清空規(guī)則鏈)
$IPTABLES -F -t nat----------------------(清空nat表)
$IPTABLES -X-----------------------------(刪除用戶的空鏈)
$IPTABLES -p INPUT DROP------------------(關(guān)閉input端口)
$IPTABLES -p OUTPUT DROP-----------------(關(guān)閉output端口)
$IPTABLES -p FORWARD DROP----------------(關(guān)閉forward端口)
###load connection-tracking modules------(負(fù)載連接模塊)
$MODPROBE ip_conntrack-------------------(加載ip_conntrack模塊)
$MODPROBE iptables_nat-------------------(加載iptables_nat模塊)
$MODPROBE ip_conntrack_ftp---------------(加載ip_conntrack_ftp模塊)
$MODPROBE ip_nat_ftp---------------------(加載ip_nat_ftp模塊)
INPUT鏈
INPUT鏈作為iptables的構(gòu)建快,作用是控制目標(biāo)為本地系統(tǒng)的數(shù)據(jù)包是否可以和本地套接字通信,如果INPUT鏈中的第一條規(guī)則要求IPtables丟棄所以得數(shù)據(jù)包(或者INPUT鏈的策略設(shè)置為DROP),那么所有試圖通過任何ip通信方式(如TCP、UDP或ICMP)與系統(tǒng)直接通信的努力都將失敗。ARP工作在數(shù)據(jù)鏈路層而不是網(wǎng)絡(luò)層,而iptables只過濾ip及其之上協(xié)議的數(shù)據(jù)包,所以iptables不能過濾arp協(xié)議的報(bào)文。
####INPUT chain ########
echo "[+] Setting up INPUT chain ..."
####state tracking rules####
$IPTABLES -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-OPTIONS --log-tcp-options
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##anti-spoofing rules
$IPTABLES -A INPUT -i eth1 -s ! $INI_NET -j LOG --log-prefix "SPOOFED PKT"
$IPTABLES -A INPUT -i eth1 -s ! $INT_NET -j DROP
##ACCEPT rules
$IPTABLES -A INPUT -i eth1 -p tcp -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
##default INPUT LOG rule
$IPTABLES -A INPUT -i ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options
建立OUTPUT鏈規(guī)則集的命令如下所示:
#####OUTPUT chain ####
echo "[+] setting up OUTPUT chain..."
###state tracking rules
$IPTABLES -A OUTPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-options --log-tcp-options
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
###ACCEPT RULES rules for allowing connections out-interface
$IPTABLES -A OUTPUT -p tcp --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 53 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
#### default OUTPUT LOG RULES
$IPTABLES -A OUTPUT -o ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options
FORWARD 鏈
filter表中的forward鏈提供了對(duì)通過防火墻接口轉(zhuǎn)發(fā)數(shù)據(jù)包進(jìn)行訪問控制的能力:
###FORWARD chain####
echo "[+]Setting up FORWARD chain..."
###state tracking rules
$IPTABLES -A FORWARD -m state --state INVALID -j LOG --log-prefix "DROP INVALID" -- log-ip-options --log-tcp-options
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
###anti-spoofing rules
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j LOG --log-prefix "SPOOFED PKT"
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j DROP
###ACCEPT rules
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --DPORT 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -p udp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp icmp --icmp-type echo-request -j ACCEPT
允許通過防火墻發(fā)起ftp、ssh、smtp和whois連接,但這類必須是從子網(wǎng)接口(eth1)上的內(nèi)部子網(wǎng)發(fā)起的,允許來自任何源地址的http、https和dns通信通過防火墻
####default log rule
$IPTABLES -A FORWARD -i ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options
網(wǎng)絡(luò)地址轉(zhuǎn)換
iptables的nat表專用于定義所有的NAT規(guī)則,在這個(gè)表中有兩個(gè)鏈:PREROUTING和POSTROUTING,利用PREROUTING鏈將nat表中的規(guī)則應(yīng)用到還沒有通過內(nèi)核中路由算法確定應(yīng)從哪個(gè)接口傳輸?shù)臄?shù)據(jù)包,在這個(gè)鏈中處理的數(shù)據(jù)包也尚未經(jīng)過filter表中的INPUT或PREROUTING鏈的處理
POSTROUTING鏈負(fù)責(zé)處理經(jīng)過內(nèi)核中的路由算法確定傳輸?shù)奈锢斫涌诓⒓磳脑摻涌诔鋈サ臄?shù)據(jù)包,由這個(gè)鏈處理的數(shù)據(jù)包已通過filter表中的output或forward鏈的檢查
### NAT rules
echo "[+]Setting up NAT rules..."
$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.10.3:80
$IPTABLES -t nat -A PREROUTING -p tcp --dport 443 -i eth0 -j DNAT --to 192.168.10.3:443
$IPTABLES -t nat -A PREROUTING -p tcp --dport 53 -i eth0 -j DNAT --to 192.168.10.4:53
$IPTABLES -t nat -A POSTROUTING -是¥INT_NET -o eth0 -j MASQUERAD
內(nèi)網(wǎng)的web服務(wù)器和DNS服務(wù)器的ip地址分別為192.168.10.3、4,用于提供NAT功能的iptables命令,3個(gè)PREROUTING規(guī)則允許外網(wǎng)的web服務(wù)和DNS請(qǐng)求被發(fā)送給合適的內(nèi)網(wǎng)服務(wù)器,在POSTROUTING規(guī)則允許來自內(nèi)部不可路由網(wǎng)絡(luò)并指向外部因特網(wǎng)的連接看起來就像他們來自IP地址71.157.X.X
構(gòu)建iptable策略的最后一步實(shí)在linux內(nèi)核中啟用ip轉(zhuǎn)發(fā)
###forwarding###
echo "[+] Enabling Ip forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward
測試用到的命令
hping
nc
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。