防火墙的作用:过虑两个网络之间的数据包 Linux内核的Netfilter 进出数据包,以及发送到本机的数据包都要经过内核的处理 INPUT链用来过滤进入本机的数据包 OUTPUT链用来过滤从本机发送出去的数据包 FORWARD链用来过滤从本机路由出去的数据包 一个数据包的头部包括源地址、源端口、目的地址、目的端口、协议类型 包过滤正是根据这些特征来过滤数据包 Linux 下通过在三个链中设置规则来过滤 包的处理方式 #iptables -A INPUT -p icmp -j DROP 将进入本机,协议类型为icmp的数据包丢弃。 -A 添加规则 INPUT 对INPUT链进行操作 -p 协议类型 -j 指定动作,可以是ACCEPT(接收),LOG(日志),REJECT(弹回) #iptables -L -n 显示三条链的过滤规则 -L 显示所有链的所有规则 -n 以数字形式显示 #iptables -F 清空所有链的所有规则 每个包进入本机时都被INPUT链检查 出去时经过OUTPUT链检查 转发时经过FORWARD检查 TCP/IP是双向通信的,所以添加规则时必须注意使INPUT链和OUTPUT链的规则对应。 -D rulenum 删除第几条规则 -I rulenum 在第几条前插入规则 -P 修改链的默认策略,如默认状态ACCEPT,默认情况下数据包的处理方式 -s 源地址 -m 匹配扩展条件 -d 目的地址 -t 维护的表,默认为filter,另外还有一个nat表 --line-numbers 规则中显示编号 #iptables -L -n --line-numbers 这样方便删除指定行编号的规则或在指定编号前插入 拒绝所有连接到本机21端口的所有连接 #iptables -A INPUT -P tcp -d 192.168.0.22 --dport 22 -j DROP --dport 目的端口 --sport 源端口 在实际使用过程中服务器还不够严密,还存在被利用的弱点。如22端口,为防止没有请求过的包,在本机主动发送出去,需要检查包的状态。看包是否是人家请求过我,而我回应别人的。Linux的防火墙支持状态匹配检查。 #iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT -m 匹配状态,上面表示跟本机连接过的包才能从22端口出去 如果正在使用ssh远程管理服务器,不要将第一条的22端口规则删掉,等添加完上面这条规则,才能把存在弱点的第一条删除,否则远程管理会立刻断掉。 80端口也同样设置 #iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 防止服务器在80端口主动发送请求,防止病毒利用。添加完后,删除OUTPUT中以前添加的那条80端口规则。 假设自己是ssh客户机,访问别人的ssh服务器,先经过OUTPUT链出去 #iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT 当包回就,从对方22端口,如果对方有病毒,可能会使用22端口发送请求,所以只接受已建立连接的数据包。 #iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT #service iptables save 保存劳动成果 现在防火墙算配好了,不仅非常严密,还非常有效,有效防止别人攻击你的服务器的各种服务,可防止主动型的病毒或木马攻击。 LOG目标 过滤包的检查机制,可以指定某种要求的包写入日志中。 #iptables -A INPUT -p tcp --dport 22 -j LOG --log-level 5 --log-prefix “IPTABLES:” -j LOG 记录日志 --log-level 5 写入日志时需指定级别,与日志服务器配合使用 --log-prefix “IPTABLES:” 指定写入日志时,记录的前缀字符,主要方便用户分析日志。 添加LOG目标规则时,保证规则前同样的包没有被丢弃或接受,即要注意添加规则的次序。 编缉日志配置文件/etc/syslog.conf 添加: kern.=notice /var/log/firewall.log (消息来源内核kern,级别notice),将内核这个级别消息,记录到firewall.log文件中,等号表示刚好等于这个级别的消息。为什么是notice?因为我们曾经用man syslog知道消息的默认级别notice为5,与LOG目标一致。 注意:日志级别5要跟syslog.conf中的级别一致,级别可通过syslog的manual帮助获得。 #service syslog restart #tail /var/log/firewall.log 注意将前面在/etc/syslog.conf文件添加过的 *.* @192.168.0.22 那行删除,还要将/etc/sysconfig/syslog文件中,那行还原为: SYSLOGD_OPTIONS=”-m 0” 不管哪个服务,修改过配置文件,要立刻生效,必须重启服务。 这样会将进入本机22端口的包记录在firewall.log文件,当使用ssh持续登录使用时,由于不停记录包信息,firewall.log文件会持续增大! 实际配置防火墙时,首先将所有门都关闭,如将三条链的默认策略都改为DROP,再根据服务器需要一个端口一个端口地打开。首先需要分析这台服务器是干什么用的,假设只是一台提供http服务的Web服务器。 首先把服务器所有端口关闭,为了方便远程管理开一个22的端口,端口可以在/etc/services文件中查看。添加规则时分析一下数据包的格式,再确定规则参数。 #iptables -A INPUT -p tcp -d 192.168.0.22 --dport 22 -j ACCEPT #iptables -A OUTPUT -p tcp -s 192.168.0.22 --sport 22 -j ACCEPT 注意通信的双向性,在INPUT添加一条规则,一般要在OUTPUT添加一条与之对应,所谓有出必有入。 #iptables -P INPUT DROP #iptables -P OUTPUT DROP #iptables -p FORWARD DROP 上面首先打开22端口,防止正在使用的远程管理断掉,再改变三条链的默认策略。 #iptables -A INPUT -p tcp --dport 80 -j ACCEPT #iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT 打开一个80端口,本机地址可省略 #service iptables save 保存劳动成果(保存规则) 将刚才添加的规则保存到/etc/sysconfig/iptables文件 或使用#iptables-save > /etc/sysconfig/iptables 系统启动时会加载这个文件中的规则。 现在服务器挡住所有服务,只开了两个端口80,22,对一台网络服务器来说,绝不能缺少DNS服务,任何联网的主机都需要做DNS请求,目前这台服务器还无法发送DNS请求。增加一条DNS通道,首先作为一台客户机出现: #iptables -A OUTPUT -p udp --dpott 53 -j ACCEPT 首先经过OUTPUT链 #iptables -A INPUT -p udp --sport 53 -j ACCEPT 请求后得到回复数据雹,允许进入 测试#host fedora.cyrich.com 如出现无法解析,或很慢,则#more /etc/resolv.conf查看域名解析配置文件,看是否本机为DNS服务器,如果是还需添加一条规则,在规则时,应该分析这个数据包如何进出哪条链,以及这人数据包的格式,如上面#host fedora.cyrich.com因为本身作为DNS服务器,所以会发送一个包到自己, 192.168.0.22:*――>102.168.0.22:53 (允许) 但当时入INPUT链时,没有一条跟它匹配,所以会拒绝。所以如果同时作为DNS服务器和客户机,还需添加下面规则: #iptables -A INPUT -p udp --dport 53 -j ACCEPT #iptables -A OUTPUT -p udp --sport 53 -j ACCEPT 当同时作为某种服务的服务端和客户端时,需在规则中添加两条规则,即源端口和目标端口。 当前的规则设置忽略了本机的内部服务,在本机上有很多端口守护在127.0.0.1上,当本机的客户端访问回环设备时会拒绝。 127.0.0.1上的服务如不打开,会影响本机内部服务的正常运行,打开了也不会造成服务器什么危害,所以还是最好打开: #iptables -A INPUT -s 127.0.0.1 -j ACCEPT #iptables -A INPUT -d 127.0.0.1 -j ACCEPT #service iptables save (保存劳动成果) 经过FORWARD链的数据包不是发送给本机,而是发送给别人的,当作为路由器使用时才需配置FORWARD链。现配置一台路由器,如允许局域网用户浏览网页配置方法与INPUT.OUTPUT一样。 #iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT 允许局域网发送数据包 #iptables -A FORWARD -d 10.0.0.0/24 -j ACCEPT 允许局域网接收数据包 这样相当于把局域网和互联网打通了,任何包都可通过,在实际使用中可以加上端口,做些限制,过滤某些数据包,也可以使用LOG目标加进日志。其实光打开FORWARD链还不行,还需要打开内核的转发文件。 #echo 1 >/proc/sys/net/ipv4/ip_forward (默认为0) 0表示关闭转发,1为启用,要永久启用,可修改配置文件/etc/sysctl.conf: net.ipv4.ip_forward =1 如需访问互联网,这样的配置还不行,因为私有地址是无法直接访问互联网的,这里我们做NAT网络地址转换,这时网需两个地址,一个局域网的,一个互联网的,当收到访问互联网的包时,将源地址替换为互联网地址。 #iptables -t nat -L -n 查看nat表内容 Netfilter的NAT表: 三条链用来做包过滤 用来翻译地址的也有三条链,常用的有PREROUTING,POSTROUTING SNAT(源地址翻译) 数据包进入内核前,首先进入PREROUTING这个点,然后进入内核进行处理,就是ROUTING那个点,如果数据包不是发送给本机,而内核启用了转发功能,则内核将把数据包从FORWARD,再到POSTROUTING。如果FORWARD允许数据包通过,这个包可以在POSTROUTING这个点上做源地址替换,而且只能在这个点上做,这是内核的一种机制,所以数据包的源地址是在经过POSTROUTING这个点后改变的。 DNAT(目标地址翻译) 数据包进入时,首先进入PREROUTING。然后内核ROUTING会根据包的目标地址决定是从INPUT链走还是FORWARD链走。所以数据包的目标地址非常重要。在PREROUTING上可以做目标地址替换。 SNAT应用 网关有两块网卡分别连接两台主机或两个网络。 #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.0.254 将源地址为10.0.0.0/24的包的源地址替换为192.168.0.254,如果这是一台ADSL拨号网关,可以将整个局域网带进互联网 #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE 有人会想数据包怎么回来?其实将数据包翻译成192.168.0.254源地址时,192.168.0.1回应一个数据包到服务器会被服务器认出来,那服务器会自动将翻译地址还原,然后退还给10.0.0.241。所以做网关时,只要加SNAT,然后配合前面的过滤规则就可配一个安全且强大的防火墙,同时具有路由器的功能。 DNAT应用 DNAT应用一般用来做DMZ,保护局域网内部 如192.168.0.1作为一台Web服务器,主机10.0.0.241访问10.0.0.254网关,网关将请求发送到192.168.0.1,这样就起到保护Web服务器的作用 #iptables -t nat -A PREROUTING -d 10.0.0.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1 将访问网关80端口的数据包目标地址翻译或192.168.0.1,这样本来发送给本机的数据包就会从FORWARD链转发出去。 Web服务器在内部,它收到请求后回应数据包给网关,然后返回到10.0.0.241。这样就把内部主机保护起来,外面的人只能看见那台网关服务器,所以NAT应用非常广,而且非常强大,更多帮助和介绍可参考www.netfilter.org 为软件打补丁,首先用gpg导入公钥文件,再校验patch文件的正确性。 #bzcat 9.3.0-patch | patch -p0 一般需查文件里面的目录,然后再将软件目录改名。 |