iptables firewall

Posted Zovt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables firewall相关的知识,希望对你有一定的参考价值。

iptables 防火墙

一、实验目的

1.学习iptables的工作机制

2.掌握iptables包过滤命令以及规则

二、实验环境

系统环境:Windows环境, kali环境,XP环境

三、实验原理

1.iptables简介
     从1.1内核开始,linux就已经具有包过滤功能了,在2.0的内核中我们采用ipfwadm来操作内核包过滤规则。之后在2.2内核中,采用了大家并不陌生的 ipchains来控制内核包过滤规则。在2.4内核中我们不再使用ipchains,而是采用一个全新的内核包过滤管理工具一iptables。这个全新的内核包过滤工具将使用户更易于理解其工作原理,更容易被使用,当然也将具有更为强大的功能。
     iptables只是一个内核包过滤的工具, iptables可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些过滤规则的是netfilter(Linux内核中一个通用架构)及其相关模块(如 iptables模块和 nat模块)。
     netfilter提供了一系列的“表(tables)”,每个表由若干“链(chains)”组成,而每条链中有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,链又是规则的容器。
     netfilter系统缺省的表为“filter”,该表中包含了INPUT、FORWARD和 OUTPUT3个链。
     每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件:如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据预先定义的策略(policy)来处理该数据包。

数据包在filter表中的流程如图9-2-1所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给那一条链,则可能有三种情况:

     (1)如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
     (2)如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
     (3)如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理如果没有通过规则检查,系统就会将这个包丢掉。
当我们在使用iptablesNAT功能的时候,我们所使用的表不再是“filter”表,而是“nat”表,所以我们必须使用“-tnat”选项来显式地指明。因为系统缺省的表是“filter",所以在使用filter 功能时,我们没有必要显式的指明“-tfilter”。同“filter”表一样,nat 表也有三条缺省的链,这三条链也是规则的容器,它们分别是:
     (1)PREROUTING;可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的IP地址,为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT。
     (2)POSTROUTING:可以在这里定义进行源NAT的规则,在路由器进行路由之后才进行源NAT。
     (3)OUTPUT:定义对本地产生的数据包的目的NAT规则。

2.iptables常用操作语法

功能 命令 语法 说明
添加规则 -A iptables-AINPUT-ptcp-jACCEPT 在所选择的规则链末尾添加规则,当源地址或目的地址是以名字而不是IP地址的形式出现时,这些名字将被解析为多个地址,这条规则将和所有可用的地址结合。
删除规则 -D iptables-DINPUT-ptcp-jACCEPT 从所选链中删除规则。有两种方法指定要删除的规则:一种方法是把规则完整定出,另一种方法是指定规则在所选链中的序号(每条链的规则都各自从1被编号)。
自定义链重命名 -E iptables-Ecustomlistuserlist 对自定义的链重命名,原来的名字在前,新名字在后。
清空规则 -F iptables-FINPUT 清空所选的链,如果没有指定链,则清空指定表中的所有链。默认情况下清空默认表所有的链。
插入规则 -I iptables-IINPUT1-ptcp-jACCEPT 在指定链内的某个位置插入规则,如果序号为1或没有序号,规则会被插入到的头部。
显示规则 -L iptables-LINPUT 显示所选链的所有规则,如果没有指定链,则显示指定表中的所有链。默认情况下显示默认表所有的链。精确输出受其它参数影响,如-n和-v等参数。
用户自定义链 -N iptables-Ncustomlist 根据用户指定的名字建立新的链。所用的名字不能和已有的链、target同名。
默认策略 -P iptables-PINPUTDROP 为链设置默认的target(ACCEPT、DROP、REJECT、REDIRECT、)。target称作策略,所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用策略,但内建的链和用户自定义链都不能被作为策略使用。
替换规则 -R iptables-RINPUT1-pudp-jACCETP 在所选中的链里指定的行上(每条链的规则都各自从1被编号)替换规则。它主要用于试验不同的规则。当源地址或目的地址是以名字而不是IP地址的形式出现时,如果这此名字可以被解析为多个地址,则这条命令会失败。
删除用户自定以链 -X iptables-Xcustomlist 删除指定的用户自定义链。这条链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,
计数器归零 -Z Iptables-Z 把指定链(如未指定则认为所有链)的所有计数器归零。

3.NAT工作原理
     NAT的基本思想是为每个企业分配一个IlP地址(或者是很少几个)来进行Internet 传输。在企业内部,每个电脑取得一唯一的IP地址来为内部传输做路由。然而,当封包离开企业,进入ISP之后,就需要进行地址转换了。为了使这个方案可行,IP地址的范围被声明为私有的,企业可以随意在内部使用他们。仅有的规则是,没有包含这些地址的封包出现在Internet上。

「说明」 IP私有地址范围是:10.0.0.0~10.255.255.255/8、172.16.0.0 ~172.31.255.255/12、192.168.0.0~192.168.255.255/16。

     如图9-2-2所示。在企业内部,每个机器都有一个唯一的172.16.x.y形式的地址。然而,当封包离开企业时,它要经过NAT转盒,NAT盒将内部IP源地址,即图中的172.16.0.50转换成企业的真实地址(这个地址对于Internet来说是可见的),此例中为202.198.168.150。NAT盒通常和防火墙一起绑定在一个设备上,这里的防火墙通过小心地控制进出企业的封包提供了安全保障。

