目标:模拟生产环境的基本拓扑,实现通过源地址转换内网多台主机公共一个IP地址访问互联网,并通过目标地址转换,把www等多个服务器放到互联中,并实现安全控制,基本拓扑结构如下:

在这个拓扑结构中来说,就是局域网中的机器都可以访问互联网中的Web1,局域网中的机器也可以访问Web2与内部FTP(电脑配置有限以www为例),外部的Web1看做客户端也可以访问Web2,并实现对访问进行一些控制,比如对FireA的ssh严格控制,以防攻破第一道墙。用两个防火墙的意义在于如果DMZ中的服务器被攻破而不会对内网造成影响,下面慢慢来说这个实验吧。

一,实验准备

1.1 用虚拟机模拟出4台安装了redhat5.8的机器,分别对应Web1,FireA,Web2,FireB,真实的物理主机作为局域网中的一台机器,其中Fire的机器需要两块网卡。

1.2 根据拓扑结构图我们来配置虚拟机网卡需要的连接方式。

Web1:eth0 桥接

FireA:eth0 桥接; eth1 Host-only

Web2:eth0 Host-only

FireB:eth0 Host-only;eth1 桥接

1.3 根据拓扑图设置他们的IP地址,网关,路由等

Web1:eth0 IP:1.1.1.2/8 Gateway: 1.1.1.1

FireA:eth0 IP:1.1.1.1/8 eth1 192.168.1.1 Gateway:192.168.1.254

Web2:eth0 IP:192.16.1.2/24 Gateway:192.168.1.1

FireB:eth0 IP:192.168.1.254/24 eth1:172.16.1.1/16 Gateway:192.168.1.1

  1. ifconfig eth0 1.1.1.2/8        ##设置IP 
  2. route add default gw 1.1.1.1   ##设置网关 

1.4 Web1,Web2配置一个简单的站点。

这个此处就不在赘述。

1.5 打开FireA,FireB的转发功能

  1. echo 1 > /proc/sys/net/ipv4/ip_forward 

到此网络已经连通,主机之间可以相互访问,但是这在现实网络中是行不通的,因为公网的地址是不能访问私网地址的,这就用到了地址转换。

二,源地址转换实现多台主机通过一个IP上网,同时隐藏局域网主机,增加安全性。

从拓扑中可知Lan1访问Web1得通过两个防火墙,这意思是说地址需要转换两次。

FireB中源地址转换:

  1. iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.1.254 

通过FireB后数据帧中的 源IP:172.16.1.2 目的IP:1.1.1.2 变为 源IP:192.168.1.254 目的IP:1.1.1.2 

FireA源地址转换:

  1. iptables -t nat -A POSTROUTING -s 192.168.1.254/24 -j SNAT --to-source 1.1.1.1 

通过FireB后数据帧中的 源IP:192.168.1.254 目的IP:1.1.1.2 变为 源IP:1.1.1.1 目的IP:1.1.1.2 数据到达Web1.Web1收到后对数据进行响应,源IP: 1.1.1.2 目的IP:1.1.1.1 经过FireA,FireA发现这个是转换过地址的封包,于是查询内部的表得知原来的IP地址,于是便还原回原来的地址这时 源IP:1.1.1.2 目的IP:192.168.1.254 当数据帧到达FireB后发现这个是转换过地址的封包,于是查询自己内部的表得知对应的IP地址,这时 源IP:1.1.1.2目的IP:172.16.1.2 整个过程到此为一个循环,会话正常建立。

访问Web1的站点,然后查询Web1的access日志,查看访问IP是否与分析的一致。

 

三.通过目标地址转换,多台服务器公用一个公网IP,并实现正常访问

由于我们只有一个公网IP,但是我们有多种服务提供,比如说WWW,如果说FTP等等,私网IP公网上的其它主机又访问不到,公网IP也只有一个,这个时候我们就用目标地址转换吧。以Web1访问Web2为例,先来操作,后来解释。

