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 --sport 30001: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进行封锁

  例:某服务器被CC攻击,经过抓包或者一序列手段发现有一批IP是源攻击ip,因此我们需要封掉这些IP,如果用iptables一条一条加就麻烦些了。
 
  #对TIME_WAIT的外部ip以及此对ip出现的次数经行求重排序。
  netstat -ptan | grep TIME_WAIT | awk '{print $5}' | awk -F: '{print $1}' |sort |uniq -c | sort -n -r
 
  tcpdump 抓取100个包,访问本机80的ip进行求重排序  只显示前20个,数量多的ip可能为攻击源IP,我们需要封掉它
  tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20
 
  #新建一个backlist文件,以如下格式加入这些ip (有多少个ip就多少行)
  vim backip
    add backip 123.123.123.123
    add backip 222.222.222.222
  #创建ip集
     ipset create backip hash:net
  默认的只能加65535条记录,可以用maxelem指定
    ipset create backip hash:net maxelem 1000000
 
  删除一条记录
    ipset del backip 222.222.222.222
  增加一条记录
    ipset add backip 222.222.222.222
  删除一个集
    ipset destroy backip
  保存到文件
    ipset save -f backip
 
  导入backip文件到ipset集
    ipset restore -f backip
 
  查看是否导入成功 (成功的话会发现一个新ipset名为 backip,且Members里就是那些攻击IP)
    ipset list
 
  建立一条iptables规则,拦截这些攻击ip访问服务器80,也可以直接禁止这些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

 

posted @ 2020-09-14 17:27  天涯160  阅读(191)  评论(0)    收藏  举报