代理服务型防火墙工作原理
代理服务型防火墙是在应用层上实现防火墙功能的。它能提供部分与传输有关的状态,能完全提供与应用相关的状态和部分传输的信息,它还能处理和管理信息。iptables简介
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。iptables基础
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。Iptables表、链、规则(图3)
iptables传输数据包的过程
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。(图4)
iptables命令格式iptables的命令格式较为复杂,一般的格式如下:
iptables [-t 表名] 链选项 [链名] [匹配选项] [其他] [-j 动作]
总体说来,iptables就是由“四表五链”组成。
四表:
• filter:过滤,防火墙
• nat :network address translation 网络地址转换
• mangle:拆解报文,作出修改,封装报文
• raw: 关闭nat表上启用的链接追踪机制
五链:
• PREROUTING 数据包进入路由之前
• INPUT 目的地址为本机
• FORWARD 实现转发
• OUTPUT 原地址为本机,向外发送
• POSTROUTING 发送到网卡之前
链选项:
• -F : 清空规则链
• -N:创建新的自定义规则链
• -X : drop 删除用户自定义的规则链
• -P : Policy 为指定链设置默认策略;iptables -t filter -P FORWARD DROP
• -E:重命令自定义链
• -A:蒋新规则添加到指定的链上
• -I:将新规则插入到指定的位置
• -D:删除链上的指定规则
• -R:替代指定链上的规则
• -L 查看规则链
• -Z 将表中数据包计数器和流量计数器归零
匹配选项:
• -i <网络接口名> 指定数据包从哪个网络接口进入,如ppp0、eth0和eth1等
• -o <网络接口名> 指定数据包从哪块网络接口输出,如ppp0、eth0和eth1等
• -p协议类型 < 协议类型> 指定数据包匹配的协议,如TCP、UDP和ICMP等
• -s <源地址或子网> 指定数据包匹配的源地址
• –sport <源端口号> 指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
• -d <目标地址或子网> 指定数据包匹配的目标地址
• –dport目标端口号 指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
其他:
• -p tcp是指按照tcp协议操作
• -m tcp是指装入tcp的协议
-m state –state <状态> 有数种状态,状态有:
• INVALID:无效的封包,例如数据破损的封包状态
• ESTABLISHED:已经联机成功的联机状态;
• NEW:想要新建立联机的封包状态;
• RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定封包的 INPUT 规则,该有关的封包还是可以进入我们主机, 可以简化相当多的设定规则。
所以一般都会在防火墙添加
-m state –state ESTABLISHED,RELATED -j ACCEPT
允许ESTABLISHED,RELATED的包通过
动作:
• ACCEPT 接受数据包
• DROP 丢弃数据包
• REDIRECT 与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息。
• SNAT 源地址转换,即改变数据包的源地址
• DNAT 目标地址转换,即改变数据包的目的地址
• MASQUERADE IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT
• LOG 日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错iptables命令格式
iptables过滤条件(图6)
NAT的定义
NAT英文全称是Network Address Translation,称是网络地址转换,它是一个IETF标准,允许一个机构以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有Internet 地址和私有IP地址的使用。NAT的类型静态NAT(Static NAT)
静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。动态地址NAT(Pooled NAT)
动态地址NAT是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。
动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。网络地址端口转换NAPT(Port-Level NAT)NAPT是把内部地址映射到外部网络的一个IP地址的不同端口上。
最熟悉的一种转换方式。NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。
iptables实例禁止客户机访问不健康网站
【例1】添加iptables规则禁止用户访问域名为www.sexy.com的网站。 [root@localhost]# iptables -I FORWARD -d www.sexy.com -j DROP 【例2】添加iptables规则禁止用户访问IP地址为20.20.20.20的网站。 [root@localhost]# iptables -I FORWARD -d 20.20.20.20 -j DROP禁止某些客户机上网 【例1】添加iptables规则禁止IP地址为192.168.1.X的客户机上网。 [root@localhost]# iptables -I FORWARD -s 192.168.1.X -j DROP 【例2】添加iptables规则禁止192.168.1.0子网里所有的客户机上网。 [root@localhost]# iptables -I FORWARD -s 192.168.1.0/24 -j DROP禁止客户机访问某些服务 【例1】禁止192.168.1.0子网里所有的客户机使用FTP协议下载。 [root@localhost]# iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 21 -j DROP 【例2】禁止192.168.1.0子网里所有的客户机使用Telnet协议连接远程计算机。 [root@localhost]# iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 23 -j DROP强制访问指定的站点 【例】强制所有的客户机访问192.168.1.x这台Web服务器。 [root@localhost]# iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.x:80禁止使用ICMP协议 【例】禁止Internet上的计算机通过ICMP协议ping到NAT服务器的ppp0接口,但允许内网的客户机通过ICMP协议ping的计算机。 [root@localhost]# iptables -I INPUT -i ppp0 -p icmp -j DROP发布内部网络服务器 【例1】发布内网10.0.0.3主机的Web服务,Internet用户通过访问防火墙的IP地址即可访问该主机的Web服务。 [root@localhost]# iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.3:80 【例2】发布内网10.0.0.3主机的终端服务(使用的是TCP协议的3389端口),Internet用户通过访问防火墙的IP地址访问该机的终端服务。 [root@localhost]# iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 10.0.0.3:3389
25条常会用到的 IPTables 规则
1、启动、停止和重启IPTables
虽然 IPTables 并不是一项服务,但在 Linux 中还是可以像服务一样对其状态进行管理。
基于SystemD的系统 [root@localhost]# systemctl start iptables [root@localhost]# systemctl stop iptables [root@localhost]# systemctl restart iptables 基于SysVinit的系统 [root@localhost]# /etc/init.d/iptables start [root@localhost]# /etc/init.d/iptables stop [root@localhost]# /etc/init.d/iptables restart
2、查看IPtables防火墙策略
你可以使用如下命令来查看 IPtables 防火墙策略:
[root@localhost]# iptables -L -n -v
以上命令应该返回数据下图的输出:
以上命令是查看默认的 FILTER 表,如果你只希望查看特定的表,可以在 -t 参数后跟上要单独查看的表名。例如只查看 NAT 表中的规则,可以使用如下命令:
[root@localhost]# iptables -t nat -L -v –n
3、屏蔽某个IP地址
如果你发布有某个 IP 向服务器导入攻击或非正常流量,可以使用如下规则屏蔽其 IP 地址:
[root@localhost]# iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP
注意需要将上述的 XXX 改成要屏蔽的实际 IP 地址,其中的 -A 参数表示在 INPUT 链的最后追加本条规则。(IPTables 中的规则是从上到下匹配的,一旦匹配成功就不再继续往下匹配)
如果你只想屏蔽 TCP 流量,可以使用 -p 参数的指定协议,例如:
[root@localhost]# iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP
4、解封某个IP地址
要解封对 IP 地址的屏蔽,可以使用如下命令进行删除:
[root@localhost]# iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP
其中 -D 参数表示从链中删除一条或多条规则。
5、使用IPtables关闭特定端口
很多时候,我们需要阻止某个特定端口的网络连接,可以使用 IPtables 关闭特定端口。
阻止特定的传出连接: [root@localhost]# iptables -A OUTPUT -p tcp --dport xxx -j DROP 阻止特定的传入连接: [root@localhost]# iptables -A INPUT -p tcp --dport xxx -j ACCEPT
6、使用Multiport控制多端口
使用 multiport 我们可以一次性在单条规则中写入多个端口,例如:
[root@localhost]# iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT [root@localhost]# iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT
7、在规则中使用 IP 地址范围
在 IPtables 中 IP 地址范围是可以直接使用 CIDR 进行表示的,例如:
[root@localhost]# iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT
8、配置端口转发
有时我们需要将 Linux 服务器的某个服务流量转发到另一端口,此时可以使用如下命令:
[root@localhost]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525
上述命令会将所有到达 eth0 网卡 25 端口的流量重定向转发到 2525 端口。
9、屏蔽HTTP服务Flood攻击
有时会有用户在某个服务,例如 HTTP 80 上发起大量连接请求,此时我们可以启用如下规则:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT
上述命令会将连接限制到每分钟 100 个,上限设定为 200。
10、禁止PING
对 Linux 禁 PING 可以使用如下规则屏蔽 ICMP 传入连接:
iptables -A INPUT -p icmp -i eth0 -j DROP
11、允许访问回环网卡
环回访问(127.0.0.1)是比较重要的,建议大家都开放:
[root@localhost]# iptables -A INPUT -i lo -j ACCEPT [root@localhost]# iptables -A OUTPUT -o lo -j ACCEPT
12、屏蔽指定MAC地址
使用如下规则可以屏蔽指定的 MAC 地址:
iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP
13、限制并发连接数
如果你不希望来自特定端口的过多并发连接,可以使用如下规则:
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
以上规则限制每客户端不超过 3 个连接。
14、清空IPtables规则
要清空 IPtables 链可以使用如下命令: [root@localhost]# iptables -F 要清空特定的表可以使用 -t 参数进行指定,例如: [root@localhost]# iptables -t nat –F
15、保存IPtables规则
默认情况下,管理员对 IPtables 规则的操作会立即生效。但由于规则都是保存在内存当中的,所以重启系统会造成配置丢失,要永久保存 IPtables 规则可以使用 iptables-save 命令:
[root@localhost]# iptables-save > ~/iptables.rules
保存的名称大家可以自己改。
16、还原IPtables规则
有保存自然就对应有还原,大家可以使用 iptables-restore 命令还原已保存的规则:
[root@localhost]# iptables-restore < ~/iptables.rules
17、允许建立相关连接
随着网络流量的进出分离,要允许建立传入相关连接,可以使用如下规则: [root@localhost]# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 允许建立传出相关连接的规则: [root@localhost]# iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
18、丢弃无效数据包
很多网络攻击都会尝试用黑客自定义的非法数据包进行尝试,我们可以使用如下命令来丢弃无效数据包:
[root@localhost]# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
19、IPtables屏蔽邮件发送规则
如果你的系统不会用于邮件发送,我们可以在规则中屏蔽 SMTP 传出端口:
[root@localhost]# iptables -A OUTPUT -p tcp --dports 25,465,587 -j REJECT
20、阻止连接到某块网卡
如果你的系统有多块网卡,我们可以限制 IP 范围访问某块网卡:
[root@localhost]# iptables -A INPUT -i eth0 -s xxx.xxx.xxx.xxx -j DROP