c4rt1y

iptable详解

0x01 介绍

iptables不是真正的防火墙,可以理解为是一个客户端代理,用户通过iptables代理,将用户的安全设置执行。其实真正调用的是netfilter,netfilter是Linux操作系统内核上的一个数据包处理模块,具有以下功能:
1、网络地址转换
2、数据包内容修改
3、数据包过滤(防火墙)

0x02 基础环境安装

服务器ip
10.10.10.10   master
10.10.10.12   hello1

#关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

#安装iptbales(centos7需要安装,6下默认存在)
yum install -y iptables
yum install iptables-services

#关闭selinux,需要重启
sed -i 's:SELINUX=enforcing:SELINUX=disabled:g' /etc/selinux/config

#临时关闭seLinux
setenforce 0

#重启
reboot

0x03 概念

iptables有2个表:filter和nat。前者用于过滤,后者是nat用的。
iptables还有4个链:INPUT、FORWARD、PREROUTING、POSTROUTING。
前两者对应于filter表,INPUT匹配目的IP是本机的数据包,FILTER匹配穿过本机的数据包。
PREROUTING位于NAT表,用于修改目的地址(DNAT);POSTROUTING用于修改源地址(SNAT)。

命令的格式是:  iptables  -t  [表名]  [操作命令]  [操作的链名]  [规则号码(可选)]  [匹配条件(可选)]  -j  [匹配后的动作]

3.1 操作命令
操作命令有:-A -I -D -R -P -F。
-A:追加到最后一条规则,如:iptables -t filter -A INPUT -j DROP。匹配所有本机数据包,丢弃。
-I:插入一条规则,如:iptables -t filter -A INPUT 3 -j DROP。在filter表中插入为第3条记录,作用同上。
-D:删除一条规则,如:iptables -D INPUT 3。在filter表中删除第3条规则。
-R:替换规则,用的不多,不学习了。
-P:设置某个链的默认动作,如:iptables -P INPUT DROP。如果没有匹配规则,则按此处理,丢弃所有包。
-F:清空规则,但仍保留默认规则!设置过-P后,一定小心使用-F!
-L:查询。

3.2 匹配条件
-i <网络接口(入)>,如:-i eth0,匹配从eth0进来的所有数据。
-o <网络接口(出)>,如:-o eth0,匹配从eth0出去的所有数据。
-s <来源地址(主要为IP)>,如:-s 192.168.0.1,匹配来自192.168.0.1的数据包。
-d <目的地址(主要为IP)>,如:-d 192.168.0.2,匹配发往192.168.0.2的数据包。
-p <协议(tcp/udp/icmp)>,如:-p tcp;-p udp;-p icmp 8。最后一个8表示icmp类型即ping。
–sport <源端口>,如:–sport  1000,匹配源端口是1000的。
–dport <目的端口>,如:–dport  1000:3000,匹配目的端口是1000到3000的。
上述匹配条件可以组合使用,但是port必须配合p使用!

3.3 处理动作
-j ACCEPT,允许数据包通过本链路(不再继续匹配)。
-j DROP,阻止通过本链(不再继续匹配)。
-j SNAT –to IP(IP池),源地址NAT转换,对应POSTROUTING链。如将内网192.168.0.0地址修改成1.1.1.1(地址池):iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT 1.1.1.1(1.1.1.1-1.1.1.10地址池)
-j DNAT –to IP(IP池),目的地址NAT转换,对应PREROUTING链。类似SNAT,不再举例。

3.4 附加模块
-m state,匹配状态,NEW(区别于TCP)、ESTABLISTHED(已连接)、RELEASED、INVALID(无法识别)。
-m mac –macsource MACADDRESS,匹配MAC地址。iptables -A FORWARD -m –mac-source xx:xx:xx:xx:xx:xx -j DROP。
-m limmit,用一定速率匹配,-m limit –limit 50/s,只是匹配,非限制。
-m multiport,匹配多个端口

0x04 基本操作

# 查看当前规则
iptables -L -n
# 清除预设表filter中的所有规则链的规则
iptables -F
# 清除预设表filter中使用者自定链中的规则
iptables -X 
# 所有计数器归0
iptables -Z

# 保存
iptables save

# 列出 INPUT链 所有的规则:iptables -L INPUT --line-numbers
# 删除某条规则,其中5代表序号(序号可用上面的命令查看):iptables -D INPUT 5

