一、什么是防火墙
防火墙就是通过定义一些有顺序的规则,并管理进入到网络内的主机数据数据包的一种机制,通俗的说就是分析与过滤进出我们主机(或者是我们所管理的网络)的数据包。
二、防火墙分类
防火墙分为:
- 硬件防火墙
- 软件防火墙
软件防火墙主要有:
- iptables
- TCP Wrappers
注:我们经常用的是iptables,而TCP Wrappers是可以根据服务名称进行过滤的,因此与启动的端口无关。他有一个重大的缺点,就是必须是xinetd所能管理到的服务。这里就不多做介绍,我们重点介绍一下iptables。
三、iptables的网络划分
这里介绍三种常用类型的网络划分(依据鸟哥的介绍)
1.第一种
2、第二中
3、第三种
这三种之所以说安全度递增,是因为第三种划分避免了防火墙的一种限制:防止从内部进行破坏安全度高的服务。
四、防火墙的使用限制
优点:
- 限制端口:拒绝让Internet的数据包进入主机的某些端口
- 限制源ip:拒绝让某些来源IP的数据包进入
- 限制特殊标签:拒绝让带有某些特殊标签(flag)的数据包进入,最常见的就是拒绝带有SYN的主动连接的标志。
- 限制MAC:分析硬件地址MAC来决定是否连接。
缺点
- 防火墙不能有效的阻挡病毒或木马程序
- 防火墙对于来自内部LAN的攻击无能为力
五、防火墙介绍
防火墙主要由四表五链组成,但是在鸟哥私房菜中只讲了三个表,而实际应用时只用到两个表。
四表
raw ------------追踪数据包, ----此表用处较少,可以忽略不计。
mangle ------------给数据包打标记,做标记。
nat ------------网络地址转换即来源与目的的IP地址和port的转换。
filter ------------做过滤的,防火墙里面用的最多的表。
五链
PREROUTING -----------------进路由之前数据包
INPUT -----------------就是过滤进来的数据包(输入)
FORWARD -----------------转发
OUTPUT -----------------发出去的数据包
POSTROUTING -----------------路由之后数据包
注:并不是每个表都有五条链,如下所示:
- Mangle:PREROUTING、FORWARD、POSTROUTING、INPUT、OUTPUT
- net:PREROUTING、POSTROUTING、OUTPUT
- filter:FORWARD、INPUT、OUTPUT
鸟哥在书中表示一个图特别清楚
常用的模型是去掉mangle之后的图形
六、介绍一下iptalbes常用的命令
1、查看规则
iptables [ -t tables ] -nL [ -v ] --line-numbers
参数介绍:
-t:后面接table,例如net或者filter,若不指明,默认是filter。
-L:列出目前防火墙的规则
-v:列出更多的信息,包括通过改规则的数据包总位数、相关的网络接口等
-n:不进行IP与hostname的反查,显示信息的数据会更快。
--line-numbers:显示序号
- target:代表操作,ACCEPT是放行,REJECT是拒绝,LOG是符合条件会打印日志到/var/log/messages中,LOG不常用。
- prot:代表协议,比如TCP、UDP、icmp等。
- opt:额外的说明
- source:代表此规则针对的源IP
- destination:代表此规则针对的目的IP
iptables-save [ -t table ]
参数说明:
-t:指定所要查看的表
2、清除规则
iptables [ -t tables ] [ -FXZ ]
参数与选项
-F:清除所有的已制订的规则
-X:清除所有用户“自定义”的chain(应该说是tables)
-Z:将所有的chain的计数与流量统计都归零
注:清除已有规则,不会改变默认策略。防火墙会从第一条到最后一条然后到默认规则依次进行匹配。所以防火墙的顺序非常重要,比如:
- 拒绝所有ip访问
- 同意192.168.91.4访问
如上的结果就是192.168.91.4无法访问主机,因为防火墙匹配第一条时就匹配到了,所以不会往下进行匹配。所以我们的drop规则都是放到最后。
3、定义默认策略
iptables [ -t nat ] -P [ INPUT,OUTPUT,FORWARD ] [ ACCEPT,DROP ]
4、插入数据
iptables [ -AI 链名 ] [ -io 网络接口 ] [ -p 协议 ] [ -s 来源ip/网络 ] [ -d 目标ip/网络 ] -j [ ACCEPT | DROP | REJECT | LOG ]
选项与参数:
-AI 链名:针对某条链进行规则的“插入”或者“累加”
-A :在该链规则的最后面添加一条规则。
-I :这是大写的i,默认在该链的第一条添加规则,原来的第一条变成第二条。
-io 网络接口:设置数据包进出的接口规范
-i :数据包所进入的那个网络接口,例如 eth0 、lo 等接口,需要与INPUT链配合
-o:数据包所传出的那个网络接口,需与 OUTPUT 链配合
-p 协议:设置此规则适用于那种数据包格式,如:tcp、udp、icmp及all
-s 来源ip/网络:可指定原ip或者网络
ip:192.168.9.100
网络:192.168.91.0/24、192.168.91.0/255.255.255.0 均可
-s ! 192.168.91.0/24 表示不接受 192.168.91.0/24 发来的数据包
-d 目标地址:同 -s 只是这里是目标ip
-j :后面接操作,主要操作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)以及记录(LOG)
范例1:设置 lo 成为受信任的设备,即进出 lo 的数据包都予以接受
iptables -A INPUT -i lo -j ACCEPT
范例1中并没有列出 -s、-d 等参数,这就表示:不论数据包来自何处或去到哪里,只要是来自 lo 这个接扣,就予以允许。
范例2:只要是来自内网(192.168.100.0/24)的数据包就全部接受
iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
范例3:想记录一下 (192.168.100.5)这台主机来访问的记录
iptables -A INPUT -s 192.168.100.5 -j LOG
范例3中如果192.168.100.5 这台主机来访问时就会在/var/log/messages中打印出对应的日志,然后该数据包会继续进行后续规则的对比。
范例4:想要连接进入本机 port 21 的数据包都丢弃。
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
范例4中,因为仅有TCP和UDP数据包具有端口,因此想要使用 -dport、sport 时,需要加上-p tcp 或 -p udp 的参数才会成功,如果只使用了–dport 而没有使用-p tcp,系统会报错。
范例5:只要来自 192.168.1.0/24 的 1024:65535 端口的数据包,且想要连接到本地的ssh port 就予以阻挡。
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP
范例6:将来自任何地方的来源port 1:1023主动连接到本机的1:1023连接丢弃
iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP
范例6中,Client端启动的port都大于1024,而server端启动的端口都小于1023,所以我们可以丢弃来自远程的小于1023的端口数据的主动连接,但不使用于FTP的主动连接中。
范例7:对多个连续的ip进行22端口的放行
iptables -A INPUT -m iprange --src-range 10.185.5.223-10.185.5.225 -p tcp --dport 22 -j ACCEPT
范例8:对多个ip进行设置
iptables -I INPUT -s 172.24.129.113 -p tcp -m multiport --dports 8030:8033,8088,8040 -j ACCEPT
5、state 和 mac 模块
iptables -A INPUT [ -m state ] [ --state 状态 ]
选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
state:状态模块
mac :网卡硬件地址(hardware address)
-state :一些数据包的状态,主要有:
INVALID:无效的数据包,例如数据破损的数据包状态
ESTABLISHED:已经连接成功的连接状态
NEW:想要新建立的数据包状态
RELATED:这个最常用、表示这个数据包是与主机发送出去的数据包有关
iptables可以通过一个状态模块来分析这个想要进入的数据包是否为刚刚发出去的响应,如果是刚刚发出去的响应,那么就可以予以接收放行。
范例9:只要已建立连接或与已发出请求相关的数据包就予以通过,不合法数据包就丢弃
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A input -m state --state INVALID -j DROP
范例10:针对局域网内的 aa:bb:cc:dd:ee:ff 主机开放其连接
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
范例11:查看自己mac地址
ip link show
ip address show
ifconfig -a
范例12:查看对方mac地址
需要对方和自己建立通信,比如ping一下
arp -a
cat /proc/net/arp
范例12中的两条命令都能看到对方mac地址,你不要问,为什么ping百度以后,看不到百度的mac。
ICMP数据包规则的对比:针对是否相应ping来设计
iptables -A INPUT [ -p icmp ] [ --icmp-type 类型 ] -j ACCEPT
选项与参数:
--icmp-type:后面必须接ICMP的数据包类型,也可以使用代号,
范例13:让0、3、4、11、12、14、16、18 的 ICMP type 可以进入本机:
vi somefile
#!/bin/bash
icmp_type="0 3 11 12 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -p icmp --icmp-type $typeicmp -j ACCEPT
done
sh somefile
6、保存设置
范例14:保存规则的两条命令
service iptables save
iptables-save > /etc/sysconfig/iptalbes
范例15:清空规则,如何恢复之前备份好的规则
备份规则:
iptables-save > a.txt
恢复规则:
iptables-restore < a.txt
范例16:记录规则的文件
/etc/sysconfig/iptalbes-config
/etc/sysconfig/iptables
七、iptables的网络地址转换(net)功能
net表有三条链:PREROUTING、POSTROUTING、OUTPUT。重点在于PREROUTING、POSTROUTING这两条,PREROUTING这一条是进路由之前,POSTROUTING这一条是路由之后
链名 | 中文名 | 作用 |
---|---|---|
PREROUTING | 路由之前 | 修改目标地址 |
PREROUTING | 路由之后 | 修改原地址 |
1、出包示意图
如图:192.168.1.100这台主机发的包,经过iptables变成了公网地址。这样就可以实现iptables的ip分享功能,分享就是同一个公网ip
2、收包示意图
如图:从公网传过来的命名是公网的ip,怎么到我电脑上就变成了私网IP呢,这就是iptables的net功能
3、传包示意图
1、收到包以后转到192.168.100.10
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10
2、80端口转到8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DANT --to-ports 8080
3、对外的 IP 固定为 192.168.1.100
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.100
4、对外的 IP 固定为 192.168.1.210~192.168.1.220,轮流使用
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.210-192.168.1.220
8、在最后我稍微介绍一个IPv4的内核管理功能
除了iptables可以阻挡网络攻击外,linux内核也有默认的阻挡机制。
1、/proc/net/ipv4/tcp_syncookies
这个文件是问了阻挡一种阻断式服务(DoS)攻击的,这种攻击是利用TCP数据包的SYN三次握手原理实现的,这种方式成为SYN Flooding。这个方法可以降低SYN等待端口,避免SYN Flooding的DoS攻击。那么如何开启这个模块?可以这样做:
[root@slave1 ~]# echo "1" > /proc/sys/net/ipv4/tcp_syncookies
2、/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
从名字中可以看出来这是忽略icmp也就是ping包用的,当有人用多台主机去ping你的服务器以后,你的带宽就是被占用,从而达到攻击的效果,这种攻击称为ping flooding。
内核取消ping回应的的设置有两个,分别是/proc/sys/net/ipv4内的icmp_echo_ignore_brocadcasts(仅有ping brocadcast地址时台取消ping的回应)以及icmp_echo_ignore_all(全部的ping都不回应),开启方法:
[root@slave1 ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
3、/proc/sys/net/ipv4/conf/网络接口/*
linux的内核还可以真对不同的网络接口进行不一样的参数设置。网络接口的相关设置放在/proc/sys/net/ipv4/conf/中,每个接口都以以借口代号作为其代表,例如:ech0接口的相关配置放在/proc/sys/net/ipv4/conf/ech0下。那么网络接口的设置数据有哪些需要注意的呢?
- rp_filter:称为逆向路径过滤(Reverse Path Filtering),可以通过分析网络接口的路由信息,配合数据包的来源地址,来分析该数据包是否合理。举例说明:你有两张网卡,eth0为192.168.1.10/24,eth1为public IP。那么当有一个数据包自称来自eth1,但是其IP为192.168.1.200,那么这个数据包就不合理,应予以丢弃。这个功能建议开启。
- log_martians:这个设置数据可以用来启动记录不合法的IP来源功能,举例说明:包括0.0.0.0、127.x.x.x、以及Class E的IP都是不合法的,因为这些IP就不应该出现在Internet当中。记录的数据默认放置的日志/var/log/messages。
- accept_source_route:或许某些路由器会启动这个设置值,不过目前的设备很少使用到这种来源路由,可以取消这个设置值。
- accept_redirects:当你在同一个实体网域内架设一部路由器, 但
这个实体网域有两个 IP 网域,例如 192.168.0.0/24, 192.168.1.0/24。
此时你的 192.168.0.100 想要向 192.168.1.100 传送讯息时,路由器可
能会传送一个 ICMP redirect 封包告知 192.168.0.100 直接传送数据
给 192.168.1.100 即可,而不需透过路由器。因为 192.168.0.100 与
192.168.1.100 确实是在同一个实体线路上 (两者可以直接互通),所以
路由器会告知来源 IP 使用最短路径去传递数据。但那两部主机在不同的
IP 段,却是无法实际传递讯息的!这个设定也可能会产生一些轻微的安
全风险,所以建议关闭他。 - send_redirects:与上一个类似,只是此值为发送一个 ICMP
redirect 封包。 同样建议关闭。
虽然你可以使用『 echo “1” > /proc/sys/net/ipv4/conf/???/rp_filter 』之
类的方法来启动这个项目,不过, 建议修改系统设定值,那就是
/etc/sysctl.conf 这个档案!假设我们仅有 eth0 这个以太接口,而且上述的
功能要通通启动, 那你可以这样做:
[root@www ~]# vim /etc/sysctl.conf
# Adding by VBird 2011/01/28
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
....(以下省略)....
[root@www ~]# sysctl -p