防火墙规则应用详解1


实验环境:
总共有3台设备A BC,A主机上有2块网卡,其中一个网卡的IP地址为10.10.10.136,另一个网卡的IP为192.168.10.136.主机B是内网的一台主机IP地址为192.168.10.135,网关为192.168.10.136.主机C是外网内的一台主机IP地址为10.10.10.135网关为10.10.10.136
试验设置:
在主机A上启用路由转发功能,编辑/etc/sysctl.conf
将里面的net.ipv4.ip_forward = 0改为net.ipv4.ip_forward = 1,当然也可以使用命令
echo "1" > /proc/sys/net/ipv4/ip_forward。
在主机B上安装相应的包启动web服务(端口号为80),ssh服务(端口号为22),ftp服务(端口号为23)
通过以上的配置各个主机之间就能相互通信,主机C能通过主机A的转发功能访问主机B上开启的服务。值得注意的是在开启ftp服务前一定首先编辑/etc/sysconfig/iptables-config文件在IPTABLES_MODULES=""里面加上ip_conntrack_ftp模块,即改为PTABLES_MODULES="ip_conntrack_ftp"
试验内容:
在主机A上作如下设置;
iptables -F 清空以前配的防火墙的规则
iptables -P FORWARD DROP将FORWARD链的默认规则设为DROP
此时主机C不能与主机B进行通信,也不能访问主机B上开启的服务。作如下设置可以使各个主机之间相互通信
iptables -A FORWARD -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 0 -j ACCEPT
此时主机C依然不能访问主机B上所开启的服务
要想使主机C访问主机上B上的web服务可以做以下设置
iptables -A FORWORD -s 192.168.10.135 -d 10.10.10.135 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
#使主机B能够接受主机C来自80端口的访问,使主机B能够接受到主机C的请求
iptables -A FORWARD -s 192.168.10.135 -d 10.10.10.135 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
#主机B在接收到主机C的请求后能够通过80端口做出应答
但此时主机C依然无法访问主机B的ssh服务,要想使主机C能够通过ssh访问主机B上的资源可以做一下设置
iptables -A FORWARD -s 10.10.10.135 -d 192.168.10.135 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.10.10.135 -d 192.168.10.135 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
这样主机C就能通过ssh使用主机B上的资源了
要想是主机C能够通过ftp访问主机B上的资源可以做一下设置
iptables -A FORWARD -s 10.10.10.135 -d 192.168.10.135 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 10.10.10.135 -s 192.168.10.135 -p tcp --sport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.10.10.135 -d 192.168.10.135 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 10.10.10.135 -s 192.168.10.135 -m state --state RELATED,ESTABLISHED -j ACCEPT
细心的读者会发现,为什么ftp需要四条规则而web和ssh服务仅仅需要两条规则呢?这是因为主机C通过ftp访问主机B上的资源时要建立两个连接,一个是连接控制的连接,一个是数据传输的连接,因此才会有四条命令。
现在来看下一条关于目标地址转换命令:
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to-dest 192.168.1.2
这条命令的意思是如果有人通过外网访问我的1.1.1.1主机的80端口,就把它转换为内网的地址为192.168.1.2这个主机上,
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to-dest 192.168.1.2:8080
这条命令的意思是本地的8080提供web服务,如果有人访问1.1.1.1主机的80端口的话,就把它转换为本地主机192.168.1.2的8080端口
如果单独拒绝某个主机的话可以使用;
iptables �CA FORWORD �Cs 192.168.10.11 �Cd 192.168.100.0/24 �Cj DROP
这条命令的意思是禁止192.168.10.11这台主机访问192.168.100.0/24这个网段内的主机
有时我们想记录别人对某台主机的访问日志,这时可以使用
iptables �CA FORWORD �Cs 192.168.10.11 �Cd 192.168.100.0/24 �Cj LOG �Clog-prefix “From ssh”
#值得注意的是当我们想记录访问成功与不成功的日志的时候,一定要把记录日志的规则放到拒绝规则的前面。
DNAT典例:
设置防火墙主机发布内网中的Web服务器和FTP服务器
iptables �Ct nat �CA PREROUTING �Cd 202.102.139.1 �Cp tcp -�Cdport 80 �Cj DNAT --to-destination 192.168.0.2
# iptables �Ct nat �CA PREROUTING �Cd 202.122.139.1 �Cp tcp -�Cdport 21 �Cj DNAT --to-destination 192.168.0.3
网关上的外网接口为202.122.139.1
关于转发的经典总结摘自《iptables 中文指南》感谢作者
因为DNAT要做很多工作,所以我要再罗嗦一点。我们通过一个例子来大致理解一 下它是如何工作的。比如,我想通过Internet连接发布我们的网站,但是HTTP server在我们的内网里,而 且我们对外只有一个合法的IP,就是防火墙那个对外的IP――$INET_IP。防火墙还 有一个内网的IP――$LAN_IP,HTTP server的IP是$HTTP_IP (这当然是内网的了)。为了完成我们的设想,要做的第一件事就是把下面的这个简单的规则加入到nat表 的PREROUTING链中:
iptables -t nat -A PREROUTING --dst $INET_IP -p tcp --dport 80 -j DNAT \ --to-destination $HTTP_IP 
现在,所有从Internet来的、到防火墙的80端口去的包都会被转发(或称做被DNAT )到在内网的HTTP服务器上。如果你在Internet上试验一下,一切正常吧。再从内网里试验一下,完全 不能用吧。这其实是路由的问题。下面我们来好好分析这个问题。为了容易阅读,我们把在外网上访问我们 服务器的那台机子的IP地址记为$EXT_BOX。
包从地址为$EXT_BOX的机子出发,去往地址为$INET_IP 的机子。
包到达防火墙。
防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。 
包离开防火墙向$HTTP_IP前进。
包到达HTTP服务器,服务器就会通过防火墙给以回应,当然,这要求把防火墙作为HTTP到达$EXT_BOX的网关。一般情况下,防火墙就是HTTP服务器的缺省网关。
防火墙再对返回包做Un-DNAT(就是照着DNAT的步骤反过来做一遍),这样就 好像是防火墙自己回复了那个来自外网的请求包。
返回包好象没经过这么复杂的处理、没事一样回到$EXT_BOX。
现在,我们来考虑和HTTP服务器在同一个内网(这里是指所有机子不需要经过路由器而可以直接互相访 问的网络,不是那种把服务器和客户机又分在不同子网的情况)的客户访问它时会发生什么。我们假设客户机的IP为$LAN_BOX,其他设置同上。
包离开$LAN_BOX,去往$INET_IP。
包到达防火墙。
包被DNAT,而且还会经过其他的处理。但是包没有经过SNAT 的处理,所以包还是使用它自己的源地址,就是$LAN_BOX(译者注:这就是IP 传输包的特点,只根据目的地的不同改变目的地址,但不因传输过程中要经过很多路由器而随着路由器改变 其源地址,除非你单独进行源地址的改变。其实这一步的处理和对外来包的处理是一样的,只不过内网包的 问题就在于此,所以这里交待一下原因)。
包离开防火墙,到达HTTP服务器。
HTTP服务器试图回复这个包。它在路由数据库中看到包是来自同一个网络的一台机子,因此它会把回 复包直接发送到请求包的源地址(现在是回复包的目的地址),也就是$LAN_BOX。 
回复包到达客户机,但它会很困惑,因为这个包不是来自它访问的那台机子。这样,它就会把这个包 扔掉而去等待“真正”的回复包。
针对这个问题有个简单的解决办法,因为这些包都要进入防火墙,而且它们都去往需要做DNAT才能到达 的那个地址,所以我们只要对这些包做SNAT操作即可。比如,我们来考虑上面的例子,如果对那些进入防火墙而且是去往地址为$HTTP_IP、端口为80的包做SNAT操作,那么这些包就好象是从$LAN_IP来的了,也就是 说,这些包的源地址被改为$LAN_IP了。这样,HTTP服务器就会把回复包发给防火墙,而防火墙会再对包做 Un-DNAT操作,并把包发送到客户机。解决问题的规则如下:
iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \ --to-source $LAN_IP 
要记住,按运行的顺序POSTROUTING链是所有链中最后一个,因此包到 达这条链时,已经被做过DNAT操作了,所以我们在规则里要基于内网的地址$HTTP_IP(包的目的地)来匹配 包。









你可能感兴趣的:(防火墙,职场,iptables,休闲)