首页 > 代码库 > iptables

iptables

iptables: 包过滤型的防火墙


防火墙,字面理解做好一堵墙预防火灾。在计算机中什么代表火?  那就是危险以及任何和安全相关的不确定的因素。那在这里iptables就是那堵墙。那我们要提前建好一个墙,做好防患于未然,把危险过滤在墙外。

而且在传输协议中所有的传输都要把传输的内容封装为一个一个的包传送,iptables就是基于这种情况下做过滤,所以又称为包过滤型防火墙。

过滤方式(四表五链)


什么是四表五链?

简单来说就是实现iptables的管理,根据报文流入流出的原理而设置的一套详细的过滤配置,看下图每个表和链的对应关系;

技术分享

四个表:

表优先级的对应关系:Raw——>mangle——>nat——>filter

filter   :(过滤规则表)过滤防火墙,该表根据管理员预定义的一组规则过滤符合条件的数据报。

nat     :(地址转换规则表)用于修改源IP或目标IP,也可以改端口;

mangle   :(修改数据标记位规则表)拆解报文,做出修改,并重新封装起来;

raw    :(跟踪数据表规则)关闭nat表上启用的连接追踪机制;

 

链处理规则位置:

每个表基于不同的规则对应处理不同链上的数据,每个链对应的添加规则的位置如下图;

技术分享

五个链:

PREROUTING   :(目的地转换)负责把公网IP转换为内网IP,可以保护内网“主机|服务器”不被外网发现,增加“主机|服务器”的安全性。以及判断传输的数据是否需要转发还是本机需要的。

INPUT      :接收数据。

FORWARD      :访问目标不是本机,服务器使用路由功能实现转发。(当然也有专门的路由服务器)。

OUTPUT       :请求数据。

POSTROUTING   :(源地址转换)把内网IP转换为公网IP。同样起到了保护内网“主机|服务器”的安全的作用。

 

添加规则时的考量点:(规则添加之后是立即送往内核并且生效的)

