iptables学习

这里推荐一位博主,个人感觉其写的有关iptables的介绍比较通俗易懂
推荐博客

介绍

来自维基百科对于netfilter和iptables的介绍:
netfilter是在linux内核中的一个软件框架,用于管理网络数据包,具备网络地址转换(NAT)、数据包内容修改和数据包修改等防火墙功能
而iptables是运行在用户空间的应用软件,通过控制linux内核netfilter模块来管理网络数据包的处理和转发,是一个配置工具,可以将其看作是一个客户端代理,而实际的防火墙功能是由netfilter提供的,这俩组合构成了真正的防火墙,属于包过滤防火墙
既然是配置工具,那肯定得有规则,iptables内定义了四张表。分别是filter、nat、mangle和raw表,功能如下:

  • filter:如其名,过滤
  • nat:网络地址转换
  • mangle:数据包修改
  • raw:不再让iptables做数据包的链接跟踪处理

解释一下链接跟踪处理,比如针对每一个连接都需要记录源地址、目的地址和连接状态等,尤其是网络地址转换时,而不再让iptables做数据包的链接跟踪处理的意思就是不再记录连接状态了,所以这样的规则一般适用于不需要做nat的情况下,这样可以提升性能
所以我们配置规则,也就是增删改符合这四条表上的规则

iptables工作在网络层,处理数据包,当我们启用iptables后,所有本机接收的数据包都会被限定在一个内核框架中传输
这个内核框架的形式如下所示(借助参考博客):
1
图中的方块是数据包所经过的不同阶段,每个阶段被称为链
iptables支持自定义链,但是该链必须要被嵌入到原有的链上

表如何应用到链上?

因为数据包是要经过这几条链的,所以自然我们会想到链上是有一些规则的,而这规则是定义在上面那四张表里的
但是每条链上并不是都有四张表里的规则的

  • prerouting链:只有raw、mangle和nat表上的规则可以在其上定义
  • input链:只有mangle、filter表上的规则可以在其上定义
  • forward链:只有mangle、filter表上的规则可以在其上定义
  • output链:四张表上的规则都可以在其上定义
  • POSTROUTING链:只有mangle、nat表上的规则可以在其上定义

每条链上有对应的规则表,这些表被匹配也是有顺序和优先级的
优先级:
raw>mangle>nat>filter
所以可以把上图改造为下图表链结合(借助参考博客):
2

基本过程

数据包到达本机网卡后,会首先经过PREROUTING链,先经过raw表的处理,前面说过raw表的作用是不再让iptables做数据包的链接跟踪处理,如果raw表没有进行处理,那么则要进行链接跟踪,随后经过mangle和nat表的处理
然后根据目的地,判断路由,看目标主机是否为本主机

本主机

如果目标主机是本主机,则进入input链,依次经过mangle、filter表的处理,然后交给本主机的应用程序进行处理,然后判断路由,看其发往哪,然后进入outpu链,依次经过四张表的处理,然后进入postrouting链,依次经过mangle、nat表的处理,进入到出口的网卡,结束

其他主机

不进input链,进入forward链,依次经过mangle、filter链的处理,进入postrouting链,经过mangle、nat表的处理,进入到出口的网卡,结束

注意我上面所说的表对数据包的处理的意思是:
表对每个数据包进行规则匹配,匹配成功执行指定动作,否则执行默认动作
动作有(iptables称为target):

  • accept:接收,允许通过
  • drop:丢弃并且没有回应信息
  • reject:拒绝并有回应消息
  • snat:源地址转换
  • masquerade:snat的一种特例
  • dnat:目标地址转换
  • redirect:本机端口映射
  • log:记录日志,不对数据包做任何操作

这里重点说一下snat和dnat

snat和dnat?

参考自这篇博客参考博客,简洁易懂
首先都是网络地址转换

  • snat是指数据包经过网卡时,把数据包中的源地址替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个地址
  • masquerade是指用该网卡上的IP来替换源地址IP,对于IP不固定,如dhcp自动分配ip的情况下使用
  • dnat是指数据包经过网卡时,修改数据包中的目的IP

