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/,结果如下图所示: