Linux里的防火墙:netfilter简介与Iptables的使用(上)


什么是防火墙?

防火墙可以是像360,金山,卡巴斯基等软件,也可以是硬件,我们来用OSI七层模型来划分的话。那么分为:

1. 三层防火墙:它只负责检查数据从进入到第三层,还有从第三层流出,是否符合它规定的条件,如果是,那么就放行,反之就拦截。

2.七成防火墙:它负责数据输入到第七层,与从第七层到流出,它的检查范围更加广泛,但是消耗的系统资源也就更多。这也是为什么现在市面上大多数防火墙方案都是两者结合的原因


防火墙如何生效?

我们刚知道,防火墙分为3层和7层,那么我们想让防火墙生效,就必须放在特定的地方,例如:你的目的是防止入侵破坏,而你把防火墙放在了数据传出的地方,那么它就起不到作用,因为你的系统已经受到破坏了。如下图:


那么Linux中的防火墙是什么样的?

linux1.0时代
ipfw:早期的freebsd,功能有限,它定义的规则基于内核,要想让它生效,必须重启
内核,就是重启OS

linux2.0 后来的发展:软件式的防火墙
ipchains : 做了很大的改进,可以定义N条规则成为一个链来工作

iptables: 现在,ipchains的发展,可以在链的基础上定义表,里面有多个链


注意:ipchains和iptables工作在用户空间,是用户定义的规则,它们本身不属于防火墙基于端口,可以实现防火的功能


netfilter : 真正意义上的防火墙

所以要想让防火墙生效,我们就需要将它放置在TCP/IP协议栈(TCP/IP stack)的几个特殊的位置,作者设计了五个放置位置:在这五个位置上定义拦截,来实现防火墙的功能。这五个位置,分别是

INPUT(数据流入)

PREROUTING(路由前)

POSTROUTING(路由后)

FORWARD(转发)

OUTPUT(数据流出)



理解了防火墙的概念,现在我们来学习iptables,iptables详细用法由于比较长,放在下面一个文章中:

iptables的详细用法:http://blog.csdn.net/deansrk/article/details/6704170


1.假设一台主机只允许172.16.0.0网段可以使用ssh远程连接到本机,如何实现

分析:

1)到本机内部访问的最好定义在INPUT

2)从本机内部出去的最好定义在OUTPUT

iptables -t filter -A INPUT -s 172.16.0.0/16 172.16.100.1 -p tcp --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP

2.一台服务器172.16.14.1只允许172.16.0.0/16访问80:22,且不允许172.16.0.1访问80:22,并且只放行建立连接后的数据。(防止反弹性木马)

ptabels -A INPUT -s 172.16.0.1 -p tcp --dport 22 -j DROP ptabels -A INPUT -s 172.16.0.1 -p tcp --dport 80 -j DROP ptabels -A INPUT -s 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT iptabels -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -L -n -v Chain INPUT (policy DROP 7013 packets, 660K bytes) pkts bytes target prot opt in out source destination 0 0 DROP tcp -- * * 172.16.0.1 0.0.0.0/0 tcp dpt:22 0 0 DROP tcp -- * * 172.16.0.1 0.0.0.0/0 tcp dpt:80 2548 200K ACCEPT tcp -- * * 172.16.0.0/16 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 172.16.0.0/16 0.0.0.0/0 tcp dpt:80 3 484 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 4180 packets, 4043K bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 6381 packets, 577K bytes) pkts bytes target prot opt in out source destination 556 64420 all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED


3.服务器A于客户端C要经过防火墙B的转发来访问,如下表对应的关系,要求C可以访问到172网段,B有两个地址192.168.0.28和172.16.14.10,只允许192.168.0.48可以访问到服务器A的80端口和22端口,其他的都不能访问。(需要开启3台虚拟机)

服务器A 防火墙B 客户端C
172.16.14.10:80 FORWARD C 80:22 192.168.0.48
172.16.14.10:22 FORWARD policy DROP

1)配置C的默认网关为192.168.0.28

route add default gw 192.168.0.28

2)开启A的httpd和sshd服务,如果没有请先安装

service httpd start service sshd start

3)配置B的iptables

iptables -A FORWARD -c 192.168.0.48 -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -c 192.168.0.48 -p tcp --dport 80 -j ACCEPT iptables -P FORWARD DROP iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp -- 192.168.0.48 172.16.14.10 tcp dpt:80 ACCEPT tcp -- 192.168.0.48 172.16.14.10 tcp dpt:22 Chain OUTPUT (policy ACCEPT) target prot opt source destination

4)在C上ping一下 172.16.14.10 应该不通,然后使用ssh连接A ,再使用elinks测试下A的httpd服务是否正常

ssh 172.16.1410 elinsk http://172.16.14.10 #如果能连接到测试页说明正常

5)将C的ip换为192.168.0.58看还能不能ssh或者访问到测试页

ifconfig eth0 192.168.0.58 ssh 172.16.1410 #应该脸不上 elinsk http://172.16.14.10 #应该不能显示任何内容,两样都满足说明防火墙生效






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值