DNAT通常用在prerouting链上,因为是进方向;snat一般用在postrouting上,因为是出方向,而路由发生在内部
比如,一个内网用户A,一个外网用户B,当A给B发完消息后,B要找到A,但是A是内网用户,如果不进行SNAT的话,B是不可能找到A的,此时这种内网连接外网的情形就得需要SNAP
而外网用户访问内部服务时,外网用户发起主动连接,此时需要将目的地址转到内网服务,所以需要DNAT
注意,连接状态是有记录的,人们可能会问,那比如在SNAT适用的场合中,为什么当外网返回响应时不再使用DNAT,其实在内部这个连接状态是有记录的,所以当需求返回来时,可通过该条记录来找到内网用户,而且外网用户此时是被动响应的,它也不清楚内网用户在哪儿呀,所以没法使用dmap对吧,只能找到那个转换地址,转换地址根据记录再返给内网用户

好了,iptables的基本原理算是了解了,具体指令不再探讨,下面看一个课程所要求做的一个实验

实验

实验要求

用netfilter/iptables可以将Linux 虚拟机配置成路由器,这需要用iptables命令将网卡设置成转发(NAT)模式。将 一台ubuntu虚拟机设置成路由器(配置2个虚拟网卡,内网和外网),一台windows虚拟机配置成客户端(内网),通过路由器访问Internet。

实验环境

Vmware(Ubuntu(16.0.4 4核4G)+Windows7)

实验步骤与内容

为linux虚拟机配置双网卡

首先按照实验要求,该虚拟机需要有两个网卡,一个用于连接内网,一个用于连接外网,也就是内网网卡接受的数据经外网网卡转发出去
所以首先我在vmware下配置该虚拟机的网卡
增加两个网络适配器,一个NAT模式(用于连接外网),一个仅主机模式
3
查看网卡信息:
输入命令“ifconfig”
4
发现有两个网卡,ens33和ens38
ens33信息:
IP地址:192.168.98.146
子网掩码:255.255.255.0
查看网关:192.168.98.2
ens38信息:
IP地址:192.168.109.131
子网掩码:255.255.255.0
ens33用于连接外网,ens38用于连接内网,为啥呢?因为ens33对应nat模式的适配器,可以通过查看适配器的属性来确认。
然后编辑/etc/network/interfaces文件设置网卡信息
打开发现里面并没有ens33和ens38,所以手动添加,添加后如下所示,与ipconfig信息相对应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# interfaces(5) file used by ifup(8) and if down(8)
auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
address 192.168.98.146
netmask 255.255.255.0
gateway 192.168.98.2
dns-nameservers 114.114.114.114

auto ens38
iface ens38 inet static
address 192.168.109.131
netmask 255.255.255.0

注意只能有一个网关,所以设置连接外网的
修改后,reboot设置生效

更改Windows虚拟机设置

将Windows网络适配器选项改为仅主机模式
利用ipconfig查看信息:
5
IP地址:192.168.109.129
子网掩码:255.255.255.0
默认网关:192.168.109.131
控制面板->网络和Internet->网络和共享中心->本地连接->属性->Internet协议版本4(TCP/IPv4)->属性
6
使用IP地址192.168.109.129
子网掩码:255.255.255.0
将默认网关设为ubuntu的内网网卡的IP地址:192.168.109.131
DNS服务器使用如下两个:
114.114.114.114和8.8.8.8
此时Windows可以ping通ubuntu
7
但ubuntu无法ping通Windows,此时可以更改Windows下的防火墙设置
控制面板->系统和安全->Windows防火墙->高级设置->入站规则->文件和打印机共享(回显请求-ICMPv4-In)->右键->启用规则
此时可以ping通:
8

利用iptables进行地址转发

默认情况下,ubuntu是禁用路由转发的,所以首先应开启路由转发功能:
将/etc/sysctl.conf中的net.ipv4.ip_forward=1注释取消,后reboot
在ubuntu下输入以下命令:
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -A FORWARD -i ens 38 -j ACCEPT
-t 使用该表
-A 针对该链
-o output
-j 动作
这个意思就是说构建一条规则:接收内网网卡ens38的数据并对其进行转发,将其来源地址伪装成外网网卡ens33的地址后通过外网网卡ens33转发出去,符合SNAT的使用情况,伪装源地址,以便后来外网网卡响应时仍能找到
后在Windows虚拟机中发现ping百度成功,即证明ubuntu实现了路由功能
9
通过sudo iptables -t nat -L -nv –line-number与sudo iptables -L -nv –line-number可以查看目前的规则
-L 列出表中所有规则
-n 直接显示IP地址,不进行解析
-v 显示更详细的信息
–line-number 显示行号
nat表中:
10
不加-t默认为filter表:
11