iptables详解

Iptables防火墙介绍:


Iptables是管理Netfilter的唯一工具,Netfilter直接嵌入在Linux内核。他可以为个人工作站创建一个防火墙,也可以为一个子网创建防火墙,以保护其他的系统平台(市场上有很大一部分硬件防火墙也是使用iptables系统的)。
Netfilter在内核中过滤,没有守护进程,在OSI模型的第2、3、4层插入策略。过滤的速度非常快,因为他只读取数据包头,不会给信息流量增加负担,也无需进行验证。
Netfilter提供了一系列的表(tables),每个表由若干个链(chains)组成,而每条链可以由一条或若干条规则(rules)组成。

实际上netfilter是表的容器,表是链的容器,而链又是规则的容器。


Netfilter
表和Netfilter链:

表说明:
Filter这个表主要执行数据包过滤。
Nat主要进行网络地址转换。
Managle用于修改一些特殊的规则。
链说明:
PREROUTING路由之前,刚到达的数据包。(nat)
INPUT通过路由,目的地为本机的数据包。(filter)
FORWARD需要通过本地系统进行转发的数据包。(filter)
OUTPUT由本机产生,向外转发,处于POSTROUTING之前的数据包。(nat和filter)
POSTROUTIONG通过路由后,即将离开系统的数据包。(nat)
Netfilter的数据包流程:
Iptables 基本语法:
iptables 内置了filter、nat 和mangle 三张表,我们可以使用-t 参数来设置对哪张表生效,也可以省略-t 参数,则默认对filter 表进行操作。

图中:这句的意思就是:来自(源地址)192.168.0.1的INPUT链的数据包直接丢弃。
Iptables进程服务命令:
service iptables save 保存iptables设置,对iptables规则编辑后一定要保存。
service iptables restart 保存设置以后不重启则设置不生效,要设置生效请重启。
service iptables status 检查iptables的设置。类似于iptable –L命令。
Iptables基本的链操作命令:
-L 列出某个链或者表中的规则: service iptables status 把这个命令和-L比较下
iptables –L显示filter表中的规则等同于iptables –t filter -L

iptables –t nat –L 显示nat表的中的设置:
-F 删除某个链或者表中的规则:
iptables –F (iptables –t filter –F) 删除filter表中的所有规则;
iptables –t nat –F 删除nat表中的所有规则;
iptables –t nat –F POSTROUTING 删除nat表中POSTROUTING链的所有规则;