(1) 要实现哪种功能:判断添加到哪个表上;
(2) 报文流经的路径:判断添加到哪个链上;
 
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
(1) 同类规则(访问同一应用),匹配范围小的放上面;
(2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
(3) 将那些可由一条规则描述的多个规则合并起来;
(4) 设置默认策略;

 那该怎么处理规则呢?


防火墙服务:service iptables {start|stop|restart|status}   ##CentOS6及以下

      systemctl  {start|stop|restart|status}  firewalld.service  ##CentOS7

语法格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

举例: iptables -R INPUT 1 -d 172.16.251.124 -p tcp --dport 80 -m iprange --src-range 172.16.250.25-172.16.250.30 -m time ! --weekdays 7 -j REJECT(如果不指定表默认是filter)

配置filter表上的流入的第一条规则,(原本的第一条规则此时变成了第二条这里需要注意)目标主机是172.16.251.124 扩展模式指定目标地址范围172.16.250.25-172.16.250.30 指定时间 (!取反)不是周日的时候拒绝访问tcp协议的80端口。

-j   来指定对包的处理   ##选项有很多,这里只介绍常用的几个
   ACCEPT:接受
   DROP:丢弃
   REJECT:拒绝
   REDIRECT:端口重定向

    ? 加油加油! ?      看起来比较麻烦,但是把下面的几个基础选项掌握就so easy了。
ミ ミ ( ??? )ミ゛ミ
゛゛ \   /゛゛
    i⌒ヽ |
     (_) ノ
      ∪

技术分享

 

匹配条件:

 

隐式扩展[-m]

基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供; ##为取反

[!] -s:指定源IP

[!] -d:指定目标IP

[!]--sport port[:port]:匹配报文的源端口;可以是端口范围;

[!] --dport port[:port]:匹配报文的目标端口;可以是端口范围;

[!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“的简写;

[!] --sport port[:port]:匹配报文的源端口;可以是端口范围;

[!] --dport port[:port]:匹配报文的目标端口;可以是端口范围;

[!] --icmp-type {type[/code]|typename}

echo-request:8

echo-reply:0

 比如此时想要访问web网站,那针对这个怎么配置防火墙呢?

iptables -I INPUT 1 -s 192.168.186.126 -p tcp --sport 80 -j ACCEPT

iptables -I OUTPUT 1 -d 192.168.186.126 -p tcp --dport 80 -j ACCEPT

这里使用tcp协议如果不加-p默认所有协议 因为访问80端口需要发送数据,服务器也要给我们回发我们请求的数据,所以要配置INPUT和OUTPUT两个链。()

 显式扩展:-m

显式扩展:必须显式地指明使用的扩展模块进行的扩展
  • 1、multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
[!] --sports port[,port|,port:port]...:指定多个源端口,##用逗号隔开
[!] --dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指明多个端口;
   iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
  
  • 2、iprange扩展
指明连续的(但一般不是整个网络)ip地址范围;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目标IP地址;
  iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
 
  • 3、string扩展
对报文中的应用层数据做字符串模式匹配检测;##相当于字符串传输比对算法
--algo {bm|kmp}:使用的字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] --string pattern:要检测的字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制格式编码后的字符串;
   iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
 
  • 4、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:使用内核上的时区,而非默认的UTC;
   iptables -R INPUT 1 -d 172.16.251.124 -p tcp --dport 80 -m iprange --src-range 172.16.250.25-172.16.250.30 -m time --timestart 10:00 --timestop 17:00 -j REJECT
   iptables -R OUTPUT 1 -s 172. 16.251.124 -p tcp --sport 80 -m iprange --dst-range 172.16.250.25-172.16.250.30 -m time --timestart 10:00 --timestop 17:00 -j REJECT
      172.16.251.124是虚拟机IP 172.16.250.28是PC的IP

  

 

  5、connlimit扩展

根据每客户端IP做并发连接数数量匹配;
--connlimit-upto n:连接的数量小于等于n时匹配;
--connlimit-above n:连接的数量大于n时匹配;
   iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
  

  6、limit扩展

基于收发报文的速率做匹配;
令牌桶过滤器;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
   iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
   iptables -I INPUT 2 -p icmp -j REJECT

 

  7、state扩展 

根据”连接追踪机制“去检查连接的状态;

conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:

NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;

ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;

RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;

INVALID:无效的连接;

UNTRACKED:未进行追踪的连接;

[!] --state state

   iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

   iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

 

Nat表介绍


nat :(地址转换规则表)用于修改源IP或目标IP,也可以改端口,看下图;

 

 技术分享

这里介绍介绍nat是因为比较有代表性,重复一下对应的链规则有;

  • prerouting
  • output
  • postrouting

nat表主要用来隐藏局域网内主机或者服务器,主机访问外网,路由负责把局域网内主机IP转换成为自己的,目标地址不变,把访问记录记录在一个表,服务器响应的时候会把数据丢给路由,路由接受到数据会检查自己的表是否是自己局域网内的主机请求的,如果不是会把数据丢弃,如果有记录会把目标地址改为局域网内的主机源地址不变(此时因为是响应报文所以源地址是web服务器)。

原理相同,同样可以把服务器隐藏起来,事实上现在的服务器都已经被隐藏,没有哪个公司的服务器暴露在公网之下,这样风险太大。

并且因为IPV4地址比较稀缺,并不能做到每个主机一个IP,也算是无心插柳节约了一部分地址,而且每个主机配一个IP也算一笔不菲的费用。

 

nat表的target:

 

SNAT   改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围;

  --to-source [ipaddr[-ipaddr]][:port[-port]]

  --random

DNAT    改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围;

  --to-destination [ipaddr[-ipaddr]][:port[-port]]

iptables -t nat -A POSTROUTING -s 192.168.217.0/24 -j SNAT --to-source 172.16.0.6(网卡的另外一个地址图上没有画出来)

因为局域网内所有的主机访问的资源各不相同,协议也不一样所以这里省略指定,默认为所有端口所有协议,这样就配置好了。有没有感觉很简单?

 

 

总结:只要知道语法配置起来事半功倍。只是改个选项而已命令都差不多,iptables也很简单。

 

 

 

 

 

 

iptables