linux 防火墙iptables

iptables 是 Linux 中比较底层的网络服务,它控制了 Linux 系统中的网络操作,CentOS 中的 firewalld 和 Ubuntu 中的 ufw 都是在 iptables 之上构建的,只为了简化 iptables 的操作。同时,iptables 不仅仅是防火墙这么简单,它基本上能实现你在 linux 上对于网络的所有需求,最常用的就是数据转发、网络地址转换等,例如 LVS 可以利用 Iptables 实现SNAT模式。

1、iptables介绍

1.1)iptables的发展:

iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用;现在又叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

netfilter是什么?

从ipchains开始,允许在用户空间中定义各种规则,ipchains、iptables是用来定义这些规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter(网络过滤器),它是Linux内核中实现包过滤的内部结构,真正的防火墙。

1.2)iptables工作机制:

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

  1. PREROUTING:路由前
  2. INPUT:数据包流入口
  3. FORWARD:转发管卡
  4. OUTPUT:数据包出口
  5. POSTROUTING:路由后

linux 防火墙iptables_第1张图片

  1. 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。
  2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。
  3. 本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。
  4. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达POSTROUTING链输出。

1.3)规则、表、链:

1)规则(rules):

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

2)链(chains):

每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

说明:除了INPUT、OUTPUT、FORWARD、PREROUTING 以及 POSTROUTING这几个预先设置的chain之外,还可以自定义chain

3)表(tables):

表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。

  • RAW表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING
  • mangle表:主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)等,应用并不广泛。在内核版本2.4.18 后的linux版本中该表包含的链为INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)
  • nat表:主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)
  • filter表:主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改

规则表之间的优先顺序:Raw>>>>mangle>>>>nat>>>>filter

2、iptables命令

iptables命令的一般格式:iptables [commands] [options]

2.1)commands:

1)规则相关:

  • -P --policy <链名> 定义默认策略
  • --list -L [chain [rulenum]]: 查看chain的规则信息
  • --append -A chain:在指定chain的规则列表最后增加1条规则
  • --insert -I chain [rulenum]:在指定chain的规则列表中,指定位置插入1条规则,默认rulenum位置是1
  • --delete -D chain:在指定chain的规则列表中,删除指定位置或匹配的规则
  • --flush -F [chain]:Delete all rules in chain or all chains

2)chain相关:

  • --new -N chain :Create a new user-defined chain
  • --delete-chain -X [chain] :Delete a user-defined chain
  • -N --new <链名> 创建自定义链
  • -X --delete-chain <链名> 删除自定义链

2.2)options:

  • –-line-number:显示规则的序列号,这个参数在删除或修改规则时会用到
  • -v:verbose mode 详细模式
  • -n:输出数字形式的地址和端口
  • --table -t table:要操作的表,默认是filter表
  • --jump -j target:指定规则的动作(见2.4)
  • --protocol -p proto:指定protocol by number or name, eg. `tcp'
  • --source -s address[/mask][...]:原ip地址设置
  • --destination -d address[/mask][...]:目的ip地址

2.3)其他:

规则中有很多动作,例如:

1)ACCEPT、DROP、LOG:

  • ACCEPT:允许数据包通过
  • DROP:丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"

2)REJECT:

拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。范例如下:

iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply

3)SNAT:

在路由之后,做源地址转换,局域网中的主机访问外网通常使用该技术。

例如:A--->B--->C (比如我们想要访问百度,淘宝等网站)

 1.企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机B;

说明:B机:作为NAT转换机,两个网卡都有。IP:172.17.123.224 192.168.199.138,
需要在A机器上添加路由记录,route add default gw 192.168.199.138(B机器的外网ip)

2.B收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给C; 

说明:
需要在B机器上开启转发功能:echo 1 > /proc/sys/net/ipv4/ip_forward
在B机器防火墙的postrouting chain上设置转换源地址策略,  
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200

3.C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B;
4.B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。 

4)DNAT:
在路由之前,做目的地地址转换。当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部。
此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
例如:C--->B--->A (比如对外发布web网站)
1.互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,
2.C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。 

说明:在在NAT转换机上:iptables -t nat -I PREROUTING 1 -d 172.17.123.224 -j DNAT --to-destination 192.168.199.142 转换目标地址

3.A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。

5)REDIRECT:
在路由之后,将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护 web 服务器。DNAT和REDIRECT的区别在于,DNAT可以将其数据包发送到除本机以外的其他主机和端口,而REDIRECT则可以将收到的数据包转发到本机的其他端口,所以我理解就是DNAT的策略一般都制定在专门的NAT服务器上,而REDIRECT的策略一般制定在目标主机上当然也可以用来代替DNAT 

iptables -t nat -A PREROUTING -d 192.168.199.143 -p tcp --dport 80 -j REDIRECT --to-ports 8080

6)MASQUERADE:

改写封包来源 IP 为防火墙的 IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

7)RETURN :

结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

8)MARK:

将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:

9)MIRROR:

镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。

2.3)示例:

1)查看规则信息:

#查看所有链的规则信息
$iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 19799 packets, 713K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       11  3497 ACCEPT     udp  --  eth1   *       0.0.0.0/0            0.0.0.0/0            udp spt:30010
2     658K   65M ACCEPT     tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0            tcp spt:389
3        0     0 ACCEPT     all  --  *      *       172.27.3.212         0.0.0.0/0           
4        0     0 ACCEPT     all  --  *      *       10.53.195.24         0.0.0.0/0           

Chain ETH1_TCP (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       21.0.0.0/8           0.0.0.0/0           
2    2966K  163M ACCEPT     all  --  *      *       9.0.0.0/8            0.0.0.0/0           
3     333K   16M ACCEPT     all  --  *      *       10.0.0.0/8           0.0.0.0/0           
4     481K   25M ACCEPT     all  --  *      *       11.0.0.0/8           0.0.0.0/0           
5     9497 1099K ACCEPT     all  --  *      *       30.0.0.0/8           0.0.0.0/0         

#查看某一个链的规则信息
$iptables -L ETH1_TCP -nv --line-numbers
Chain ETH1_TCP (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       21.0.0.0/8           0.0.0.0/0           
2    2966K  163M ACCEPT     all  --  *      *       9.0.0.0/8            0.0.0.0/0           
3     333K   16M ACCEPT     all  --  *      *       10.0.0.0/8           0.0.0.0/0           
4     481K   25M ACCEPT     all  --  *      *       11.0.0.0/8           0.0.0.0/0           
5     9497 1099K ACCEPT     all  --  *      *       30.0.0.0/8           0.0.0.0/0  

2)添加规则:

#在INPUT chain上默认的filter表中第一位插入规则,指定原ip地址
iptables -I INPUT 1 -s 21.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 20.0.0.0/8 -j DROP

3)删除规则:

 #在INPUT chain上默认的filter表中删除第4条规则
 iptables -D INPUT 4

4)其他:

#永久生效
service iptables save
service iptables restart

你可能感兴趣的:(linux,linux,运维,服务器)