FireA目标地址转换:

  1. iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2 

这时Web1访问1.1.1.1的80 即可访问Web2的站点。Web1发出的数据帧 源IP:1.1.1.2 目标IP:1.1.1.1 经过FireA时,发现访问的是80端口,自己本身没有提供web服务,于是转换目的地址,源IP:1.1.1.2 目的IP:192.168.1.2 这时数据包就顺利到达了Web2,Web2作出响应,源IP:192.168.1.2 目的IP:1.1.1.2 经过FireA,FireA发现这个包曾地址转换过于是,便把地址还原回来,这时源IP:1.1.1.1 目的IP:1.1.1.2 数据包到达Web1,一个循环结束,会话建立。

内网访问Web不需要地址转换,因为大家都是私网嘛,所以很和谐的。

 

四.通过iptables来实现访问控制。

由于美帝国主义亡我之心不死,见从经济与军事无法战胜我大中华,于是便派这种怪客啊,***等从网络上对我国安全构成威胁,于是我们伟大 互联网专家、国家防火墙之父、集各种名誉为一身的科学家 方滨兴 大人首先举起了反抗的大旗,构筑了伟大的国家防火墙,很大程度上减少了对我们的***。但是我们也不能放松警惕,时刻提高自我的安全意识……扯太远了,继续说我们的iptables吧。

4.1 把所有的默认策略设置为DROP,然后针对性的放行。

 

  1. ##FireA设置 
  2. iptables -P INPUT DROP 
  3. iptables -P OUTPUT DROP 
  4. iptables -P FORWARD DROP 
  5. ##放行本机sshd以允许管理员远程 ##当然最好配合修改ssh端口号,禁止root登陆等
  6. iptables -A OUTPUT -m state --state established -j ACCEPT  ##凡是建立连接的都让出去
  7. iptables -A INPUT  -p tcp --dport 22  -m state --state NEW -m recent --set --name SSH 
  8. iptables -A INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --name SSH -j DROP 
  9. iptables -A INPUT  -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT    ##放行 ssh

4.2 放行外网对80的访问(以及对你已知端口的访问)

  1. ##所有建立的连接都予以转发 
  2. iptables -A FORWARD -m state --state established -j ACCEPT 
  3. ##对放松进来的端口为80的数据包 
  4. iptables -A FORWARD -d 192.168.1.2 -p tcp --dport 80 -m state --state new,established -j ACCEPT  

4.3 放行来自192.168.1.254 即来自内网需要出去的包,一般对内网出去的包设置稍微宽松点,针对不同的生产环境,设置不同的严厉程度。

  1. ##放行内网出去的所有包 ##也可以设置宽松点 
  2. iptables -A FORWARD -s 192.168.1.254 -j ACCEPT  

4.4 设置FireB,设置ssh的限制,允许已建立的连接通过转发,不允许所有new状态包通过

  1. ##这个防火墙稍微宽松些吧,默认政策就是允许吧 
  2. ##设置ssh与FireA的相同 
  3. ##禁止所有进入局域网为new状态的包 
  4. iptables -A FORWARD -m --state new -j DROP 

4.5 限制内网的某个捣乱机器连接外网,屏蔽其mac

  1. iptables -A FORWARD -s 172.16.0.0/16 -m mac --mac-source ##:##:##:##:##:## -j DROP

4.6 过滤内网中访问包含sex字符串的内容

  1. iptables -A FORWARD -s 172.16.0.0/16 -m string --algo kmp --string 'sex' -j DROP    
  2. ##当然也可以对第一道防火墙那也这么设置 

4.7 如果想对内网中某些软件的过滤需要重新编译内核与iptables,比如用L7layer来给内核打补丁,然后编译iptables,用来过滤qq,迅雷等,如果有需要访问http://kangjie.blog.51cto.com/1301530/288002 。

 

iptables 先写到此吧,如果你按一下赞,我会灰常感谢你的。