防火墙是设在不同网络或网络安全域之间的一系列部件的组合。它能增强机构内部网络的安全性,它通过访问控制机制,确定哪些内部服务允许外部访问,它可以根据网络传输类型决定ip包是否可以传进或传出内部网络。
访火墙通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规的先后顺序进行一一比较,直到满足其中一条规则为止,然后依据控制机制做出相应的动作,如果都不满足,则将数据包丢弃,从而保护网络的安全。
防火墙是工作在主机和网络的边缘。
防火墙机制
一种机制是拦阻传输流通行。
一种机制是允许传输流通行。
一些防火墙偏重拦阻传输流的通行,而另一种防火墙偏重允许传输流通行,
防火墙实现功能。
可以保护易受攻击的服务
控制内外网之间网络系统的访问。
集中管理内网的安全性,降低管理成本。
提高网络的保密性和私有性。
记录网络的使用状态,为安全规划和网络维护提供依据。
防火墙----过滤器
netfilter/iptables 分别是内核态模块和用户态工具。netfilter位于linux内核的包过滤功能的体系,iptables为于/sbin/iptables ,用来管理防火墙的工具,管理员通过iptables 给netfilter变更规则实现防火作用。
kernel2.0.x ipfw ipfwadmin
kernel2.2.x ipchains ipchains
kernel2.4.x netfilter iptables
kernetl3.13.x firewall nftables>iptables
tcp数据包结构
mangle表,是标记这个数据包是干什么用的。链是包含在表中的
语法的构成。
iptables [-t 表名] 选项 [链名] [条件] [-j控制类型]
几个注意事项
不指定表名时,默认指filter表。
不指定链名时,默认指定表内的所有链。
除非设置链的默认策略,否则必须指定匹配条件。
选项、链名、控制类型使用大写字母,其余均为小写字母。
保存和恢复防火墙。
防火墙只在计算机开启的状态的下生效,如果系统被重新引导,这些规则就会被自动清除并重设,要保存规则请使用以下命令。
sbin/service iptables save。
保存在/etc/sysconfig/iptables 中的规则会在服务启动和重新启动时(包括机器被重新引导时)被应用。
[ sysconfig]# cat iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
数据包的常见控制类型。
ACCEPT 允许通过
DROP 直接丢弃不给出任何回应。
REJECT 拒绝通过,必要时会给出提示。
LOG 记录日志信息,然后传给下一条规则继续匹配。
添加的新的规则。
-A: 链的末尾追加一条规则,
-I: 在链的开头(或指定序号)插入一条规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
表名为filter,协议tcp,ACCEPT允许通过,-A在链的末尾追加一条规则,INPUT入站。
iptables -t filter -I INPUT -p icmp -j ACCEPT
iptables -t filter -I INPUT 3 -p tcp -j ACCEPT
查看规则列表
-L: 列出所有规则列表。
-n: 以数字形式显示地址,端口等信息。
-v: 以更详细的方式显示规则信息。
--line-numbers: 查看规则时,显示规则的序号。
iptables -L --line-numbers
iptables | 选项 | 说明 | |
| -L | 查看filter表的iptables规则,包括所有的链 | iptables -L |
| -L [-t 表名] | 只查看某个表中的规则, 表名一共有三个:filter,nat,mangle,如果没有指定表名,则默认查看filter表的规则, iptables -L -t filter | iptables -L nat |
| -L [-t 表名] [链名] | 这里多了个链名,就是规则链的名称。 | iptables -L INPUT |
| -n -L | 以数字形式显示规则。如果没有-n,规则中可能会出现anywhere,有了-n,它会变成0.0.0.0/0 | |
| -nv -L | 你也可以使用“iptables -L -nv”来查看,这个列表看起来更详细,对技术人员更友好,呵呵。 | |
| iptables -nL --line-numbers | 显示规则的行号,使用操作。 | |
| -A | 在链的末尾追加一条规则。 | |
| -I | 在链的开头(或指定序号)插入一条规 | |
| -t | 指定表名 | |
| -p | 指定协议 | |
| -j | 指定操作类型,如ACCEPT、DROP、REJECT、LOG | |
| -D | 删除链内指定的序号 | iptables -D INPUT 2 iptables -n -L INPUT 3 |
| -P | 为指定的链设置默认规则 | |
A网络发出来的数据,首先匹配(raw、mangle、nat)表的PREROUTING(在路由选择前处理数据包),三个表的PREROUTING都匹配上了,就到路由了,路由选择有两种,一种是直接扔给本机,不经过路由。在主机这前有一个input规则(mangle、filter有input)的防火墙,对应的mangle和filter表就会写两个inpu规则。如果这两条规则都匹配成功,就可以进入主机进程。如果有一个input是拒绝的就进不去。成功进入进程处理完毕数据要返回,先要从主机里出来,output(raw、mangle、nat、filter都有)会顺序匹配这4个表里的output规则。如果匹配成功直接把回A网络
匹配(raw、mangle、nat)表的PREROUTING(在路由选择前处理数据包),三个表的PREROUTING都匹配上了,就到路由了,但是他的ip地址不是本机的,那就要进行一次路由转发,就要匹本FORWARD(mangle、filter表里有)规则,如果匹配上FORWARD规则,那么重新打个包转发,如果没匹配上直接丢弃或者拒绝。路由后的操作就是POSTROUTING(mangle nat),如果匹成功就发往B网络。
同一网段之间发送数据,如A主机发送数据到B主机,只要匹配A主机的出站防火墙和B主机的入站防火墙就行了,不用过路由。
防火墙放置的地方,一般有这么几个地方。单台主机边缘位置,有入站出站的限制,同时也可以做为出来后路由前路由后的规则限制。一般做为路由前。局域网边缘的防火墙限制。
四表五链:4表,raw、mangle、nat、filter。五链,input、output、forward、postrouting、prerouting。
控制类型:
ACCEPT 接受
DROP 丢弃
REJECT 拒绝
LOG 日志
REDIRECE 重定向
设置默认策略:-P 为指定的链设置默认规则。
iptables -t filter -P FORWARD DROP 所有的路由转发全拒绝。
iptables -t filter -P OUTPUT ACCEPT 所有的出站都允许。
默认规则是不显示的。
[ ~]# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
470 33724 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ssh
285 30183 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited
0 0 ACCEPT udp -- any any anywhere anywhere
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 32 packets, 3744 bytes)
pkts bytes target prot opt in out source destination
防火墙规则/语法
iptables -t 表名 参数(-A、-I) 链名 -p 协议 -j 动作(ACCEPT、DROP等)
注意事项:不指定表名时,默认的是filter表。
不指定链名时,表中所有的链都写
除非有默认的规则,要不然必须写指定的规则。
选项、链名、控制类型这三类都必须大写。
添加规则:
-A 添加规则到尾部。
-I 添加规则到头部,指定序号添加在指定位置。
删除规则:
-D 删除指定规则
-F 清空防火墙列表。
-P 设置默认规则
-X 清空自定义规则
显示规则:
-L 显示所有
-v 显示详细信息
--line-number 显示规则的序号
-n 以数字形式显示地址、端口等信息。
条件匹配
1、通用匹配
可直接使用,不依赖其他条件或扩展,包括网络协议、ip地址、网络接口等条件。
2、隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。
3、显式匹配
要求以"-m扩展模块"的开式明确指出类型,包括多端口、MAC地址、ip范围、数据包状态等条件。
觉的通用匹配条件。
协议匹配:-p协议名。
地址匹配:-s源地址,-d 目的地址。
接口区配:-i入站网卡,-o是出站网卡。
iptables -I INPUT -s 192.168.10.197 -j DROP
原地址为192.168.10.197的数据包全部丢弃
iptables -I INPUT -s 192.168.10.197 -j REJECT
允许接收数据包但是拒绝返回
iptables -I INPUT -d 192.168.10.150 -j REJECT
[ ~]# ping 192.168.10.150
PING 192.168.10.150 (192.168.10.150) 56(84) bytes of data.
From 192.168.10.150 icmp_seq=1 Destination Port Unreachable
From 192.168.10.150 icmp_seq=2 Destination Port Unreachable
拒绝返回。
iptables -A INPUT -i eth0 -j DROP 拒绝访问eth0网卡。
[ ~]# iptables -A INPUT -i lo -j DROP
[ ~]# ping 192.168.10.150
PING 192.168.10.150 (192.168.10.150) 56(84) bytes of data.
自己ping不通自己了。
[ ~]# iptables -I INPUT -i lo -j ACCEPT
[ ~]# ping 192.168.10.150
PING 192.168.10.150 (192.168.10.150) 56(84) bytes of data.
64 bytes from 192.168.10.150: icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from 192.168.10.150: icmp_seq=2 ttl=64 time=0.061 ms
放行了。
iptables -A INPUT ! -s 192.168.10.200 -j DROP !取反的意思,就是除了192.168.10.200其他所有地址都丢弃。
隐含匹配
常用隐含匹配条件:--sport源端口,--dport目的端口。
ICMP匹配类型:--icmp-type ICMP类型。
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 20:21 -j DROP 20和21是两个连续的端口就用:号隔开,
iptables -A INPUT -p tcp --dport 80,23 -j DROP 80和23是两个不连续的端口就用,号隔开。
8 别人给发送的请求拒绝掉。
0 我给别人发送的允许
3 接受别人的确认包(回显)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
常用的显式匹配条件
多端口匹配:-m multiport --sport源端口列表。
-m multiport --dport目的端口列表。
ip范围匹配:-m iprange --src-range ip范围
MAC地址匹配: -m mac -macl -source MAC地址
状态匹配: -m state --state连接状态。
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP 禁止访问22、80端口。
iptables -A INPUT -p tcp -m iprange --src-range 192.168.10.196-192.168.10.198 -j DROP
iptables -A INPUT -m mac --mac-source 00:0c:29:41:65:19 -j DROP
NEW接受第一次数据包的时候
ESTABLISHED 后来再接受数据包
RELATED 一直处于连接,又建立了另外一个边接FTP两个端口有关系。
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
显示匹配条件
多端口:-m multiport --sport (--dport)源端口和目标端口列表。
ip范围:-m iprange --src-iprange ip范围。
MAC地址:-m mac --mac-source MAC地址
连接状态: -m state --state 状态类型(NWE,ESTABLISHED,RELATED)
局域网共享上网
DNAT策略
局域网的web服务器能够访问internet
网关的外网ip地址有正确的DNS解析记录。
linux网关支持Ip路由转发。
实现方法
编写DNAT转换规则。
iptables -t nat -A PREROUTINTG -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
PREROUTING入站之前,eth0网卡,目标地址218.29.30.31,更换目标地址为192.168.1.6
发布时修改目标端口
在DNAT规则中以"ip port "形式指定目标地址
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.21 -p tcp -dport 2346 -j DNAT --to-destination 192.168.1.6:22
目标地址218.29.30.31,目标端口2346映射为内网服务器ip,192.168.1.6:22
防火墙脚本
导出备份脚本
iptables-save工具
可结合重定向输出保存到指定文件
[ ~]# iptables-save >1.ipt
[ ~]# ls
1.ipt anaconda-ks.cfg install.log install.log.syslog nagios安装包
[ ~]# cat 1.ipt
# Generated by iptables-save v1.4.7 on Tue Mar 13 13:03:36 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2946:249142]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Mar 13 13:03:36 2018
导入还原规则
iptables-restore工具
可结合重定向输入指定规则来源
iptables-restore < 1.ipt
iptables服务
脚本位置:/etc/init.d/iptables
规则文件位置:/etc/sysconfig/iptables
定义变量
加载必要的内核模块
修改配置参数调优
定义具体的防火墙规则,最好先清空原先的规则。