一、防火墙简介
Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件;
软件防火墙(软件逻辑):一般寄生在操作系统平台。软件防火墙是通过纯软件的的方式实现隔离内外部网络的目的。
硬件防火墙(硬件和软件逻辑):系统是嵌入式的系统。一般开源的较多。硬件防火墙是通过硬件和 软件的组合来达到隔离内外部网络的目的。 硬件防火墙是流行趋势,相比软件防火墙除成本外很有优势。
本文只对软件防火墙进行介绍
主机防火墙:服务范围为当前主机
网络防火墙:服务范围为某个局域网
iptables的基本认识:
1、netfilter组件被称为内核空间,它被集中在内核中。netfilter是一种内核中用于扩展各种网络服务的结构化底层框架。它是在内核中选取五个位置放了五个hook function,这五个hook function 向用户开放,用户可以通过工具(iptables)向其写规则。
2、iptables是一个工作在用户层用来写规则的工具,写好的规则被送往netfilter。这些规则告诉内核中的netfilter组件如何处理信息包
iptables的组成:
iptables是由四个表和五个链组成
1、四表:
filter:过滤,防火墙;
nat:network address translation;用于修改源IP或目标IP,也可以改端口;(从而达到隐藏后台服务器的目的)
mangle:拆解报文,做出修改,并重新封装起来;(除了该地址之外的其它数据, 如协议)
raw:关闭nat表上启用的连接追踪机制;
实际上还有第五个表:security 此表用于强制访问控制(MAC)网络规则,一般很少很少用到此表
2、五链:
PREROUTING:对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
INPUT:进来的数据包应用此规则链中的策略
OUTPUT:外出的数据包应用此规则链中的策略
POSTROUTING:对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
FORWARD:转发数据包时应用此规则链中的策略
3、表与链的关系
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING(在centos6上没有INPUT)
filter:INPUT,FORWARD,OUTPUT
功能生效先后次序raw –>mangle–>nat–>filter
4、如何写规则
添加规则时的考量点:
(1) 要实现哪种功能:判断添加到哪个表上;
(2) 报文流经的路径:判断添加到哪个链上;
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
(1) 同类规则(访问同一应用),匹配范围小的放上面;
(2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
(3) 将那些可由一条规则描述的多个规则合并起来;
(4) 设置默认策略;
二、iptables的基本使用
iptables [-t 表名] <-A|-D|-I|-R…> 链名 [规则编号] [-i|-o 网卡名称] [-p 协议类型] [-s 源IP地址|源子网] [–sport 源端口] [-d 目标地址|子网地址] [–dport 目标端口] <-j 处理动作>
1、-t table:
raw, mangle, nat, [filter](默认是filter链)
2、链管理:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-N:new, 自定义一条新的规则链;
-X: delete,删除自定义的规则链;
注意:只有具备以下全部条件才能删除链
用户自定义的
空的
引用计数为0的
必须符合以上三个条件才能删除
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受(内建)
DROP:丢弃(内建)
REJECT:拒绝(扩展)
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也 不能被删除;
3、规则管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和;
4、查看:
-L:list, 列出指定鏈上的所有规则;(必须写在后面)
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;
-vv, -vvv
-x:exactly,显示计数器结果的精确值;
–line-numbers:显示规则的序号;
5、匹配条件:
(1)基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
[!] -s, –source address[/mask][,…]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, –destination address[/mask][,…]:检查报文中的目标IP地址是否符合 此处指定的地址或范围;
匹配所有地址:0.0.0.0
[!] -p, –protocol protocol(四层协议)
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or “all”
[!] -i, –in-interface name:数据报文流入的接口;只能应用于数据报文流入 的环节,只能应用于PREROUTING,INPUT和 FORWARD链;
[!] -o, –out-interface name:数据报文流出的接口;只能应用于数据报文流 出的环节,只能应用于FORWARD、OUTPUT和 POSTROUTING链;
(2)扩展匹配条件: 需要加载扩展模块,方可生效;又分为隐式扩展和显示扩展
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使 用-p指明了协议,就表示已经指明了要扩展的模块;
常用的协议
tcp:
[!] –source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] –destination-port,–dport port[:port]:匹配报文的目标端口;可以是端 口范围;
[!] –tcp-flags mask compmask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST
comp is a comma-separated list of flags which must be set,例如:SYN
例如:“–tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为 SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
[!] –syn:用于匹配第一次握手,相当于”–tcp-flags SYN,ACK,FIN,RST SYN
“; udp
[!] –source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] –destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围;
icmp
[!] –icmp-type {type[/code]|typename}
echo-request:8 (回显请求)
echo-reply:0 (回显响应)
6、处理动作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回调用链;
REDIRECT:端口重定向;
LOG:记录日志;
MARK:做防火墙标记;
DNAT:目标地址转换;
SNAT:源地址转换;
MASQUERADE:地址伪装;
…
自定义链:
三、扩展模块
1、multiport扩展:以离散方式定义多端口匹配;最多指定15个端口;
[!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;
[!] –destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;
[!] –ports port[,port|,port:port]…:指明多个端口;
2、iprange扩展:指明连续的ip地址范围;
[!] –src-range from[-to]:源IP地址;
[!] –dst-range from[-to]:目标IP地址;
3、string扩展:对报文中的应用层数据做字符串模式匹配检测;
–algo {bm|kmp}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] –string pattern:要检测的字符串模式;
[!] –hex-string pattern:要检测的字符串模式,16进制格式;
4、time扩展:根据将报文到达的时间与指定的时间范围进行匹配;
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –monthdays day[,day…]
[!] –weekdays day[,day…]
–kerneltz:使用内核上的时区,而非默认的UTC;
5、connlimit扩展:根据每客户端IP做并发连接数数量匹配;
–connlimit-upto n:连接的数量小于等于n时匹配;
–connlimit-above n:连接的数量大于n时匹配;
6、limit扩展:基于收发报文的速率做匹配;
令牌桶过滤器;
–limit rate[/second|/minute|/hour|/day](速率)
–limit-burst number(定义桶最大收集多少个令牌)
7、state扩展(在并发访问量很大时,不建议开启此功能)
state模块是contract模块的子集:根据”连接追踪机制“去检查连接的状态;
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此, 将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前 期间内所进行的通信状态;(established)
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关 系
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;
三、iptables之forward配置
1、 客户端配置
(1)配置网络桥接模式 ip 172.16.254.187
(2)设置默认路由
route add default gw 172.16.251.210
(3)ping测试
172.16.251.210 ping 通
192.168.70.139 ping 通
192.168.70.138 不通
2、 web服务器配置
(1)配置网络为仅主机模式 ip192.168.70.138
(2)添加默认路由
route add default gw 192.168.70.139
(3)测试
192.168.70.139 通
172.16.251.210 通
172.16.254.187 不通
(4)配置httpd服务
安装服务
修改主页面 vim /var/www/html/index.html
启动服务
3、 iptables服务器配置
echo 1 >/proc/sys/net/ipv4/ip_forward (开启内核转发功能)
测试:
在172.16.254.178(客户端)主机
通
在192.168.70.138(web服务器)主机
通
书写规则链
4、测试
能正常访问web服务器
四、iptables之地址装换法则
1、NAT:网络地址装换。分为源地址转换和目标地址装换
SNAT:修改IP报文中的源IP地址,让本地网络中的主机刻使用同一地址与外部主机通信,从而实现伪装地址
DNAT:修改IP报文的目的地址,让本地网络中的服务器使用统一的地址想歪提供服,但是隐藏自己的真实的地址。
PNAT:端口转换,一般与DNAT结合王城目标地址和端口的转换
2、SNAT的实现
要求:隐藏客户端地址
客户端配置
(1)配置网络桥接模式 ip 172.16.254.187
(2)设置默认路由
route add default gw 172.16.251.210
(3)ping测试
172.16.251.210 ping 通
192.168.70.139 ping 通
192.168.70.138 不通
web服务器配置
(1)配置网络为仅主机模式 ip192.168.70.138
(2)添加默认路由
route add default gw 192.168.70.139
(3)测试
192.168.70.139 通
172.16.251.210 通
172.16.254.187 不通
(4)配置httpd服务
安装服务
修改主页面 vim /var/www/html/index.html
启动服务
iptables服务器配置
echo 1 >/proc/sys/net/ipv4/ip_forward (开启内核转发功能)
测试:
在172.16.254.178(客户端)主机
通
在192.168.70.138(web服务器)主机
通
(1)配置iptables规则
隐藏客户端主机的IP地址为(192.168.70.139)
(2) 测试
在客户端抓包
客户端访问web服务器
看到:在客户端显示: 172.16.254.187发出请求
192.168.70.138响应请求
在iptables服务器抓包
抓包ens37(192.168.70.139)
看到发出请求报文的是 192.168.70.139而不是 172.16.254.187
在web服务器上抓包
看到发出请求报文的是 192.168.70.139而不是 172.16.254.187
这样就可以隐藏客户端地址了
3、DNAT配置
要求:隐藏web服务端地址
客户端配置
(1)配置网络桥接模式 ip 172.16.254.187
(2)设置默认路由
route add default gw 172.16.251.210
(3)ping测试
172.16.251.210 ping 通
192.168.70.139 ping 通
192.168.70.138 不通
web服务器配置
将web服务器的地址隐藏为172.16.251.210
(1)配置网络为仅主机模式 ip192.168.70.138
(2)添加默认路由
route add default gw 192.168.70.139
(3)测试
192.168.70.139 通
172.16.251.210 通
172.16.254.187 不通
(4)配置httpd服务
安装服务
修改主页面 vim /var/www/html/index.html
启动服务
iptables服务器配置
echo 1 >/proc/sys/net/ipv4/ip_forward (开启转发功能)
测试:
在172.16.254.178(客户端)主机
通
在192.168.70.138(web服务器)主机
通
(1)配置iptables规则
(2)测试
在 客户端测试
可以看到客户端发出的请求报文给172.16.251.210了
在iptables服务器上抓包
可以看到客户端发出的请求报文给自己了
在web服务器上抓包
可以看到客户端给自己发的请求报文
4、在DNAT配置的基础上扩展实现端口隐藏(PNAT)
现在web服务器上把web服务的端口改为8080
重启服务
(1)在iptables服务器上做规则
iptables -t nat -A PREROUTING -d 172.16.251.210 -p tcp –dport 80 -j DNAT –to-destination 192.168.70.139:8080
(2)抓包测试
在客户端测试
客户端显示我们访问的是172.16.251.210的80端口
iptables测试
内网网卡(ens33)
内网网卡显示我们访问的是172.16.251.210的80端口
外网网卡(ens37)
外网网卡显示我们访问的是192.168.70.138的8080端口
web服务器测试
外网网卡显示我们访问的是192.168.70.138的8080端口
通过各个点的测试表明了 隐藏了服务器的端口,PNAT配置成功
原创文章,作者:zq,如若转载,请注明出处:http://www.178linux.com/78169