iptables(二)网络防火墙
处理动作
处理机制
-
DROP:悄悄丢弃,不伤害,不回复
-
REJECT:明确拒绝,还会通知你:“就不让你过”
-
ACCEPT接收
-
DNET:目标NAT
-
SNET:源NAT
-
RETUER:跳转
-
REDIRCT端口转换
-
LOG:记录日志
解释一下跳转,别的都比较好理解。
如果我们在某一张表里面制定了很多规则,当出了问题之后我们也不好排查,我们可以将其分类,定义子串,什么意思呢?比如我们不允许目标端口是22的报文进入,我们先先定义一个filter规则仅拒绝22端口,但是不定义源/目标网段,我们把源和目标网段定义到另一个链上,当filter检查规则时会跳转到这个另一个链上,当另一个链检查完成之后,然后再跳转回来接着向下检查规则。
状态追踪
state:状态追踪(状态监控)
--state
NEW:新连接请求
ESTABLISHED:已经建立的连接
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已经存在的链接。
INVALID:无法识别的连接
UNTRACKED:未追踪的连接
法则:
对于进入状态为ESTABLISHED都应该放行
严格检查进入的状态为NEW的链接
所有状态为INVALID都应该拒绝
注意:硬件防火墙默认开启了状态追踪,这肯定会加重防火墙的负担,至于要不要开启,还是要看具体的情况,看服务器的性能。
网络防火墙
状态监测
NOTE
-
做单机防火墙的时候主要在input和output上搞,做网络防火墙就得从forward链上搞了。
-
做网络防火墙一定要记得把forward打开
/proc/sys/net/ipv4/ip_forward
1是打开,0是关闭[root@n9 ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@n9 ~]# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1
-
地址虽然配置在网卡上,但是地址是属于内核,地址都在内核上,都在内核上那就不叫转发。
环境准备:
内网主机:192.168.10.2
防火墙内网接口:192.168.10.254
防火墙外网接口:172.16.0.6
外网服务器:172.16.0.67
假设说内网开了一个WEB服务,在防火墙的FORWARD上允许任何地址访问80端口
//只要是established状态的报文都放行
iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
//内网所有主机出去的new状态的报文也全部放行
iptables -I FORWARD -s 192.168.10.0/24 -m state --state NEW -j ACCEPT
//任意主机都可以访问内容10.2这台主机的80端口,new状态放行
iptables -I FORWARD -d 192.168.10.2 -p tcp --dport 80 -m state --state NEW -j ACCEPT
如果内网有多个服务,比如有ssh、ftp、cifs呢?这也很简单呀,我们只要改动一下第三条规则即可。
iptables -R FORWARD 3 -d 192.168.10.2 -p tcp -m multiport --dport 21:23,80,139,445 -m state --state NEW -j ACCEPT
iptables -I FORWARD 4 -d 192.168.10.2 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
ftp这个服务比较特别,我们仅放行21端口是不够的,还要加载ftp模块,如下所示:
modprobe nf_conntrack_ftp
iptables -I FORWARD 5 -d 192.168.10.2 -p tcp -m state --state RELATED -j ACCEPT
关于防火墙的状态监测如果不懂的话,可以查看我另一篇博文,这里不多做赘述
既然写到这里了,我们就来提一下,为什么硬件防火墙默认会有三个区域呢?
在没有状态监测出现之前,我们制定规则起码要制定两条,一条是入的,另一条是出的,而有了状态监测之后,我们只要放行出去的,回来的规则不用制定,我们可以统一用一条iptables -A CHIN -m state --state ESTABLISHED -j ACCEPT
来放行。其实这样,无形之间就将内网和外网给隔开了,形成了两个区域:内网和外网,但是有一个隐患,假如黑客通过正常访问内网的80端口然后攻陷了服务器,进而通过服务器做为跳板进一步威胁其它的主机怎么办呢?再就再加一个区域:dmz,这个区域专门存放被外网能访问的服务器,而不能被访问的主机或服务器都放置在内网,而且制定规则,不允许dmz区域和内网区域的new状态的报文通过,这样就不怕dmz区域的主机被攻陷之后威胁内网主机了。
S-NAT
NOTE:源NAT在postrouting上做,目标NAT在prerouting上做。
防火墙通常要兼职做路由器的工作,所以就要用到s-nat功能了。
环境准备:
内网主机:192.168.10.2
防火墙内网接口:192.168.10.254
防火墙外网接口:172.16.0.6
外网服务器:172.16.0.67
NAT的本意是隐藏源IP,无心之举却解决了IPV4地址紧缺的问题。
辅助命令:tcpdump eth0 –nn tcp port 80
仅上网的话不用在PREROUTING上操作
目标地址转换也可以做负载均衡器,刚开始负载均衡器就是由iptalbes来实现,后来专门划分到另一个组件了,了,那个组件就叫LVS。
地址转换可以和过滤结合起来,比如不让想谁通过,就在防火墙的FORWARD上做一下设置。
//将源地址192.168.10.0这个网段的地址的源地址转换为172.16.0.6
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.0.6
上网的问题是解决了,可如果我们内网有服务器需要被外网的用户访问,但是内网用户没有公网IP,怎么办呢?在防火墙上做端口映射呗,这就要用到D-NAT功能了。
//这一条就足够了
iptables -t nat -A PREROUTING -d 172.16.0.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2
//端口也能转换
iptables -t nat -R PREROUTING 1 -d 172.16.0.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2:8080
//如果我们想拒绝某个主机呢?在FORWARD链接上做,注意上面可都是在prerouting上做的,注意这里已经被PREROUTING给转换过了。
iptables -R FORWARD 1 -s 172.16.0.200 -p tcp --dport 8080 -d 192.168.10.2 -j REJECT
//也可以仅转换端口
iptables -t nat -A PREROUTING -d 192.168.10.2 -p tcp --dport 80 -j REDIRECT --to-ports 8080
案例
//本机为192.168.80.59,只允许192.168.80.6来访问ssh服务
iptables -A INPUT -s 192.168.80.6/32 -d 192.168.80.59/32 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 192.168.80.59/32 -d 192.168.80.6/32 -p tcp --sport 22 -j ACCEPT
//放行本机访问tftp服务器的报文,本地网段172.16.0.0,tftp服务器192.168.80.8
iptables -A INPUT -s 172.16.0.0/16 -d 192.168.80.8 -p udp --dport 69 -j ACCEPT
iptables -A OUTPUT -s 192.168.80.8 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT
//本机为192.168.80.59,DNS服务器为223.66.6 放行DNS的数据包
iptables -A INPUT -s 192.168.80.59 -d 223.6.6.6/32 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -s 192.168.80.59 -d 223.6.6.6/32 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 223.6.6.6/32 -d 192.168.80.59/32 -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -s 223.6.6.6/32 -d 192.168.80.59/32 -p udp --sport 53 -j ACCEPT