iptables笔记


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

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


Netfilter表和Netfilter链:

 
表说明:
Filter
这个表主要执行数据包过滤。
Nat
主要进行网络地址转换。
Managle
用于修改一些特殊的规则。
链说明:
PREROUTING
路由之前,刚到达的数据包。(nat
INPUT
通过路由,目的地为本机的数据包。(filter)
FORWARD
需要通过本地系统进行转发的数据包。(filter
OUTPUT
由本机产生,向外转发,处于POSTROUTING之前的数据包。(natfilter
POSTROUTIONG
通过路由后,即将离开系统的数据包。(nat)
Netfilter
的数据包流程:


Iptables
基本语法:
iptables
内置了filternat mangle 三张表,我们可以使用-t 参数来设置对哪张表生效,也可以省略-t 参数,则默认对filter 表进行操作。


图中:这句的意思就是:来自(源地址)192.168.0.1INPUT链的数据包直接丢弃。
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 –j ACCEPT   大家把这条写法记住,以后经常会用到。

允许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 –j ACCEPT
这个命令我们在上面已经看过了,我们来看下其他的一些匹配参数。
-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
开放FTP2021端口。还记得我们将FTP的时候,如果开启防火墙。注意!!
iptables –A INPUT –P tcp --dport 80 –j ACCEPT
开放http80端口。
iptables –I INPUT –p tcp –dport 22 –j ACCEPT
开放SSH服务的22端口。

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

 


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


sysctl -p 
来使修改生效



 

NAT服务

().什么是私有地址

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

().什么是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来替换内部私有IP192.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:1235202.18.4.6:2350数据包经过转换后变为了 202.96.128.2:3200202.18.4.6:2350

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

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

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

 

NAT实例:

 

1.  打开IP转发

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

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

我们是从里面到外面的包,所以要修改源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 "内网卡" -j MASQUERADE

我们来讲解这条命令

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  -j  SNAT --to  1.1.1.1  把出去的地址都转换成1.1.1.1

 

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

 

端口重定向 

把要进入eth1(eth1连接外网)80端口的数据包,重新定向到192.168.1.38080端口。配置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

:

iptables –t nat –A PREROUTING –p tcp –i eth1 –dport 80 –j DNAT –to 192.168.1.181:80

iptables –t nat –A POSTROUTING –o  eth1 –s 192.168.1.0/24 –j  MASQUERADE

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

 

 

 

 

服务器iptabtles脚本设置:

vi /etc/rc.d/firewall

--------------------

#!/bin/bash

 

#清除规则

iptables -F

 

#允许127.0.0.1内部转发

iptables -A INPUT -i lo -j ACCEPT

 

#开放常用的端口

iptables -A INPUT -p TCP --dport 80 -j ACCEPT

iptables -A INPUT -p TCP --sport 80 -j ACCEPT

iptables -A INPUT -p TCP --dport 25 -j ACCEPT

iptables -A INPUT -p TCP --sport 25 -j ACCEPT

iptables -A INPUT -p TCP --dport 110 -j ACCEPT

iptables -A INPUT -p TCP --sport 110 -j ACCEPT

iptables -A INPUT -p TCP --dport 143 -j ACCEPT

iptables -A INPUT -p TCP --sport 143 -j ACCEPT

 

#SSH

iptables -A INPUT -p TCP --dport 59687 -j ACCEPT

iptables -A INPUT -p TCP --dport 9900 -j ACCEPT

iptables -A INPUT -p UDP --sport 53 -j ACCEPT

iptables -A INPUT -p TCP --sport 53 -j ACCEPT

#antispam

iptables -A INPUT -p TCP --sport 6220 -j ACCEPT

iptables -A INPUT -p TCP --sport 6610 -j ACCEPT

iptables -A INPUT -p TCP --sport 6611 -j ACCEPT

 

#SSL

iptables -A INPUT -p TCP --dport 995 -j ACCEPT

iptables -A INPUT -p TCP --dport 993 -j ACCEPT

iptables -A INPUT -p TCP --dport 465 -j ACCEPT

iptables -A INPUT -p TCP --dport 443 -j ACCEPT

 

#NTP date

iptables -A INPUT -p UDP --sport 123 -j ACCEPT

 

#snmp

iptables -A INPUT -i eth0 -p udp -s 125.76.229.215 --dport 161 -j ACCEPT

iptables -A INPUT -i eth0 -p udp -s 60.195.249.83 --dport 161 -j ACCEPT

 

iptables -P FORWARD DROP

iptables -A INPUT -j REJECT

iptables -P OUTPUT ACCEPT

 

 

#防止同步包洪水(Sync Flood

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

#防止各种端口扫描

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

#Ping洪水攻击(Ping of Death

iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

#屏蔽 SYN_RECV 的连接

iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT

-----------------------------

写完后将 sh /etc/rc.d/firewall命令写入/etc/rc.local目录下即可实现开机自动运行脚本。

你可能感兴趣的:(linux,iptables)