iptables(二)网络防火墙

处理动作

处理机制

  1. DROP:悄悄丢弃,不伤害,不回复

  2. REJECT:明确拒绝,还会通知你:“就不让你过”

  3. ACCEPT接收

  4. DNET:目标NAT

  5. SNET:源NAT

  6. RETUER:跳转

  7. REDIRCT端口转换

  8. LOG:记录日志

解释一下跳转,别的都比较好理解。

如果我们在某一张表里面制定了很多规则,当出了问题之后我们也不好排查,我们可以将其分类,定义子串,什么意思呢?比如我们不允许目标端口是22的报文进入,我们先先定义一个filter规则仅拒绝22端口,但是不定义源/目标网段,我们把源和目标网段定义到另一个链上,当filter检查规则时会跳转到这个另一个链上,当另一个链检查完成之后,然后再跳转回来接着向下检查规则。

状态追踪

state:状态追踪(状态监控)

​ --state

​ NEW:新连接请求

​ ESTABLISHED:已经建立的连接

​ RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已经存在的链接。

​ INVALID:无法识别的连接

​ UNTRACKED:未追踪的连接

法则:

  1. 对于进入状态为ESTABLISHED都应该放行

  2. 严格检查进入的状态为NEW的链接

  3. 所有状态为INVALID都应该拒绝

注意:硬件防火墙默认开启了状态追踪,这肯定会加重防火墙的负担,至于要不要开启,还是要看具体的情况,看服务器的性能。

网络防火墙

状态监测

NOTE

  1. 做单机防火墙的时候主要在input和output上搞,做网络防火墙就得从forward链上搞了。

  2. 做网络防火墙一定要记得把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
    
  3. 地址虽然配置在网卡上,但是地址是属于内核,地址都在内核上,都在内核上那就不叫转发。

环境准备:

内网主机: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

关于防火墙的状态监测如果不懂的话,可以查看我另一篇博文,这里不多做赘述

https://www.cnblogs.com/yizhangheka/p/11026668.html

既然写到这里了,我们就来提一下,为什么硬件防火墙默认会有三个区域呢?

在没有状态监测出现之前,我们制定规则起码要制定两条,一条是入的,另一条是出的,而有了状态监测之后,我们只要放行出去的,回来的规则不用制定,我们可以统一用一条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
posted @ 2020-02-24 17:10  张贺贺呀  阅读(399)  评论(0编辑  收藏  举报