课程:
1、白环境初始化
a. 置空链表、初始化端口
iptables -F //清除每个链-表内的规则设定
iptables -X //清除用户自定的链-表: INPUT、FORWARD、OUTPUT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT //ssh
iptables -I INPUT -p tcp --dport 80 -j ACCEPT //http
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT //ftp
iptables -A INPUT -j REJECT
iptables -I INPUT -p tcp --dport 9500:9700 -j ACCEPT
iptables -I INPUT -p udp --dport 9500:9700 -j ACCEPT
iptables -I INPUT -p tcp -s 192.168.1.0/24 --dport 9800 -j ACCEPT
-I 插入规则(首部)
-A append规则(尾部)
-p protocol协议类型
--dport 目标端口(sport源地址)
-j 应用规则jump target for rule
-s
netstat -luntp //l:监听、u:udp、n:主机name、t:tcp、p:PID/Program
//[Linux netstat命令详解](https://www.cnblogs.com/ftl1012/p/netstat.html)
iptables -nL //查看
b.本机自访问、外网
iptables -I INPUT -i lo -j ACCEPT //lo:本机网卡
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
//网卡建立监听连接的状态(ESTABLISHED双向稳定状态),ftp建立数据连接时中间状态
iptables-save > /etc/iptables/rules.v4 //持久化iptables规则
iptables-resotre < /etc/iptables/rules.v4 //恢复规则
root@cffycls-PC:~# vim /etc/network/if-pre-up.d/iptables
#!/bin/bash
/sbin/iptables-restore < /etc/iptables/rules.v4
chmod +x /etc/network/if-pre-up.d/iptables
c.SNET源、DNET目标 地址转换
iptables -t nat -F //清除nat规则设定
#检查转发设置,是否忽略
sysctl -a|grep ip_forward //net.ipv4.ip_forward = 1
如果没有 vim /etc/sysctl.conf 添加这样一行,或者 echo '1' > proc/sys/net/ipv4/ip_forward,sysctl -p立即生效。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 192.168.1.111
#所有来自 -s 的请求,使用本机1.111的网卡出去
iptables -t nat -nL //查看 --line-numbers
iptables -t nat -D POSTROUTING 3 //删除
iptables -t nat -A PREROUTING -d 192.168.1.111 -p tcp --dport 80 -j DNAT --to 172.0.1.1:8080
d.防CC攻击
--syn: --tcp-flags SYN,ACK,FIN,RST SYN
-m:module_name使用模块名
## *********** 防CC攻击 ***********
#connlimit模块,防止DOS太多连接进来
iptables -I INPUT -p tcp -syn -dport 80 -m connlimit --connlimit-above 15 -j DROP
## *********** 限速 ***********
iptables -I -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
2、linux安全扫描
建立网络测试容器
docker network create mynet --subnet=111.111.0.0/16
报错旧重启下
sudo systemctl restart docker //重建docker0网络
a.fping:批量ping主机
批量ping主机。
wget http://fping.org/dist/fping-4.2.tar.gz
tar -xf fping-4.2.tar.gz && cd fping-4.2
./configure && make && make install
fping -a[--alive] -f[ --file FILE] -g[--generate生成字符串、域列表]
fping -a -g 192.168.1.0/16
b.hping:tcp探测
对目标进行tcp探测;伪造来源ip、模拟Ddos攻击。
wget https://codeload.github.com/antirez/hping/zip/master
file master //是zip文件
unzip master && cd hping-master
./configure && make && make install
apt-cache search libpcap
apt-get install libpcap-dev tcl-dev -y
ln -sf /usr/include/pcap-bpf.h /usr/include/net/bpf.h
参数:
-p: 端口
-S: 设置tcp模式的syn包
-a: 伪造ip地址
计划环境,[复制虚拟机]:
192.168.1.111 虚拟机h1 (主)
192.168.1.112 虚拟机h2 (复制)
ICMP禁ping
在虚拟机h1(主)中:
端口开放了22、80、8084-docker等
在虚拟机h2中:
ping 192.168.1.111 通;
hping -p 8084 -S 192.168.1.111 通
在虚拟机h1(主)中:
执行 sysctl -w net.ipv4.icmp_echo_ignore_all=1
在虚拟机h2中:
ping 192.168.1.111 不通;
hping -p 8084 -S 192.168.1.111 通;
fping -u 192.168.1.111 得到;
//目标机器拒绝icmp包时,普通ping不通、tcp可以
伪造来源ip:[syn包攻击]
apt-get install tcpdump -y
在虚拟机h2中:
hping -p 8084 -S 192.168.1.111 -a 10.10.10.10 卡住
在虚拟机h1(主)中:
执行 tcpdump -np -i ens33 src host 10.10.10.10
//网卡请求日志, 可以看到一直有TCP包请求过来
c.路由扫描:检测跳转、丢包率
traceroute
检测路跳转
# apt-get install traceroute -y
traceroute -n www.imooc.com //-n 不解析主机名
traceroute -nT -p 80 www.imooc.com //-T:tcp; -p: port
mtr
检测路由丢包率
# apt-get install mtr -y
mtr www.imooc.com //查看丢包率
d.批量主机扫描
nmap
批量主机扫描
# apt-get install nmap -y
-P icmp扫描 快速有效
-sS tcp.syn半扫描 高效,不易检测
-sT tcp扫描 真实,可靠
-sU udp扫描 有效透过防火墙
nmap -sP 192.168.1.0/24 //扫描存活
ncat
批量主机扫描
# apt-get install netcat -y
-w 超时时间
-z 输入输出模式
-v 显示执行过程
-u/t udp/tcp
nc -vz -w2 192.168.1.112 10-100 //10-100的端口
3、防攻击
a.工具测试容器
# Dockerfile:
RUN apt-get install -y autoconf dpkg-dev dpkg file g++ gcc libc-dev make pkgconf re2c wget unzip \
vim tcpdump net-tools inetutils-ping telnet iptables iproute2 iproute2-doc curl \
traceroute mtr nmap netcat \
&& mkdir -p /tmp/build && cd /tmp/build \
#============================================== fping ========================================================
&& wget http://fping.org/dist/fping-4.2.tar.gz && tar -xf fping-4.2.tar.gz && cd fping-4.2 \
&& ./configure && make && make install \
&& cd .. && rm -rf fping-4.2 \
#============================================== hping ========================================================
&& wget https://codeload.github.com/antirez/hping/zip/master \
&& unzip master && cd hping-master/ \
&& apt-get install -y libpcap-dev tcl-dev && ln -sf /usr/include/pcap-bpf.h /usr/include/net/bpf.h \
&& ./configure && make && make install \
&& cd .. && rm -rf hping-master
docker network create mynet1 --subnet=111.111.0.0/16
docker network create mynet2 --subnet=222.222.0.0/16
《Docker和iptables》测试(貌似没啥用):
iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.111 -j DROP
# 仅允许从子网192.168.1.0/24访问
iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP
b.常见的攻击方法
- SYN攻击
- DDOS攻击
- 恶意扫描
syn类型DDOS攻击预防
1、减少发送syn+ack包时重试次数
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
//临时,永久的可以在 /etc/sysctl.conf 等相应位置设置
2、syn cookies技术
sysctl -w net.ipv4.tcp_syncookies=1
//当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列号(初始序列号 + 1)
//进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接
3、增加backlog队列
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
其它防御策略
1、关闭ICMP协议请求
sysctl -w net.ipv4.icmp_echo_ignore_all=1
2、通过iptables防止扫描
/**
-limit: second /minute /hour /day
-limit-burst: 并发队列缓存长度
-tcp-flags:
SYN 同步标志; 表示开始会话请求
ACK 应答标志
FIN 结束标志; 结束会话
RST 复位标志; 中断一个连接
PSH 推标志; 数据包立即发送
**/
iptables -A FORWARD -p tcp -syn -m limit -limit 1m/s -limit-burst 5 -j ACCEPT
iptables -A FORWARD -p tcp -tcp-flags SYN,ACK,FIN,RST RST -m limit -limit 1m/s -j ACCEPT
iptables -A FORWARD -p icmp -icmp-type echo-request -m limit -limit 1m/s -j ACCEPT
4、http请求理解
a.http协议理解
TCP三次握手与四次挥手详解
Wireshark抓包:
三次握手:
HTTP: GET [DATA] 不发送数据
(C:Client) --> [SYN] Seq(new i=0) --> (S:Server) ==> C: SYN_SEND状态 S: LISTEN
(C) <-- [SYN, ACK] seq(new j=0) Ack(1) ] <--(S) ==> C: -- S: SYN_RECV状态
(C) --> [ACK] Seq(i+1) Ack(j+1) --> (S) ==> C: ESTABLISHED状态 S: ESTABLISHED状态
正常请求:
HTTP: GET [DATA]
(C) --> [SYN] Seq(i) --> (S:Server)
(C) <-- [ACK] Seq(j+15) Ack(i) <-- (S)
(C) <-- [ACK] Seq(j+210) Ack(i) <-- (S)
(C) <-- [ACK] Seq(j+1210) Ack(i) <-- (S)
四次挥手:
(C) --> [ACK] Seq(m) Ack(n) --> (S)
(C) <-- [FIN, ACK] Seq(y) Ack(x+36) <-- (S)
(C) <-- [FIN, ACK] Seq(y) Ack(x+110) <-- (S)
(C) --> [ACK] Seq(x+110) Ack(y+1) --> (S)
当前应答的:Seq=请求的Ack;Ack=请求的Seq+1。
握手:
b.Wireshark抓包错误状态
- tcp常见错误状态
Tcp previous segment lost(tcp先前的分片丢失)
Tcpacked lost segment(tcp应答丢失)
Tcp window update(tcp窗口更新)
Tcp dup ack(tcp重复应答)
Tcp keep alive(tcp保持活动)
Tcp retransmission(tcp重传)
Tcp ACKed unseen segument (tcp看不见确认应答)
tcp port numbers reused(tcp端口重复使用)
tcp retransmission(tcp重传)
tcp fast retransmission (tcp快速重传)
TCP Previoussegment lost(发送方数据段丢失)
tcp spurious retransmission(tcp伪重传)
tcp segment of a reassembled PDU 重组的协议数据单元