7.iptables
1.简介
centos7用的是firewalld,centos7要用iptables需要安装iptables-services
基于包过滤的防火墙
容器:在iptables中用来描述包含或属于的关系
iptables是表的容器
iptables的表是链的容器
链是规则的容器
规则:一条条过滤的语句
5个表:filter、nat、mangle、raw、security
5个链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
表和链的关系

Filter表:主机自身有关,过滤入/出主机的数据包。有3个chains:INPUT、FORWARD、OUTPUT
NAT表:共享上网POSTROUTING;IP映射PREROUTING;端口映射PREROUTING
Mangle表:设置包中路由标记
iptbales工作流程:

2.iptables命令
#iptables -V #iptables -h #/etc/init.d/iptables start 如果不能启动:settup-Firewall configuration --enable #iptables -L -n ##以数字显示(把anywhere ssh等以0.0.0.0/0 22方式显示) iptables默认加载的内核模块 #lsmod | egrep "net|filter|ipt" #modprobe ip_tables #modprobe iptable_filter #modprobe iptable_nat #modprobe ip_conntrack ##连接跟踪 #modprobe ip_conntrack_ftp #modprobe ip_nat_ftp #modprobe ipt_state iptables参数 #iptables -F 清除所有规则,但默认规则不能清除 #iptables -X 删除自定义的chain #iptables -Z 清空chain的计数器 #iptables -L -n --line-numbers 显示规则序号 #iptables -t filter -D INPUT 2 删除第2条规则 #iptables -A 添加规则,在指定链的结尾,最后一条 #iptables -I 插入规则,在指定链的第一条。 #iptables -I INPUT 规则序号
#iptables -N 自建一条链 #iptables -t filter -I INPUT 2 -p tcp -s 0.0.0.0/24 -dport #iptables -t filter -A INPUT -i eth0|-s xxx -j xxx -i 从哪个接口入 -s 源地址 ! iptablws -t filter -A INPUT -i eth0 ! -s 10.0.0.115 -j DROP 反向,除了这。
3.禁止规则
语法:
#iptables -t [表名] -[A/D/I] chain rule-specification [options]
例:
#iptables -t filter -A INPUT -p tcp --dport 52 -j DROP ##禁止ssh #iptables -t filter -A INPUT -p tcp --dport 80 -j DROP ##禁止80 #iptables -t filter -A INPUT -p icmp --icmp-type 8 -i eth0 -s 10.0.0.0/24 -j DROP ##禁ping
4.禁止多个端口
#iptables -t filter -I INPUT -p tcp --dport 52000:53000 -j DROP # iptables -t filter -I INPUT -p tcp -m multiport--dport 21,22,23,24 -j DROP ##-m,match
5.匹配ICMP类型
icmp-type 0 :echo-reply 响应
icmp-type 8/0:echo-request 请求
#iptables -A INPUT -p icmp --icmp-type 8 -j DROP #iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT #iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
5.1.允许ping出,不允许ping入
#iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT ##禁入 #iptables -t filter -A OUTPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT ##禁出
5.2.允许ping入,不允许ping出
#iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT
6.网络状态
-m state --state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动新连接
INVALID:非法或无法识别的
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
限速
-m limit
--limit n/{second/minute/hour}指定时间内的请求速率,n为速率,
--limit-burst [n]:在同一时间内允许通过的请求,“n”为数字,不指定默认为5
例:允许172.16.0.0/16网络ping本机172.16.14.1,但限制每分钟请求不能超过20,每秒并发不能超过6个
#iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT #iptables -A OUTPUT -s 172.16.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
限连接数
-m connlimit --connlimit-above n
允许外网每个IP最多15个初始连接,超过的丢弃
#iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP (--connlimit-mask 32为主机掩码,32即为一个主机ip,也可以是网段)
7.两种模式防火墙例
1.当作网关用规则:默认允许进,指定拒绝
2.主机防火墙规则:默认拒绝,指定允许
7.1.主机防火墙
#iptables -F #iptables -X #iptables -Z #iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT #iptables -A INPUT -i l0 -j ACCEPT #iptables -A OUTPUT -o l0 -j ACCEPT
设置默认规则
#iptables -P INPUT DROP ##-P --policy #iptables -P OUTPUT ACCEPT #iptables -P FORWARD DROP
设置信任网段
#iptables -A INPUT -s 10.146.0.0/22 -p all -j ACCEPT
允许80端口提供服务
#iptables -A INPUT -p tcp --dport 80 -j ACCEPT
如果有用nginx的proxy_pass转发到本机,要加上下面这一行。
#iptables -A INPUT -i lo -j ACCEPT
允许ping
#iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT ##允许所有地址ping #iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT ###允许指定网段ping
允许关联的状态包通过
#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ##可不设,前面OUTPUT链设置了默认允许
保存配置
#iptables save
防止syn攻击---限制syn请求速度
#iptables -N syn-flood
#iptables -A INPUT -i eth0 -p --syn -j syn-flood ##或iptables -I INPUT -j syn-flood
#iptables -A syn-flood -m limit -limit 500/s -limit-burst 20 -j RETURN
#iptables -A syn-flood -j DROP
限制每秒请求不能超过500,每秒并发不能超过20个
RETURN:
1. 从一个CHAIN里可以jump到另一个CHAIN, jump到的那个CHAIN是子CHAIN.
2. 从子CHAIN return后,回到触发jump的那条规则,从那条规则的下一条继续匹配.
3. 如果return不是在子CHAIN里,而是在main CHAIN,那么就以默认规则进行.
防止端口扫描/屏蔽SYN_RECV攻击
#iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
ping洪水攻击
#iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
防止NMAP FIN/URG/PSH
#iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
Null Scan(possibly)
#iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP
SYN/RST
# iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
SYN/FIN -- Scan(possibly)
# iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
限制对内部封包的发送速度
#iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
防御太多DOS攻击连接,可以允许外网每个IP最多15个初始连接,超过的丢弃,第二条是在第一条的基础上允许已经建立的连接和子连接允许
#iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP (--connlimit-mask 32为主机掩码,32即为一个主机ip,也可以是网段)
#iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
抵御DDOS ,允许外网最多24个初始连接,然后服务器每秒新增12个,访问太多超过的丢弃,第二条是允许服务器内部每秒1个初始连接进行转发
#iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT #iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
允许单个IP访问服务器的80端口的最大连接数为 20
#iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT
对访问本机的22端口进行限制,每个ip每小时只能连接5次,超过的拒接,1小时候重新计算次数
#iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP #iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
分析网络连接自动封IP
/bin/netstat -na| grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}' | sort |uniq -c|sort -rn |head -10 |grep -v -E '192.168|127.0'| awk '{if ($2 !=null && $1>4) {print $2}}' > /home/shell/dropip for I in $(cat /home/shell/dropip) do /sbin/iptables -I INPUT -s $i -j DROP echo "$i kill at `date`" >> /var/log/ddos done
7.2.iptables做为网关

