iptables常用扩展

借助于iptables的扩展,我们可以实现更灵活更强大的配置,不过iptables的扩展很多,说几个比较常用的以供参考。

  1. multiport扩展,以离散的方式定义多个端口匹配,最多可以指定15个端口。这个扩展到对于需要同时控制多个端口来说相当方便,也是很常用的。用法如下:

    [!] --source-ports,-sports port,port1:port2...
    [!] --destination-ports,-dports port,port1:port2...
    [!] --ports port,port1:port2

    以上三种用法分别针对源端口,目标端口以及源端口或目标端口。指定端口可以使用逗号分隔的离散端口也可以是用:冒号连接多个相邻的端口。

    示例:

    iptables -A INPUT -s 172.20.0.0/16 -d l72.20.0.100 -p tcp -m multiport --dports 20:22,80 -j ACCEPT

    含义是允许源地址在172.20.0.0/16网段,目标是172.20.0.100,访问端口为20,21,22,80的通信。

  2. iprange扩展,此扩展通常用来指定一个连续的但并非整个网络的IP地址范围。

    [!] --src-range from [-to]
    [!] --dst-range from [-to]

    分别用来指定源目标地址范围和目标地址范围

    示例:

    iptables -A INPUT -d 172.20.0.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
  3. mac扩展,次扩展用来指明源MAC地址,适用于PREROUTING,FORWARD,INPUT这三个iptables链

    示例:

    iptables -A INPUT -s 172.20.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT

    注意多个条件是并且的关系,如示例同时指定了source的IP和MAC地址,也就是只有当他们同时被匹配到的时候才会被应用规则。

  4. string扩展,用来对报文中的应用层数据做字符串匹配检测。用法:

    --algo {bm|kmp}	:字符串匹配检测算法
    	bm:Boyer-Moore
    	kmp:Kunth-Pratt-Morris
    --from offset :开始偏移量
    --to offset : 结束偏移量
    [!] --string pattern : 要检测的字符串模式
    [!] --hex-string pattern : 要检测的字符串模式,16进制格式

    示例:

    iptables -A OUTPUT -s 172.20.0.100 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT

    检测源地址为172.20.0.100所有的HTTP请求,包含google字样的全部拒绝。(此示例的规则定义在服务器上,172.20.0.100位服务器地址,也就是说服务器拒绝所有包含google字样的HTTP请求。)

  5. time扩展,根据报文的到达时间与指定的时间范围进行匹配,用法:

    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]对日期进行匹配的格式
    --timestart hh:mm[:ss]
    --timestop hh:mm[:ss]对时间进行匹配
    [!] --monthdays day[,day...]每个月的几号
    [!] --weekdays day[,day...]周几
    --kerneltz:内核时区,不建议使用,Cent7默认为UTC
    --localtz:指定本地时区(默认)

    示例:

    iptables -A INPUT -s 172.20.0.0/16 -d 172.20.0.100 -p tcp -dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

    注意在Cent7中系统默认为UTC时间,在指定的时候需要注意,或者使用选项指定本地时区。

  6. connlimit扩展,根据每个客户端IP做并发数量的匹配,即针对每个IP的并发数量进行控制(用处不大)

    --connlimit-upto n
    --connlimit-above n

    分别用来匹配连接数量小于某个值和连接数量大于某个值,此用法通常会与默认的拒绝或允许策略配合使用。

    示例:

    iptables -A INPUT -d 172.20.0.100 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

    拒绝所有的并发连接超过2个的IP连接172.20.0.100的ssh服务。

  7. limit,可以实现基于收发报文的速率做匹配

    --limit rate[/second|/minute|/hour|/day]
    --limit-burst number

    示例:

    iptables -I INPUT -d 172.20.0.100 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT

    –limit 10/minute用来限定每分钟只接受10个请求

    –limit-burst 5表示前5个不限制

    示例的含义是,限制所有主机ping目标主机的速率为每分钟10个,但前5个不限制。

  8. state扩展,根据“连接追踪机制”去检查连接的状态

    ​ conntrack机制:追踪本机上的请求和响应之间的关系

    状态有以下几种:

    NEW:新发出请求。连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求,只有双方第一个数据包通信为new。
    ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态,即建立连接之后的后连接状态为ESTABLISHED。
    RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
    INVALID:无效的连接,如flag标记不正确
    UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

    示例:

    iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state --state NEW -j REJECT
    iptables -A INPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

    第一条拒绝所有新建的连接,第二条允许已经建立的连接。实现的效果为当前连接的用户不会中断,但新建连接会被拒绝。

    已经追踪到的并记录下来的连接信息库

    /proc/net/nf_conntrack
    

    调整连接追踪功能所能够容纳的最大连接数量

    /proc/sys/net/nf_conntrack_max
    

    不同的协议的连接追踪时长

    /proc/sys/net/netfilter/
    

    注意: CentOS7 需要加载模块: modprobe nf_conntrack

    当连接信息库达到nf_conntrack_max中定义的最大容量时,后续连接可能会超时,可以通过下面两个方法解决:

    一、加大nf_conntrack_max的值,编辑/etc/sysctl.conf

    net.nf_conntrack_max = 100000
    net.netfilter.nf_conntrack_max = 100000

    二、降低nf_conntrack timeout的时间

    net.netfilter.nf_conntrack_tcp_timeout_established = 300
    net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
    net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
    net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

使用连接跟踪功能放行FTP示例:

  1. 装载FTP连接追踪的专用模块,路径位于/lib/modules/kernelversion/kernel/net/netfilter

  2. 修改/etc/sysconfig/iptables-config,在其中添加以下配置

    IPTABLES_MODULES = "nf_conntrack_ftp"

    或者可以执行以下命令临时使用。

    modprobe nf_conntrack_ftp
  3. 放行请求报文:

    iptables -I INPUT -d localIP -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptebles -A INPUT -d localIP -p tcp -dport 21 -m state --state NEW -j ACCEPT
  4. 放行响应报文:

    iptables -I OUTPUT -s localIP -p tcp -m state --state ESTABLISHED -j ACCEPT

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!