其实匹配扩展中,还有须要加-m引用模块的显示扩展,默认是隐含扩展,不要使用-m。算法
状态检测的包过滤:vim
-m state --state {NEW,ESTATBLISHED,INVALID,RELATED} 指定检测那种状态bash
-m multiport 指定多端口号
--sport
--dport
--ports网络
-m iprange 指定IP段
--src-range ip-ip
--dst-range ip-iptcp
-m connlimit 链接限定
--comlimit-above # 限定大链接个数spa
-m limit 如今链接速率,也就是限定匹配数据包的个数
--limit 指定速率
--limit-burst # 峰值速率,最大限定命令行
-m string 按字符串限定
--algo bm|kmp 指定算法bm或kmp
--string "STRING" 指定字符串自己rest
使用脚本设定规则:code
建立脚本: [root@1 ~]# vi /usr/local/sbin/iptables.sh #! /bin/bash ipt="/usr/sbin/iptables" # 定义一个变量——iptables命令(定义变量时尽可能使用绝对路径,避免环境变量的影响) $ipt -F # 清空原有规则 $ipt -P INPUT DROP $ipt -P OUTPUT ACCEPT $ipt -P FORWARD ACCEPT # 上面三行是定义其默认策略 $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # -m是指定检测状态,--state指定数据包状态(配合-m使用),该命令行的目的是使数据处理(通讯 )更顺畅 $ipt -A INPUT -s 192.168.8.0/24 -p tcp --dport 22 -j ACCEPT $ipt -A INPUT -p tcp --dport 80 -j ACCEPT $ipt -A INPUT -p tcp --dport 21 -j ACCEPT # 上面三行命令是指定放行的包的类型 icmp示例 iptables -I INPUT -p icmp --icmp-type 8 -j DROP 执行该脚本中的规则: [root@1 ~]# sh /usr/local/sbin/iptables.sh
注意: 脚本中指定的IP若是和主机IP不一样时不要在远程端口直接运行该脚本!server
[root@1 ~]#iptables -I INPUT -p icmp --icmp-type 8 -j DROP
说明: 该规则的含义是:只容许本机访问外网,不容许外网访问本机!
环境:
A机器两块网卡ens33(192.168.8.125)、ens37(192.168.100.1),ens33能够上外网,ens37仅仅是内部网络,B机器只有ens37(192.168.100.100),和A机器ens37能够通讯互联。
准备工做:
设置ens37的IP:
[root@1 ~]# ifconfig ens37 192.168.100.1/24
注: 该方法只是临时设定IP,重启后会丢失。
需求:
需求1: 可让B机器链接外网
[root@1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward 该命令是更改内核设置,打开路由转发功能,默认值是0.
[root@1 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE [root@1 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * ens33 192.168.100.0/24 0.0.0.0/0
说明: -o 选项后面跟设备名称,表示出口网卡,MASQUERADE是假装、冒充的意思。
[root@1 ~]# route add default gw 192.168.100.1
[root@1 ~]# vim /etc/resolv.conf # Generated by NetworkManager nameserver 119.29.29.29
而后使用ping命令检测,网络通畅!
注: 此时B机器能够连通外网,可是外网机器没法访问B机器,A机器的做用就相似于一个路由器!
需求2: C机器只能和A通讯,让C机器能够直接连通B机器的22端口(端口映射)
[root@1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward 该命令是更改内核设置,打开路由转发功能,默认值是0.
规则1: [root@1 ~]# iptables -t nat -A PREROUTING -d 192.168.8.125 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22 规则2: [root@1 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.8.125
[root@1 ~]# route add default gw 192.168.100.1
Finish!
原理: 每5s内tcp三次握手大于20次的属于不正常访问。
[root@1 ~]# iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.8.125 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource [root@1 ~]# iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP
说明: 其中192.168.0.0/255.255.255.0 为不受限制的网段,192.168.8.125为本机IP。
该iptables策略,可有效预防syn攻击,也能够有效防止机器人发垃圾帖。
iptables针对一个网段设置规则:
[root@1 ~]# iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP
iptables中DNAT和SNAT工做原理:
在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所通过的路由器也是根据这两个字段是断定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。
数据包在iptables中要通过的链(chain):
上图是系统对数据包进行断定转发的过程,在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。若是destination ip adress是本机地址,数据将会被转交给INPUT链。若是不是本机地址,则交给FORWARD链检测。
这也就是说,咱们要作的DNAT要在进入断定转发转发过程以前进行,也就是在PREROUTING链中作,好比咱们要把访问202.103.96.112的访问转发到192.168.0.112上:“iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112”,这调规则的做用其实就是将已经达到这台Linux网关(防火墙)上的数据包上的destination ip address从202.103.96.112修改成192.168.0.112而后交给系统路由进行转发。
同理,SNAT要在数据包流出这台机器以前的最后一个链也就是POSTROUTING链来进行操做:“iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66”,这个语句就是告诉系统把即将要流出本机的数据的source ip address修改为为58.20.51.66。这样,数据包在达到目的机器之后,目的机器会将包返回到58.20.51.66也就是本机。若是不作这个操做,那么你的数据包在传递的过程当中,reply的包确定会丢失。
假如当前系统用的是ADSL/3G/4G动态拨号方式,那么每次拨号,出口IP都会改变,SNAT就会有局限性。
“iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE”
重点在MASQUERADE这个设定值就是将动态IP假装成为(-o)的那块装置上的IP,无论如今eth0的出口得到了怎样的动态IP,MASQUERADE会自动读取eth0设定的IP地址而后作SNAT出去,这样就实现了很好的动态SNAT地址转换。
命令:iptables-save
[root@1 ~]# iptables-save > /tmp/ipt.txt
[root@1 ~]# iptables-restore < /tmp/ipt.txt