一、防火墙优缺点
1、优点
拒絕讓 Internet 的封包進入主機的某些埠口
拒絕讓某些來源 IP 的封包進入
拒絕讓帶有某些特殊旗標 (flag) 的封包進入
分析硬體位址 (MAC) 來決定連線與否
2、缺点
防火牆並不能很有效的抵擋病毒或木馬程式
防火牆對於來自內部 LAN 的攻擊較無承受力
二、封包进入防火墙的流程:规则顺序的重要性!
『规则是有顺序的』!
当数据包进入Rule1的比对时,如果比对结果符合Rule1,此时这个数据包就会进行Action1的动作,而不会理会后续的Rule2,Rule3...等规则的分析了
如果這個数据包并不符合Rule1的比对,那就会进入Rule2的比对了!如此一个一个规则去进行比对就是了
那如果所有的规则都不符合怎么办?此时就会透过预设动作(封包政策Policy)来决定这个数据包的去向。所以当你的规则顺序排列错误时,就会产生很严重的错误了
下面我们来举例说明一下:
假如你的Linux主机提供了WWW服務,那么自然就要对80端口启用通过的规则;
但是你发现IP为192.168.100.100老是恶意尝试入侵你的系统,所以你想要将改IP拒绝;
最后所有的非WWW的数据包都拒绝,就这三个规则来说,你要如何设定防火墙检验顺序呢?
Rule1先抵擋192.168.100.100
Rule2再讓要求WWW服務的封包通過
Rule3將所有的封包丟棄
這樣的排列順序就能符合你的需求,不過萬一你的順序排錯了,變成:
Rule1先讓要求 WWW 服務的封包通過
Rule2再抵擋192.168.100.100
Rule3將所有的封包丟棄
此時,192.168.100.100 可以使用你的 WWW 服務!只要他對你的主機送出 WWW 要求封包,就可以使用你的 WWW 功能了,因為你的規則順序定義第一條就會讓他通過,而不去考慮第二條規則!
三、iptables的表(table)与链(chain)
Linux的iptables至少就有三个表格,包括管理本机进出的filter、管理后端主机的nat、管理特殊旗标的mangle(较少使用)
filter(过滤器):主要跟进入Linux本机的封包有关,这个是预设的table,此表包含以下3个链
INPUT:主要与想要进入我们 Linux 本机的封包有关
OUTPUT:主要与我们 Linux 本机所要送出的封包有关
FORWARD:此表与Linux本机没什么关系,他可以『转递封包』到后端的电脑,与下列nat表相关性较高
nat(地址转换):此表主要在进行来源与目的之间IP或port的转换,与Linux本机较无关,主要与Linux主机后面的区域网络內主机有关
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT:与发送出去的封包有关
mangle(破坏者):此表主要是与特殊的封包的路由旗标有关,早期仅有PREROUTING及OUTPUT链,kernel2.4.18之后加入了INPUT及FORWARD链,此表较少用到
各个表的链之间是有关系的,如下图
由上图可以看出,iptables可以控制三种封包的流向
1、封包进入Linux主机使用资源(路径A):在路由判断后确定是向Linux主机请求资料的封包,就会透过filter的INPUT链来进行控管
2、封包经由Linux主机的转递,没有使用主机资源,而是向后端主机流动(路径B):在路由判断之前进行封包表头的修订作业后,发现到封包主要是要透过防火墙而去后端,此时封包就会透过路径B来跑动,也就是说该封包的目标并非Linux本机,主要经过的链是filter的FORWARD以及nat的POSTROUTING、PREROUTING
3、封包由Linux本机发送出去(路径C):例如回应客户端的请求,或者是Linux本机主动送出的封包,都是透过路径C来跑的。先是透过路由判斷,决定了输出的路径后,再透过filter的OUTPUT链来传送的!当然,最终还是会经过nat的POSTROUTING链
-------------由于mangle這個表很少被使用,如果将图9.3-3的mangle拿掉的话,那就容易看多了-------------
透过图9.3-4可以了解到,事实上与本机最有关的其实是filter表内的INPUT与OUTPUT这两条链,如果你的iptables只是用来保护Linux主机本身那nat的规则根本就不需要理他,直接设定为开放即可
不过如果你的防火墙也用来管制LAN內的其他主机的话,你就必须要再针对filter的FORWARD链,還有nat的PREROUTING, POSTROUTING以及OUTPUT进行额外的规则设定才行,建议新手慎重
四、iptables语法
1、规则的观察与清除
(1)iptables -L -n --line-number 查看filter表的所有规则,以格式化的形式查看
(2)iptables-save 也是查看filter表的所有规则,只不过是以更详细的语句形式查看
(3)iptables [-t tables] [-FXZ]
iptables -F 清除所有已定义的規則
iptables -X 杀掉所有使用者"自定义"的chain(链),(这里要指定tables,不指定就是默认的filter)
iptables -Z 将所有的chain的计数与流量都归零
上面三条命令会把本机防火墙的所有规则都清除,但不会改变预设政策(policy),所以如果你不是在本机执行这三行命令,很可能会被自己挡在门外(若INPUT为DROP时),一定要小心谨慎!!
2、定义预设政策(policy)
iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
-P :定义政策(Policy),注意这个P是大写的
ACCEPT :该封包可接受
DROP :该封包直接丢弃,不会让client端知道为何被丢弃
iptables -P INPUT DROP 定义INPUT链的政策为DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
3、封包的基础比对:IP,网段及网卡裝置
iptables [-AI 链名] [-io 网卡] [-p 协议] [-s 来源IP/网段] [-d 目标IP/网段] -j [ACCEPT|DROP|REJECT|LOG]
-AI 链名:针对某个链进行规则的"插入"或"累加"
-A:新增一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,使用-A就可以加上第五条规则
-I:插入一条规则,如果沒有指定此规则的顺序,默认是插入变成第一条规则。例如原本有四条规则,使用-I则该规则会变成第一条,而原本四条的序号变成2-5
链:有INPUT, OUTPUT, FORWARD等,链名与-io有关,请往下看
-io 网卡:设定封包进出的网卡
-i:封包所进入的那个网卡,例如eth0,lo等网卡。需与INPUT链配合
-o:封包所传出的那个网卡,需与OUTPUT链配合;
-p 协议:设定此规则适用于哪种封包格式
主要的封包格式有:tcp,udp,icmp及all
-s 来源IP/网段:设定此规则之封包的来源,可指定IP或网段,例如:
IP:192.168.0.100
网段:192.168.0.0/24,192.168.0.0/255.255.255.0均可
若为『不允许』时,则加上!即可,例如:-s ! 192.168.100.0/24表示不允许192.168.100.0/24的封包来源;
-d 目标IP/网段:同-s ,只不过这里指的是目标IP或网段
-j 后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)、记录(LOG)
举例:iptables -A INPUT -i lo -j ACCEPT 设定lo成为受信任的网卡,亦即进出lo的封包都予以接受,lo就是本机回环网卡
举例:iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT 只要是来自内网(192.168.100.0/24)的封包通通允许通过eth1网卡
举例:iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT 只要是来自192.168.100.10就接受
举例:iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP 来自192.168.100.230则拒绝
iptables-save > /etc/sysconfig/iptables 保存配置并重启防火墙使其生效,重启防火墙命令systemctl restart iptables
4、TCP,UDP的规则比对:针对端口设定
iptables [-AI 链] [-io 网卡] [-p tcp,udp] [-s 来源IP/网段] [--sport 源端口范围] [-d 目标IP/网段] [--dport 目标端口范围] -j [ACCEPT|DROP|REJECT]
举例:iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP 想要进入本机21端口的封包都抵挡掉
举例:iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT 想要进入本机upd 137,138端口的封包就放行
举例:iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT 想要进入本机TCP 139端口的封包就放行
举例:iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport 22 -j DROP 只要来自192.168.1.0/24的1024:65535端口的封包,且想要连线到本机22端口就予以抵挡掉
举例:iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP 将来自任何地方源端口1:1023的封包且想要进入到本机1:1023的连线都丢弃
5、iptables外挂模块:mac与state
iptables -A INPUT [-m state] [--state 状态]
-m :一些iptables的外挂模块,主要有:
state :状态模块
mac :Mac地址
--state :一些封包的状态,主要有:
INVALID :无效的封包,例如资料破损的封包状态
ESTABLISHED:已经连线成功的连线状态
NEW :想要新建立连线的封包状态
RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关
举例:iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 只要已建立或相关封包就予以通过
举例:iptables -A INPUT -m state --state INVALID -j DROP 只要是不合法封包就丢弃
举例:iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT 针对局域网內Mac地址为aa:bb:cc:dd:ee:ff的主机予以开放
6、ICMP封包规则的比对:针对是否回应ping来设计
ICMP的类型有很多,而且很多ICMP封包的类型都是为了要用来进行网络检测用的!所以最好不要把所有的ICMP封包都丢弃!
如果不是做为路由器的主机时,通常我们会把ICMP type 8(echo request)拿掉而已,让远端主机不知道我们是否存在,也不会接受ping的回应就是了。
ICMP封包格式的处理是这样的:
iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
选项与参数:
--icmp-type :后面必须要接ICMP的封包类型,也可以使用代号,
例如8代表 echo request的意思
举例:让0,3,4,11,12,14,16,18的ICMP type可以进入本机:
[root@www ~]# vi somefile
#!/bin/bash
icmp_type="0 3 4 11 12 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done
[root@www ~]# sh somefile