开启forward
#vi /etc/sysctl.conf net.ipv4.ip_forward = 1 #sysctl -p
#iptables -P FORWARD ACCEPT
#iptables -P INPUT ACCEPT
加载nat内核模块
#lsmod | grep nat #modprobe iptables_nat #modprobe ip_conntrack #modprobe iptable_filter #modprobe ip_conntrack_ftp #modprobe ip_nat_ftp #modprobe ipt_state
共享上网SNAT
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-sorce 10.0.0.19
如果internet接口ip地址是动态时
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
DNAT--端口映射
#iptables -t nat -A PREROUTING -d 10.0.0.19 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.17:9000
DNAT---IP的一对一映射
把外部IP 124.42.34.112一对一映射到内部IP 10.0.0.8,下面3条命令适用于外部网络通过访问124.42.34.112来访问内部服务器10.0.0.8
#iptables -t nat -A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8 #iptables -t nat -A POSTROUTING -s 10.0.08 -o eth0 -j SNAT --to-source 124.42.34.112 #iptables -t nat -A POSTROUTING -s 10.0.0.0/20 -d 124.42.34.112 -j SNAT --to-source 10.0.0.254(内网网关)
DNAT---多个外网IP
#iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 #iptables -t nat -A POSTROUTING -s 172.16.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.103-124.42.60.106
DNAT---映射多个外网IP
#iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 #iptables -t nat -A POSTROUTING -s 172.16.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.103-124.42.60.106
7.3.映射一个ftp服务器(被动模式)
ftp服务器129,网关131
#iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -j MASQUERADE ##出站时将源129改为网关131的地址 #iptables -t nat -I PREROUTING -p tcp -d 192.168.255.131 --dport 166 -j DNAT --to 192.168.255.129:21
开启ftp内核模块追踪相关数据端口
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
8.允许ftp
注意:FTP的工作模式是基于客户端而定的。
8.1.PORT主动模式

FTP 的客户端与服务器端共会建立两条连接,分别用在命令的下达与数据的传递。
8.2.PASV被动模式

8.3.PORT模式iptables配置
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT #iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#iptables -A OUTPUT -p tcp --sport 20:21 -j ACCEPT ##如果OUTPUT链规则默认是DROP,则要加个这条
8.4.PASV模式iptables配置
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT #iptables -A INPUT -p tcp --dport 30001:31000 -j ACCEPT ##在vsftp上添加pasv_enable=yes pasv_min_port=30001 pasv_max_port=31000
#iptables -I OUTPUT -p tcp --sport 21 -j ACCEPT ##如果OUTPUT链规则默认是DROP,则要加个这两条
#iptables -I OUTPUT -p tcp --sport30001:31000-j ACCEPT
8.5.利用状态检测模块允许PORT及PASV模式的FTP
添加ftp状态检测模块
#vi /etc/sysconfig/iptables-config IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
#手动加载
#modprobe ip_nat_ftp ###加载了ip_nat_ftp后ip_conntrack_ftp会被自动加载
#lsmod|grep ftp

iptables配置
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT #iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
9.ipset
对多个ip进行封锁
iptables -I INPUT -m set --match-set backip src -p tcp --destination-port 80 -j DROP
10.例.分析网络自动封IP
/bin/netstat -na| grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}' | sort |uniq -c|sort -rn |head -10 |grep -v -E '192.168|127.0'| awk '{if ($2 !=null && $1>4) {print $2}}' > /home/shell/dropip for I in $(cat /home/shell/dropip) do /sbin/iptables -I INPUT -s $i -j DROP echo "$i kill at `date`" >> /var/log/ddos done
11.内核优化

不优化下列参数可能会出现错误ip_conntrack:table full,dropping packet的错误

12.日志
自定义输出日志位置
#vim /etc/rsylogs
kern.warning /var/log/iptables.log
打开iptales日志
#iptables -A INPUT -j LOG --log-prefix "curious_log" --log-level 4 //输出日志在/var/log/iptables.log

浙公网安备 33010602011771号