4.NAT操作
     前面提到在 iptables防火墙中提供了3种策略规则表:Filter、Mangle和NAT,这3种表功能各不相同,而最为常用的就是filter和 nat表。
     nat表仅用于NAT,也就是网络地址转换。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于流的包只会经过这个表一次,经一个包被允许做 NAT,那么余下的包都会自动地做相同的操作。也就是说,余下的包不会再通过这个表一个一个的被NAT,而是自动完成的。常用操作分为以下几类。

     (1)SNAT(sourcenetworkaddresstranslation,源网络地址目标转换)

     SNAT是 POSTROUTING链表的作用,在封包就要离开防火墙之前改变其源地址,这在极大程度上可以隐藏本地网络或者DMz等。比如,多个PC机使用路由器共享上网,每个PC机都配置了内网IP(私有IP),PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的IP,当外部网络的服务器比如网站Web服务器接到访问请求的时候,它的日志记录下来的路由器的IP,而不是PC机的内网IP,这是因为,这个服务器收到的数据包的报头里边的“源地址”已经被替换了。所以叫做 SNAT,基于源地址的地址转换。

     例如更改所有来自192.168.0.1/24的数据包的源IP地址为10.0.0.1,其 iptables 实现为:iptables-tnat-APOSTROUTING-s192.168.0.1/24-oeth0-jSNAT--to-source202.98.0.150

     (2)DNAT(destinationnetworkaddresstranslation,目标网络地址转换)

     DNAT是 PREROUTING链表的作用,在封包刚刚到达防火墙时改变其目的地址,以使包能够被路由到某台主机。典型的应用是,有个 Web服务器放在企业网络 DMZ区,其配置了内网IP地址,企业防火墙的外网接口配置了企业唯一的公网IP,互联网上的访问者使用公网IP来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网IP,然后再把这个数据包发送到DMZ区的 Web服务器上,这样,数据包就穿透了防火墙,并从公网IP变成了一个对 DMZ区的访问了。所以叫做DNAT,基于目标的网络地址转换。

     例如更改所有来自202.98.0.1/24的数据包的目的IP地址为192.168.0.1,其 iptables实现为:iptables-tnat-APREROUTING-s202.98.0.1/24-ieth1-jDNAT--to192.168.0.1

     (3)REDIRECT(重定向)

     REDIRECT是 DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的IP地址改为数据包进入系统时的网络接口的IP地址。通常是在与squid配置形成透明代理时使用,假设squid 的监听端口是3128,我们可以通过以下语句来将来自192.168.0.1/24,目的端口为80的数据包重定向到squid 监听:iptables-tnat-APREROUTING-ieth1-ptcp-s192.168.0.1/24--dport80-jREDIRECT--to-port3128

     (4)MASQUERADE(地址伪装)

     在 iptables中有着和SNAT相近的效果,但也有一些区别。在使用SNAT的时候,出口IP的地址范围可以是一个,也可以是多个,

     例如把所有192.168.0.0/24网段数据包SNAT成202.98.0.150/202.98.0.151/202.98.0.152等几个IP然后发出去,其iptables实现为:iptables-tnat-APOSTROUTING-s192.168.0.0/24-oeth1-jSNAT--to-source202.98.0.150-202.98.0.152

     SNAT即可以NAT成一个地址,也可以NAT成多个地址。但是,对于SNAT来说不管是几个地址,必须明确指定转换的目标地址IP。假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口IP都会改变,而且改变的幅度很大,不一定是202.98.0.150到202.98.0.152范围内的地址,这个时候如果使用SNAT的方式来配置 iptables就会出现麻烦了,因为每次拨号后出口IP都会变化,而 iptables规则内的IP是不会随着自动变化的,每次地址变化后都必须手工修改一次 iptables,把规则里边的固定的IP改成新的IP,这样是非常不好用的。

     MASQUERADE就是针对这种场景而设计的,它的作用是从防火墙外网接口上自动获取当前IP地址来做NAT,比如下边的命令:iptables-tnat-APOSTROUTING-s192.168.0.0/24-oeth1-jMASQUERADE

四、实验步骤

  • NAT转换实验网络拓扑图如图9-2-34所示。内网主机与NAT服务器eth1接口位于同一内网网段,外网主机与NAT服务器eth0接口位于同一外网网段。通过对nat服务器的iptablesnat规则,实现内网、外网主机间的通信数据包的地址转换,打到屏蔽内部数据拓扑结构与转发外网主机请求端口的目的。

主机 IP地址
Win7内网主机 2.2.2.70/255.255.255.0
Kali Eth0:192.168.70.137/255.255.255.0
Eth1:2.2.2.1/255.255.255.0
XP外网主机 192.168.70.129/255.255.255.0

首先构建网络环境:
修改Win7主机为内网主机,修改其网卡IP地址为:2.2.2.70,修改其网关为2.2.2.1,如下图所示:

