Linux学习99 Linux防火墙iptables高级实战演练
一、回顾
1、iptables/netfilter
a、netfilter:raw,mangle,nat,filter
PREROUTING --> INPUT
PREROUTING --> FORWARD --> POSTROUTING
OUTPUT --> POSTROUTING
b、filter:INPUT,FORWARD,OUTPUT
c、nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
2、iptables:
a、[-t table] COMMAND [chain] rule-specification
-m matchname [per-match-options]
-t targetname [per-target-options]
[options]
b、匹配条件
(1)、基本匹配条件:-s,-d,-p,-m,-i,-o
(2)、扩展匹配条件:
1)、隐式扩展:
-p tcp:--dport,--sport,--tcp-flags,--syn
-p udp:--dport,--sport
-p icmp:--icmp-type
2)、显示扩展
multiport:--sports,--dports
iprange:--src-range,--dst-range
time:--timestart,--timestop,--weekdays,--monthdays,--datestart,--datestop
string:--algo {bm|kmp},--string
connlimit:--connlimit-upto,--connlimit-above
limit:--limit,--limit-burst
state:--state
NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED
c、target
(1)、-j:
ACCEPT/DROP
REJECT:--reject-with
LOG:--log-level,--log-prefix
自定义链:
RETURN
d、iptables-save/iptables-restore
二、iptables(3)
1、接下来我们来讲网络防火墙功能,我们Linux何种情况下可以作为网络防火墙来工作呢?想象一个场景,我们说过对于任何一个局域网来说我们都需要网关设备,假如我们一个局域网中有很多客户端主机,假如我们这儿有一个网关设备,我们任何非本地网络通信的报文都要经由他来负责转发的。这个设备可能是一个硬件的路由器。我们路由器在报文路由时源mac和目标mac都会进行修改,而我们的源IP和目标IP是不会改变的。
2、我们linux做网关设备一般是这样的。首先我们需要开启默认转发功能。然后我们需要有两张网卡,一张网卡作为内部网关,另一张网卡接入外部网络。
3、假如我们现在有一个主机有三个网卡。一块连接内网。一块连接A网络。一块连接B网络。假如我们内网一客户端 172.16.0.67发一报文,只要到网关就表示非本地通信了,我们前提是打开我们主机的核心转发功能,打开核心转发后报文就在本地内核中转了一圈,因为他不与本地进程通信因此他不会到达我们的用户空间,他只是在内核空间中走了一遭。然后他会根据我们的路由条目转发至某一个相应网段的接口或IP。
4、对linux主机来讲有内核空间有用户空间,用户空间当中有进程。一个报文来了先进入PREROUTING链,然后判断目标地址是不是自己,如果是就拆开IP封装然后就看到目标端口了,看看谁监听了这个端口,然后就把报文交给这个进程,这样就到达了INPUT链了,但如果目标IP不是自己的话那么就会到达FORWARD链,这个链完了以后就看要从本机的哪个网卡出去,确定好网卡后就扔到这个网卡的队列中去了,在扔到网卡队列之前会经过最后一个链POSTROUTING,因此这就是转发的报文。并且我们网关来讲他的转发既要承左启右又要承右启左,即我们报文不仅要进来还要回来
a、假如我们本机有两块网卡,中间有个FORWARD,假如报文是从左往右来的,很显然此时PREROUTING,FORWARD,POSTROUTING是自左向右的。不过如果响应报文再回来的话就不一样了,PREROUTING,FORWARD,POSTROUTING就是自右向左了,因此我们的链与网卡没有关系,他和报文流经的阶段有关系。
b、我们说过,我们的filter功能不能在PREROUTING上做,他只有三个链,INPUT,OUT,FORWARD。不过我们发现无论请求的还是响应的都在FORWARD链上。但是他的方向是不一样的。我们的请求的目标IP源IP在响应的时候又是反过来的。如果我们要构建规则设定访问需求的话就需要根据报文走向来完成设置。
三、相应演示
1、规划,现在我们有一台主机有两块网卡,我们把172.16.0这个网络当外网,我们再设置一个网络192.168.10.0网络作为内网。
a、内网
内网主机地址:192.168.10.2
内网网关网卡:192.168.10.254
b、外网
外网网卡:172.16.0.6
外网远端主机:172.16.0.67
2、配置
a、首先我们先打开我们192.168.10.254主机的核心转发功能
b、我们在172.16.0.67主机上添加回172.16.0.6的路由
c、然后我们发现我们192.168.10.2主机就能ping通172.16.0.6主机了。
3、配置iptables策略
a、我们在192.168.10.254的iptables中配置FORWARD链默认为REJECT,然后我们发现我们192.168.10.2就无法访问到我们172.16.0.67上的服务了。
然后我们在192.168.10.2上访问172.16.0.67上的服务发现被拒绝
b、我们现在在192.168.10.254的iptables中配置FORWARD链开放内网主机访问外网上任何主机的web服务
然后我们发现还是不能访问,因为我们此时请求报文能出去了但是响应报文还是进不来,因此我们再来设置响应报文能进入
3、我们使用状态规则来配置
a、我们首先删除上面的两条规则
b、现在我们加一条规则,只要状态是ESTABLISHED的都放行
c、现在我们来放行NEW状态的规则。注意我们只开放内网主机的NEW,如果开放外网的NEW状态的话就把本地主机都暴露出去了。然后我们发现我们内网主机就能访问外网服务了。但是由外而内却不行,因此我们没有放行外网到内网的NEW。
d、现在我们只开放外面访问内网192.168.10.2这个主机的80端口。这样我们外网主机就能访问到我们的内网主机192.168.10.2的80端口了,并且也只能访问到我们内网主机的80端口
e、我们现在来配置外网能访问本地的相应的tcp端口,我们直接在刚刚的基础上修改即可
并且我们开放相应的udp端口
f、然后我们通过外网来访问我们相应的服务,但是我们发现我们的ftp服务访问不了,因为我们的RELATED状态还没有开放。因此我们将其添加至最后即可
(1)、首先我们需要安装nf_conntrack_ftp模块
(2)、然后我们添加规则
(3)、然后我们发现我们可以访问ftp服务了了
4、然后我们发现由内而外都可以访问,但是由外而内只能访问192.168.10.2,其它主机都访问不了。那么就会有一个问题,假如我们内网有许多主机,假如别人攻击了192.168.10.2那么内网也就可能存在被攻击的风险。因此更多的时候我们会是三块网卡,一块网卡连外网,一块网卡连我们的办公网络,这个网络中的所有主机决不允许NEW进来,另外一个网络为外网能访问过来的服务器网络(非军事区),即外网的NEW可以进来。因此即便别人通过外网劫持了服务器,但是要绕到我们的办公网络那么就还是NEW,就不允许了。因此我们非军事区。最后一个网络为公网网络。我们服务器有公网地址,而我们的客户端只有私有地址,那么我们客户端怎么访问互联网呢?于是nat就发挥作用了。