# 不允许访问本机
iptables -P INPUT DROP
# 允许本机访问外网
iptables -P OUTPUT ACCEPT
# 所有转发一律丢弃
iptables -P FORWARD DROP


# 关于sport和dport的数据含义:input时: dport指本地,sport指外部。output时:dport指外部,sport指本地。
指定进入本地目标8888端口的tcp协议全部放行进来
iptables -I INPUT -p tcp --dport 8888 -j ACCEPT
从本地来源8888端口的tcp协议全部放行出去
iptables -I OUTPUT -p tcp --sport 8888 -j ACCEPT

#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT


# 允许某个ip访问
iptables -A INPUT -p tcp -s 10.10.10.10 -j ACCEPT
# 允许某个ip段访问
iptables -A INPUT -p tcp -s 10.10.10.0/24 -j ACCEPT

# 屏蔽一个IP
iptables -I INPUT -s 10.10.10.10 -j DROP
# 屏蔽一个IP段
iptables -I INPUT -s 10.10.10.0/24 -j DROP

#要解封一个IP
iptables -D INPUT -s 10.10.10.10 -j DROP

0x005 简单iptables防御ddos

# iptables ddos这块需要使用一些模块
recent模块:
–name  #设定列表名称,默认DEFAULT。
–rsource  #源地址,此为默认。
–rdest  #目的地址
–seconds  #指定时间内
–hitcount  #命中次数
–set  #将地址添加进列表,并更新信息,包含地址加入的时间戳。
–rcheck  #检查地址是否在列表,以第一个匹配开始计算时间。
–update  #和rcheck类似,以最后一个匹配计算时间。
–remove  #在列表里删除相应地址,后跟列表名称及地址
connlimit功能:

connlimit模块允许你限制每个客户端IP的并发连接数,即每个IP同时连接到一个服务器个数。 connlimit模块主要可以限制内网用户的网络使用,对服务器而言则可以限制每个IP发起的连接数

–connlimit-above n  #限制为多少个
–connlimit-mask n  #这组主机的掩码,默认是connlimit-mask 32 ,即每个IP.


# 1、防止syn攻击(限制单个ip的最大syn连接数)
iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP

# 2、防止DOS攻击
## 2.1、利用recent模块抵御DOS攻击
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP
## 2.2、5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。5分钟后即可恢复
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
## 2.3、防止ping洪水攻击
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT
## 2.4、单ip最大连接数为30
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
## 2.5、syn防御
iptables -N syn-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT

# 3、防止cc
## 3.1、单个IP在60秒内只允许新建20个连接,这里假设web端口就是80,
iptables -I  INPUT -i eth0 -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 60 –hitcount 20 –name DEFAULT –rsource -j DROP
iptables -I  INPUT -i eth0 -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name DEFAULT –rsource

## 3.2、控制最大连接数20
iptables  -I INPUT -p tcp –dport 80 -m connlimit  –connlimit-above 20 -j REJECT

## 3.3、每个IP最多20个初始连接
iptables -I  INPUT -p tcp –syn -m connlimit –connlimit-above 20 -j DROP

0x06 简单配置

# 查看文件
cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -s 10.10.10.0/24 -m comment --comment  "允许xxx访问" -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

# 重新载入
systemctl reload iptables

#for ssh
iptables -A INPUT -p tcp -s any/0 --destination-port 22 -j ACCEPT
iptables -N icmp_allowed
iptables -A icmp_allowed -p ICMP --icmp-type 11 -j ACCEPT
iptables -A icmp_allowed -p ICMP --icmp-type 8 -j ACCEPT
iptables -A icmp_allowed -p ICMP -j DROP
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

iptables save

0x07 资料来源

http://www.cnblogs.com/rzstrong/p/7093971.html  Linux下iptables屏蔽IP和端口号
https://blog.csdn.net/zyc88888/article/details/73274456   iptables只允许指定ip访问本机的指定端口
https://www.coder4.com/archives/1423  iptables学习笔记
https://www.okay686.cn/488.html    linux抵御DDOS攻击 通过iptables限制TCP连接和频率
https://www.coder4.com/archives/1423
https://www.cnblogs.com/frankb/p/7427944.html
https://www.cnblogs.com/alimac/p/5848372.html
http://www.zsythink.net/archives/1199
https://www.okay686.cn/488.html
GoTop