iptables/netfilter进阶

  在上一章当中我们介绍了iptables的介绍以及它的基本使用,下面我们开始介绍iptables的命令用法以及iptables是如何工作的。

1、回顾

  我们回顾一下上一章节的内容,在上一章节中我们讲述的是iptables的基本概念以及命令格式,同时讲述规则链与表的概念,那么现在我们就要说一下iptables的相关命令。

2、iptables的相关命令

  其实使用iptables命令,都要遵从"四表五链",那么在前一章我们说过,iptables的格式如下

# iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]] [-j targetname [per-target-options]]

  那么下面我们依据这个命令的格式,来用实例熟悉iptables命令。
  (1) 开放本机为192.168.1.16的80端口,然后我们拒绝3306端口进行响应。

# iptables -A INPUT -d 192.168.1.16 -p tcp --dport 80 -j ACCEPT# iptables -A INPUT -d 192.168.1.16 -p tcp --dport 3306 -j DROP

  以上的命令是很简单的,那么为什么在INPUT上将80,3306端口写上去呢?这是因为别人发请求的时候,我响应给客户端时,我变成了"目标",而我并不知道源地址,更别说客户端用那个端口给我进行响应了,但是我知道目标IP和目标端口是谁,只要在入栈报文处进行处理给它实施拦截,就可以得到有效的控制。
不过以上的规则当中,我们可以使用显式扩展-m当中的multiport以离散或连续的方式指定多个端口,最多达到15个,不过必须要统一起来,要么就放行,要么就拦截。

[!] --source-ports, --sports port[,port|,port:port]...  指定多个端口
[!] --destination-ports, --ports port[,port|,port:port]...  指定多个目标端口

  示例如下:

# iptables -A INPUT -d 192.168.1.16 -p tcp -m multiport --dports 80,3306 -j ACCEPT

  同样,在OUTPUT链上,我们可以不允许放行,即使在INPUT链中能进来,但不响应也是不行···的。

# iptables -A OUTPUT -s 192.168.1.15 -p tcp -m multiport --sports 22,80 -j DROP

  注意:这样的实验还是并不推荐,因为这样会把远程回话给拒绝掉,如果说要做这个实验的话,还是把22号端口放行,如果真的做了这个事情,需要在实体机上执行清空规则命令

# iptables -F

  (2) 拒绝从192.168.1.20-30范围的IP地址拒绝访问192.168.1.15的80端口

# iptables -A INPUT -d 192.168.1.15 -p tcp --dport 80 -m iprange --src-range 192.168.1.20-192.168.1.30 -j DROP

  在显示扩展中,iprange是匹配ip的范围,是以连续的方式来指明多个ip地址的匹配条件,一般有两种方式:

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

  (3) 在周六周日的两点半到六点半期间,所有来源于192.168.24.0/24的范围网段禁止访问192.168.1.15的80端口。

# iptables -A INPUT -s 192.168.24.0/24 -d 192.168.1.15 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays 6,7 -j DROP# iptables -A INPUT -s 192.168.24.0/24 -d 192.168.1.15 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays 6,7 --kerneltz -j DROP

  以上这两种命令的意思大致是一样的,time就是显示扩展之一的选项,--timestart是开始的时间,那么--timestop是停止的时间,--weekdays表示日期,可以用数字表示或者是单词,与众不同的是第二个是多个--kerneltz,那么这个意思是转换成内核所设置的时间,也就是说,第一段命令使用的是UTC时间。
  (4) 带有凡事从192.168.1.15响应为"gay"字符串,从80端口响应出去的全部屏蔽掉。

# iptables -A OUTPUT -s 192.168.1.15 -p tcp --sport 80 -m string --algo bm --string "gay" -j DROP

  显示扩展string是报文中的应用层数据作为字符串模式的匹配检测,以上的命令中如果匹配到的话就丢弃掉,其中--algo是指明算法的,算法共有两个,一个是bm,另一个是kmp;检测的模式也有两种,一个是检测字符串的模式,另一个是要检测字符串的模式,但是是16进制的,如下以此显示:

[!] --string pattern    要检测的字符串模式[!] 
--hex-string pattern    要检测字符串模式,16进制

  (5) ping请求最少达到3个,最多不能达到5个。

# iptables -A INPUT -d 192.168.1.15 -p icmp --icmp-type 8 -m limit --limit 3/minute --limute-burst 5 -j ACCEPT

  这是limit扩展,基于收发报文的速率匹配,在这里面,还有令牌桶过滤器,有了这个过滤器,我们可以限制它的数量,以这段命令为例,从iptables的角度看,就是开始的时候,有五个通行证,用完之后每20秒增加一个,以用户的角度看,就是每一分钟增加三个或每分钟只能过三个,要是想20分钟过一个,只能写成--limit 3/hour --limit-burst 5。所以,以下子命令的显示为:

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

  (6) 访问192.168.1.15的22号端口和80端口的NEW状态以及ESTABLISHED状态进入,之后只能允许ESTABLISHED放行。

# iptables -A INPUT -d 192.168.1.26 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT# iptables -A OUTPUT -s 192.168.1.26 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT# iptables -P INPUT DROP# iptables -P FORWARD DROP# iptables -P OUTPUT DROP

  这属于是state扩展,这才使得让iptables拥有带状态控制的防火墙功能,它是根据"连接追踪机制"去检查防火墙的状态,我们称之为conntrack机制,它是去检查连接状态,去追踪本机上的请求和响应之间的关系,状态有如下几种:

NEW 发出新请求,连接追踪模版中不存在此连接的相关信息条目;因此,将其识别为第一次发出请求(新连接请求)
ESTABLISHED 这是NEW状态之后,连接追踪模版中为其建立的条目失败之前期间内所进行的通信状态(已建立的连接)
INVALID 无法识别的连接
RELATED 相关联的连接,当前是一个新请求,但附属于某个已存在的连接
UNTRACKED   未追踪的连接

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、容器云、Go、Python开发专业人才培训机构!