打开网络共享中心,更改适配器设置,右键点击本地连接,选中属性,在弹出的本地连接属性窗口中双击Internet协议版本ipv4,对IP地址进行设置,如下图所示:

开启主机kali增加一块网卡,点击设置,在弹出的虚拟机设置窗口点击添加按钮,选择添加网络适配器,如下图所示:

进入kali主机,输入ifconfig命令查看网络设备,可以看到新添加的网卡eth1,如下图所示:

接下来设置eth1静态IP地址为2.2.2.1,打开/etc/network/interfaces文件,添加以下内容:

auto eth1
iface eth1 inet static
address 2.2.2.1
netmask 255.255.255.0

使用命令打开interface文件添加:leafpad /etc/network/interfaces,如下图所示:

CTRL+S保存interfaces文件后,重启网卡命令:service networking restart,之后重启kali主机,如下图所示:

启动XP主机,获取XP主机IP地址为:192.168.70.129,如下图所示:

内网win7主机对NAT服务器kali主机的内网接口进行连通性测试(ping),如下图所示:

外网XP主机对NAT服务器kali主机的内网接口进行连通性测试(ping),如下图所示:

使用内网win7主机ping外网XP主机,请求超时网络不同,结果如下图:

  • 设置iptables规则允许内网主机访问外网主机
    首先输入命令如下,开启NAT服务器kali主机的路由功能:echo 1 >/proc/sys/net/ipv4/ip_forward
    清空filter链表全部规则,并设置其默认策略为DROP
    添加filter表新规则,允许来自内网的数据流进入外网,并且允许任何返回流量回到内网,实现NAT服务器内部网络接口eth1与外部网络接口eth0之间的数据转发
iptables -A FORWARD -I eth1 -o eth0 -s 2.2.2.0/24 -d any/0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

win7主机与XP主机中启动wireshark工具用于捕获ICMP数据包,内网主机win7主机中再次对外网XP主机进行ping连通测试,可以得知仍然未ping通,如下图所示:

XP主机中wireshark显示捕获到请求数据源地址为内网主机IP的ICMP数据包,如下图所示:

Win7主机wireshark中显示并未收到回显应答的ICMP数据包,如下图所示:

这是因为外网主机在未指定默认网关的情况下(同时没有相关路由信息),由于其回显应答的ICMP数据包目的地址为内网主机IP,与本地网络不处于同一网段,所以该数据包被丢弃。
外网XP主机添加静态路由,命令如下,所有发送2.2.2.0/24的数据包由192.168.70.137进行转发:Route add 2.2.2.0 mask 255.255.255.0 -p 192.168.70.137

输入命令route print 查看路由表,可以得知路由添加成功,如下图所示:

内网win7主机重新对XP主机进行ping连通测试,可以得知连接通过,如下图所示:

  • 设置iptables规则通过NAT屏蔽内部网络拓扑结构
    继续添加NAT表新规则,实现数据包从内网到外网的源地址转换,所有从eth0外出的源地址为2.2.2.0/24的数据包将源地址改为192.168.70.137,命令如下:iptables -t nat -A POSTROUTING -s 2.2.2.0/24 -o eth0 -j SNAT –to-source 192.168.70.137

在外网XP主机中删除添加的路由,命令如下,结果如下图所示:route delete 2.2.2.0

内网win7主机对XP进行ping连通测试,在XP主机wireshark中可以看到,其捕获的ICMP请求数据包的源IP地址为NAT服务器kali主机的IP地址,如下图所示:

整个流程为NAT服务器对来自内网主机的数据包做了SNAT,即替换数据包源IP地址为外网接口IP,然后再将转换后的数据包发送到外网中。在接收到应答包时,对数据包进行反向转换,即替换数据包的目的IP地址为内网主机IlP,然后再将反向转换后的数据包发送到内网中。

  • 设置防火墙规则实现内网服务被外网访问。当外网主机访问kali主机80端口时,防火墙进行网络地址翻译并自动将请求信息转发到内部win7主机 web服务器,实现对内部服务的屏蔽。
    在win7主机中启动apache服务,如下图所示:

在kali主机中将默认规则设置为ACCEPT,并使用浏览器访问内网主机Web主页http://2.2.2.70/,确认内部主机服务开启,结果如下图所示:

添加nat规则如下,实现80/tcp 请求数据从外网到内网的地址转换,命令如下:

iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -s any/0 -d 192.168.70.137 -j DNAT --to-dest 2.2.2.70
iptables -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -s any/0 -d 2.2.2.70 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

内部 win7主机与xp外部主机使用wireshark捕获tcp.port ==80数据包。xp主机使用浏览器访问http://192.168.70.137/,结果如下图所示:

以上是关于iptables firewall的主要内容,如果未能解决你的问题,请参考以下文章

基础部分之Firewall和iptables

iptables和firewalled的区别

CentOS7 禁用firewall防火墙 启用iptables 步骤

centos7 关闭firewall安装iptables并配置

centos7 关闭firewall安装iptables并配置

iptables&&firewall防火墙