-A添加一条规则(在当前的规则后添加,也就是排在所有规则后):
iptables -A INPUT –s 192.168.0.1 –j DROP
和实例图中的功能相同,丢弃来自192.168.0.1的数据包,这里省略了-t filter。
添加该语句后,保存设置并重新启动iptalbes 服务,并通过-L的命令查看,就会发现刚添加的这条规则排列在所有规则后。
-----------iptables的匹配规则是按顺序排列的。
-I在指定位置插入一条规则:
(如果有回环规则(iptables –A INPUT –I lo –j ACCEPT,则回环永远是第一条)
iptables –I <CHAIN> 作为第一条规则插入。
iptables <CHAIN> X 作为第X条规则插入,X这里代表规则顺序号。
iptables –A INPUT –p tcp –s 192.168.0.1/24 --dport 22 –jACCEPT大家把这条写法记住,以后经常会用到。

允许192.168.0.1 通过22端口访问该主机,把它作为第一条规则插入iptables规则列表。

-----------iptables的匹配规则是按顺序排列的。
-P <CHAIN TARGET>
分配连接策略。
iptables –P INPUT DROP 禁止任何输入的数据包。这句慎用。
iptables –P OUTPUT ACCEPT 允许所有输出的数据包。
-D删除某一条规则:
Iptables –D <CHAIN> X 删除某个链的第几条规则
iptables –D INPUT 3 删除INPUT链上的第3条规则。
iptables –P INPUT DROP 这个不能使用删除语句删除,只能到本机输入iptables –P INPUT ACCEPT
Iptables中的匹配:
iptables –A INPUT –p tcp –s 192.168.0.1 --dport 22 –jACCEPT
这个命令我们在上面已经看过了,我们来看下其他的一些匹配参数。
-p protocol 匹配网络协议,例子中匹配tcp协议。
-s IP地址或者网段 匹配源IP地址或者网段
例子中匹配一个IP的,如果要匹配一个网段则如下
-s 192.168.0.0/24
如果是除这个网段之外的所有则为:! -s 192.168.0.1/24
如果是除这个IP之外的所有则为! -s 192.168.0.1

--dport X 匹配目的端口号,X代表具体端口号。
--sport X 匹配源端口号,X代表具体端口号。
Iptables中的目的:
我们已经在前面看到过-j 后面跟的就是目的。
ACCEPT允许数据包通过。
DROP直接丢弃数据包。
REJECT丢弃数据包,同时发送响应报文通知对方。
设置Iptables预设规则(本地机防火墙):
1、清除iptables设置:iptables –F
2、设置回环允许规则,没有这个规则好多服务不能启动:
iptables –A INPUT –i lo –j ACCETP允许本地回环接口
iptables –A INPUT –p tcp --dport 20:21 –j ACCEPT 开放FTP的20、21端口。还记得我们将FTP的时候,如果开启防火墙。注意!!
iptables –A INPUT –P tcp --dport 80 –j ACCEPT开放http的80端口。
iptables –I INPUT –p tcp –dport 22 –j ACCEPT开放SSH服务的22端口。

4、iptables -A INPUT –j REJECT 禁止进入数据包----慎用该句。
5、iptables -P FORWARD DROP 禁止转发数据包
6、iptables -P OUTPUT ACCEPT允许外发数据包


设置Iptables FORWORD规则:
一般情况FORWORD链式DROP的,但是当用来做NAT的时候我们就需要设置他了。
首先要开启转发功能:编辑/etc/sysctl.conf文件
sysctl -p来使修改生效


丢弃坏的TCP包。
#iptables -A FORWARD -p TCP ! --syn -m state --stateNEW -j DROP
处理IP碎片数量,防止***,允许每秒100个。
#iptables -A FORWARD -f -m limit --limit 100/s--limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包。
#iptables -A FORWARD -p icmp -m limit --limit 1/s--limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制。


NAT服务

(一).什么是私有地址

私有地址(Private address)属于非注册地址,是专门为组织机构内部使用而划定的。使用私有IP地址是无法直接连接到Internet的,但是能够用在公司内部的 Intranet的IP地址上 。

(二).什么是NAT

NAT是将一个地址域(如专用Intranet)映射到另一个地址域(如Internet)的标准方法。它是一个根据RFC 1631开发的IETF标准,允许一个IP地址域以一个公有IP地址出现在Internet上。NAT可以将内部网络中的所有节点的地址转换成一个IP地 址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外部发现,使外部无法直接访问内部网络设备。

NAT的工作原理


1.静态网络地址转换

① 在NAT服务器上建立静态NAT映射表。

② 当内部主机(IP地址为192.168.16.10)需要建立一条到Internet的会话连接时,首先将请求发送到NAT服务器上。NAT服务器接收到请求后,会根据接收到的请求数据包检查NAT映射表。

③ 如果已经为该地址配置了静态地址转换,NAT服务器就使用相对应的公有IP地址,并转发数据包,否则NAT服务器不对地址进行转换,直接将数据包丢弃。 NAT服务器使用202.96.128.2来替换内部私有IP(192.168.16.10)

④ Internet上的主机接收到数据包后进行应答(这时主机接收到202.96.128.2的请求)。

⑤ 当NAT服务器接收到来自Internet上的主机的数据包后,检查NAT映射表。如果NAT映射表存在匹配的映射项,则使用内部私有IP替换数据包的目IP地址,并将数据包转发给内部主机。如果不存在匹配映射项则将数据包丢弃。

动态网络地址转换

① 当内部主机(IP地址为192.168.16.10)需要建立一条到Internet的会话连接时,首先将请求发送到NAT服务器上。NAT服务器接收到 请求后,根据接收到的请求数据包检查NAT映射表。

② 如果还没有为该内部主机建立地址转换映射项,NAT服务器就会决定对该地址进行转换(建立 192.168.16.10:2320←→202.96.128.2:2320的映射项,并记录会话状态)。如果已经存在该映射项,则NAT服务器使用该 记录进行地址转换,并记录会话状态。然后NAT服务器利用转换后的地址发送数据包到Internet主机上。

③ Internet主机接收到信息后,进行应答,并将应答信息回传给NAT服务器。

④ 当NAT服务器接收到应答信息后,检查NAT映射表。如果NAT映射表存在匹配的映射项,则使用内部公有IP替换数据包的目的IP地址,并将数据包转发给 内部主机。如果不存在匹配映射项则将数据包丢弃。

网络地址端口转换

① 当内部主机(IP地址为192.168.16.10,使用端口1235)需要与Internet上的某主机(IP地址为202.18.4.6,端口为 2350)建立连接时,首先将请求发送到NAPT服务器上。NAPT服务器接收到请求后,会根据接收到的请求数据包检查NAPT映射表。

②如果还没有为该内部主机建立地址转换映射项,NAPT服务器就会为这个传输创建一个Session,并且给这个Session分配一个端口3200,然 后改变这个数据包的源端口为3200。所以原来的192.168.16.10:1235→202.18.4.6:2350数据包经过转换后变为了 202.96.128.2:3200→202.18.4.6:2350。

③ Internet主机接收到信息后进行应答,并将应答信息回传给NAPT服务器。

④ 当NAPT服务器接收到应答信息后,检查NAPT映射表。如果NAPT映射表存在匹配的映射项,则使用内部公有IP替换数据包的目的IP地址,并将数据包 转发给内部主机。如果不存在匹配映射项则将数据包丢弃。

NAT网络地址转换:将一个IP转换成另一个 IP(输入和输出)
网络地址转换类型:
目的地 NAT(DNAT):DNAT修改包的目的地位址的时机,必须在包即将被送到本机行程之前,或是要被转送其它电脑之前;所以,使用DNAT为目标的规则,必须设置于nat表格的PREROUTING链结。
源 NAT(SNAT,MASQUERADE):SNAT必须在封包即将离开核心的前一刻,即时修改其来源位址(或通讯端口),所以SNAT规则的设置地点必须是在nat表格的POSTROUTING链结。


NAT实例:


1.打开IP转发

现在我们的IP包已经可以出到广域网了,但是广域网上的路由器会丢弃我们内网的IP地址, 所以我们要做nat

好了,开始说到iptables了,要做nat就需要用到iptables的nat表

我们是从里面到外面的包,所以要修改源IP,就叫做源NAT

我们要出去,就是postrouting


首先需要打开ip_forward


现在我们来配置这条命令

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.8.0/24-j MASQUERADE

或者直接定义到两个接口

/sbin/iptables -t nat -A POSTROUTING -o "外网卡" -s "内网卡" -jMASQUERADE

我们来讲解这条命令

iptables 是命令本身

-t 是执行表,iptables有两个表,一个是filter:过滤的表

一个是nat,就是NAT表,Network Address Translator

然后-A,-A的意思就是添加一条链

这里添加的链是POSTROUTING链,就是源NAT

-o 是出去的网卡设备,我们使用的是eth1网卡

-s 是源地址,我们设置内网的192.168.8.0/24网段

-j是动作,MASQUERADE 动态源地址转换(动态IP的情况下使用)


如果我们使用的静态外网地址,就可以这样写

iptables -t nat -A POSTROUTING -o eth1-jSNAT --to1.1.1.1把出去的地址都转换成1.1.1.1


好了,现在内网用户可以通过linux网关上网了


端口重定向

把要进入eth1(eth1连接外网)80端口的数据包,重新定向到192.168.1.3的8080端口。配置squid的时候用到。

iptables -t nat -A PREROUTING -i ethl -p tcp --dport 80 -j DNAT - - to -destination 192.168.1.3:8080

端口映射

那么内网的WEB服务器如何将数据传出去呢?这个时候要通过SNAT来实现了。我们用端口映射来实现。

/sbin/iptables -t nat -A PREROUTING -p tcp -d 210.42.201.180 --dport 80 -j DNAT --to 192.168.1.181:80

/sbin/iptables -t nat -A POSTROUTING -d 192.168.1.181 -p tcp --dport 80 -j SNAT--to 192.168.1.1

注:210.42.201.180为公网IP地址。192.168.1.1是内网的网关。192.168.1.181是内网的web服务器


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章