iptables详解

       netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

 

iptables基础

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规 则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的 主要工作就是添加、修改和删除这些规则。

 

iptables和netfilter的关系:

这是第一个要说的地方,Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。

 

iptables传输数据包的过程

① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

iptables的规则表和链:

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

     链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

Iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5成了四张表五个链了,不过多出来的那个表用的也不太多,所以基本还是和以前一样。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。

规则表:

1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包  内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw
(这个是REHL4没有的,不过不用怕,用的不多)

 

规则链:


1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

规则表之间的优先顺序:

Raw——mangle——nat——filter
规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向

从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向

来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

管理和设置iptables规则

 

iptables的基本语法格式

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

 

iptables命令的管理控制选项

复制代码

-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)

复制代码

防火墙处理数据包的四种方式

ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

 

iptables防火墙规则的保存与恢复

iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载

使用命令iptables-save来保存规则。一般用

iptables-save > /etc/sysconfig/iptables

生成保存规则的文件 /etc/sysconfig/iptables,

也可以用

service iptables save

它能把规则自动保存在/etc/sysconfig/iptables中。

当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

 

删除INPUT链的第一条规则

iptables -D INPUT 1

iptables防火墙常用的策略

1.拒绝进入防火墙的所有ICMP协议数据包

iptables -I INPUT -p icmp -j REJECT

 

2.允许防火墙转发除ICMP协议以外的所有数据包

iptables -A FORWARD -p ! icmp -j ACCEPT

说明:使用“!”可以将条件取反。

 

3.拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据

iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT

说明:注意要把拒绝的放在前面不然就不起作用了啊。

 

4.丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包

iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

 

5.封堵网段(192.168.1.0/24),两小时后解封。

# iptables -I INPUT -s 10.20.30.0/24 -j DROP
# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
# at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1

说明:这个策略咱们借助crond计划任务来完成,就再好不过了。
[1]   Stopped     at now 2 hours

 

6.只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。

iptables -A INPUT -p tcp –dport 22 -s 202.13.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j DROP

说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的SQL服务器需要被总公司的管理员管理时。

 

7.允许本机开放从TCP端口20-1024提供的应用服务。

iptables -A INPUT -p tcp –dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 20:1024 -j ACCEPT

 

8.允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。

iptables -A FORWARD -s 192.168.0.0/24 -p udp –dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp –sport 53 -j ACCEPT

 

9.禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机

iptables -I INPUT -p icmp –icmp-type Echo-Request -j DROP
iptables -I INPUT -p icmp –icmp-type Echo-Reply -j ACCEPT
iptables -I INPUT -p icmp –icmp-type destination-Unreachable -j ACCEPT

 

10.禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包

iptables -A FORWARD -m mac –mac-source 00:0c:29:27:55:3F -j DROP

说明:iptables中使用“-m 模块关键字”的形式调用显示匹配。咱们这里用“-m mac –mac-source”来表示数据包的源MAC地址。

 

11.允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280

iptables -A INPUT -p tcp -m multiport –dport 20,21,25,110,1250:1280 -j ACCEPT

说明:这里用“-m multiport –dport”来指定目的端口及范围

 

12.禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包。

iptables -A FORWARD -p tcp -m iprange –src-range 192.168.1.20-192.168.1.99 -j DROP

说明:此处用“-m –iprange –src-range”指定IP范围。

 

13.禁止转发与正常TCP连接无关的非—syn请求数据包。

iptables -A FORWARD -m state –state NEW -p tcp ! –syn -j DROP

说明:“-m state”表示数据包的连接状态,“NEW”表示与任何连接无关的,新的嘛!

 

14.拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包

iptables -A INPUT -p tcp -m state –state NEW -j DROP
iptables -A INPUT -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT

说明:“ESTABLISHED”表示已经响应请求或者已经建立连接的数据包,“RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等。

 

15.只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理。

复制代码

iptables -I INPUT -p tcp -m multiport –dport 20,21,80 -j ACCEPT
iptables -I INPUT -p tcp –dport 20450:20480 -j ACCEPT
iptables -I INPUT -p tcp -m state –state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP

文章参考  http://netfilter.org/ iptables官方网站
http://www.linux.gov.cn/netweb/iptables.htm iptables配置手册
http://man.chinaunix.net/
http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html iptables配置手册
http://blog.csdn.net/thmono/archive/2010/04/08/5462043.aspx
http://netsecurity.51cto.com/art/200512/14457.htm
http://blog.sina.com.cn/s/blog_40ba724c0100jz12.html
http://qiliuping.blog.163.com/blog/static/1023829320105245337799/

复制代码

 

iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工 作原理,你会发现其实它很简单。

首先介绍iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。   iptables基础知识详解
图: IPTables Table, Chain, and Rule Structure
一、iptables的表与链
iptables具有Filter, NAT, Mangle, Raw四种内建表:
1. Filter表
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
  • INPUT链 – 处理来自外部的数据。
  • OUTPUT链 – 处理向外发送的数据。
  • FORWARD链 – 将数据转发到本机的其他网卡设备上。
2. NAT表
NAT表有三种内建链:
  • PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
  • POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
  • OUTPUT链 – 处理本机产生的数据包。
3. Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
  • PREROUTING
  • OUTPUT
  • FORWARD
  • INPUT
  • POSTROUTING
4. Raw表
Raw表用于处理异常,它具有2个内建链:
  • PREROUTING chain
  • OUTPUT chain
5.小结
下图展示了iptables的三个内建表:
iptables基础知识详解
图: IPTables 内建表
二、IPTABLES 规则(Rules)
牢记以下三点式理解iptables规则的关键:
  • Rules包括一个条件和一个目标(target)
  • 如果满足条件,就执行目标(target)中的规则或者特定值。
  • 如果不满足条件,就判断下一条Rules。
目标值(Target Values)
下面是你可以在target里指定的特殊值:
  • ACCEPT – 允许防火墙接收数据包
  • DROP – 防火墙丢弃包
  • QUEUE – 防火墙将数据包移交到用户空间
  • RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
如果你执行iptables –list你将看到防火墙上的可用规则。下例说明当前系统没有定义防火墙,你可以看到,它显示了默认的filter表,以及表内默认的input链, forward链, output链。
# iptables -t filter –list
Chain INPUT (policy ACCEPT)
target    prot opt source              destinationChain FORWARD (policy ACCEPT)
target    prot opt source              destinationChain OUTPUT (policy ACCEPT)
target    prot opt source              destination

查看mangle表:
# iptables -t mangle –list
查看NAT表:
# iptables -t nat –list
查看RAW表:
# iptables -t raw –list
!注意:如果不指定   -t选项,就只会显示默认的   filter表。因此,以下两种命令形式是一个意思:
# iptables -t filter –list
(or)
# iptables –list
以下例子表明在filter表的input链, forward链, output链中存在规则:
# iptables –list
Chain INPUT (policy ACCEPT)
num        target                 prot    opt        source            destination
1    RH-Firewall-1-INPUT     all       —         0.0.0.0/0         0.0.0.0/0Chain FORWARD (policy ACCEPT)
num        target                 prot    opt        source            destination
1      RH-Firewall-1-INPUT   all        –      0.0.0.0/0           0.0.0.0/0Chain OUTPUT (policy ACCEPT)
num  target    prot opt source              destination

Chain RH-Firewall-1-INPUT (2 references)
num  target    prot opt source              destination
1    ACCEPT    all  –  0.0.0.0/0            0.0.0.0/0
2    ACCEPT    icmp –  0.0.0.0/0            0.0.0.0/0          icmp type 255
3    ACCEPT    esp  –  0.0.0.0/0            0.0.0.0/0
4    ACCEPT    ah  –  0.0.0.0/0            0.0.0.0/0
5    ACCEPT    udp  –  0.0.0.0/0            224.0.0.251        udp dpt:5353
6    ACCEPT    udp  –  0.0.0.0/0            0.0.0.0/0          udp dpt:631
7    ACCEPT    tcp  –  0.0.0.0/0            0.0.0.0/0          tcp dpt:631
8    ACCEPT    all  –  0.0.0.0/0            0.0.0.0/0          state RELATED,ESTABLISHED
9    ACCEPT    tcp  –  0.0.0.0/0            0.0.0.0/0          state NEW tcp dpt:22
10  REJECT    all  –  0.0.0.0/0            0.0.0.0/0          reject-with icmp-host-prohibited

以上输出包含下列字段:
  • num – 指定链中的规则编号
    target – 前面提到的target的特殊值
    prot – 协议:tcp, udp, icmp等
    source – 数据包的源IP地址
    destination – 数据包的目标IP地址
三、清空所有iptables规则
在配置iptables之前,你通常需要用iptables –list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则:
iptables –flush
或者
iptables -F
这两条命令是等效的。但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:
iptables -t NAT -F
四、永久生效
当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。为了让配置永久生效,根据平台的不同,具体操作也不同。下面进行简单介绍:
1.Ubuntu
首先,保存现有的规则:
iptables-save > /etc/iptables.rules
然后新建一个bash脚本,并保存到   /etc/network/if-pre-up.d/目录下:
#!/bin/bash
iptables-restore < /etc/iptables.rules
这样,每次系统重启后iptables规则都会被自动加载。
!注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。
2.CentOS, RedHat
# 保存iptables规则
service iptables save# 重启iptables服务
service iptables stop
service iptables start
查看当前规则:
cat  /etc/sysconfig/iptables
五、追加iptables规则
可以使用iptables -A命令追加新规则,其中   -A表示   Append。因此,   新的规则将追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用   -A参数添加新规则,那么就是无用功。
1.语法
iptables -A chain firewall-rule
  • -A chain – 指定要追加规则的链
  • firewall-rule – 具体的规则参数
2.描述规则的基本参数
以下这些规则参数用于描述数据包的协议、源地址、目的地址、允许经过的网络接口,以及如何处理这些数据包。这些描述是对规则的基本描述。
-p 协议(protocol)
  • 指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议。
  • 如果不指定-p参数,则默认是all值。这并不明智,请总是明确指定协议名称。
  • 可以使用协议名(如tcp),或者是协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols
  • 还可以使用–protocol参数代替-p参数
-s 源地址(source)
  • 指定数据包的源地址
  • 参数可以使IP地址、网络地址、主机名
  • 例如:-s 192.168.1.101指定IP地址
  • 例如:-s 192.168.1.10/24指定网络地址
  • 如果不指定-s参数,就代表所有地址
  • 还可以使用–src或者–source
-d 目的地址(destination)
  • 指定目的地址
  • 参数和-s相同
  • 还可以使用–dst或者–destination
-j 执行目标(jump to target)
  • -j代表”jump to target”
  • -j指定了当与规则(Rule)匹配时如何处理数据包
  • 可能的值是ACCEPT, DROP, QUEUE, RETURN,MASQUERADE
  • 还可以指定其他链(Chain)作为目标
  • 注:MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat(详情见上一篇文章)。
-i 输入接口(input interface)
  • -i代表输入接口(input interface)
  • -i指定了要处理来自哪个接口的数据包
  • 这些数据包即将进入INPUT, FORWARD, PREROUTE链
  • 例如:-i eth0指定了要处理经由eth0进入的数据包
  • 如果不指定-i参数,那么将处理进入所有接口的数据包
  • 如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包
  • 如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包
  • 还可以使用–in-interface参数
-o 输出(out interface)
  • -o代表”output interface”
  • -o指定了数据包由哪个接口输出
  • 这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链
  • 如果不指定-o选项,那么系统上的所有接口都可以作为输出接口
  • 如果出现! -o eth0,那么将从eth0以外的接口输出
  • 如果出现-i eth+,那么将仅从eth开头的接口输出
  • 还可以使用–out-interface参数
3.描述规则的扩展参数
对规则有了一个基本描述之后,有时候我们还希望指定端口、TCP标志、ICMP类型等内容。
–sport 源端口(source port)针对 -p tcp 或者 -p udp
  • 缺省情况下,将匹配所有端口
  • 可以指定端口号或者端口名称,例如”–sport 22″与”–sport ssh”。
  • /etc/services文件描述了上述映射关系。
  • 从性能上讲,使用端口号更好
  • 使用冒号可以匹配端口范围,如”–sport 22:100″
  • 还可以使用”–source-port”
–-dport 目的端口(destination port)针对-p tcp 或者 -p udp
  • 参数和–sport类似
  • 还可以使用”–destination-port”
-–tcp-flags TCP标志 针对-p tcp
  • 可以指定由逗号分隔的多个参数
  • 有效值可以是:SYN, ACK, FIN, RST, URG, PSH
  • 可以使用ALL或者NONE
-–icmp-type ICMP类型 针对-p icmp
  • –icmp-type 0 表示Echo Reply
  • –icmp-type 8 表示Echo
4.追加规则的完整实例:仅允许SSH服务
本例实现的规则将仅允许SSH数据包通过本地计算机,其他一切连接(包括ping)都将被拒绝。
# 1.清空所有iptables规则
iptables -F# 2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT# 3.拒绝所有其他数据包
iptables -A INPUT -j DROP

六、更改默认策略
上例的例子仅对接收的数据包过滤,而对于要发送出去的数据包却没有任何限制。本节主要介绍如何更改链策略,以改变链的行为。
1. 默认链策略
/!\警告:请勿在远程连接的服务器、虚拟机上测试!
当我们使用-L选项验证当前规则是发现,所有的链旁边都有   policy ACCEPT标注,这表明当前链的默认策略为ACCEPT:
# iptables -L
Chain INPUT (policy ACCEPT)
target    prot opt source              destination
ACCEPT    tcp  –  anywhere            anywhere            tcp dpt:ssh
DROP      all  –  anywhere            anywhereChain FORWARD (policy ACCEPT)
target    prot opt source              destinationChain OUTPUT (policy ACCEPT)
target    prot opt source              destination

这种情况下,如果没有明确添加DROP规则,那么默认情况下将采用ACCEPT策略进行过滤。除非:
a)为以上三个链单独添加DROP规则:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
b)更改默认策略:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
糟糕!!如果你严格按照上一节的例子配置了iptables,并且现在使用的是SSH进行连接的,那么会话恐怕已经被迫终止了!
为什么呢?因为我们已经把OUTPUT链策略更改为DROP了。此时虽然服务器能接收数据,但是无法发送数据:
# iptables -L
Chain INPUT    (policy DROP)
target    prot opt source              destination
ACCEPT    tcp  –  anywhere            anywhere            tcp dpt:ssh
DROP      all  –  anywhere            anywhereChain FORWARD (policy DROP)
target    prot opt source              destinationChain OUTPUT (policy DROP)
target    prot opt source              destination

七、配置应用程序规则
尽管5.4节已经介绍了如何初步限制除SSH以外的其他连接,但是那是在链默认策略为ACCEPT的情况下实现的,并且没有对输出数据包进行限 制。本节在上一节基础上,以SSH和HTTP所使用的端口为例,教大家如何在默认链策略为DROP的情况下,进行防火墙设置。在这里,我们将引进一种新的 参数-m state,并检查数据包的状态字段。
1.SSH
# 1.允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT# 2.允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
  • -m state: 启用状态匹配模块(state matching module)
  • –-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
  • –sport 22: sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务器而言,源端口就是22
  • –dport 22: ssh客户端程序可以从本机的随机端口与SSH服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22
如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:
# 1.送出的数据包目的端口为22
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT# 2.接收的数据包源端口为22
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
2.HTTP
HTTP的配置与SSH类似:
# 1.允许接收远程主机的HTTP请求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT# 1.允许发送本地主机的HTTP响应
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
3.完整的配置
# 1.删除现有规则
iptables -F# 2.配置默认链策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP# 3.允许远程主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT

# 4.允许本地主机进行SSH连接
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT

# 5.允许HTTP请求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT

文章3

1. netfilter与iptables

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)
  • 数据包内容修改
  • 以及数据包过滤的防火墙功能

Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。

1.1 filter、nat、mangle等规则表

filter表

主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:

  • INPUT链:INPUT针对那些目的地是本地的包
  • FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
  • OUTPUT链:OUTPUT是用来过滤所有本地生成的包

nat表

主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链:

  • PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址
  • OUTPUT链:改变本地产生的包的目的地址
  • POSTROUTING链:在包就要离开防火墙之前改变其源地址

mangle表

主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

raw表

是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING

iptables中数据包和4种被跟踪连接的4种不同状态:

  • NEW:该包想要开始一个连接(重新连接或将连接重定向)
  • RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的。
  • ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
  • INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。

1.2 INPUT、FORWARD等规则链和规则

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:

  • INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
  • OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  • FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
  • PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
  • POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。

防火墙处理数据包的方式(规则):

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
  • SNAT:源地址转换。在进入路由层面的route之前,重新改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。
    MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
  • DNAT:目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。
    REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

2. Linux数据包路由原理

我们已经知道了Netfilter和Iptables的架构和作用,并且学习了控制Netfilter行为的Xtables表的结构,那么这个Xtables表是怎么在内核协议栈的数据包路由中起作用的呢?

网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。是时候看这张图了:

从上图中,我们可以总结出以下规律:

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的”路由模块”根据”数据包目的IP”以及”内核中的路由表”判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
  • 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它
  • 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
  • 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)

我们在写Iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵活配置规则。

3. iptables编写规则

命令格式:

  • [-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
  • -A:新增一条规则,到该规则链列表的最后一行
  • -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
  • -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
  • -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
  • -P:设置某条规则链的默认动作
  • -nL-L-n,查看当前运行的防火墙规则列表
  • chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
  • [规则编号]:插入、删除、替换规则时用,--line-numbers显示号码
  • [-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
  • [-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等
  • [-s 源IP地址]:源主机的IP地址或子网地址
  • [--sport 源端口号]:数据包的IP的源端口号
  • [-d目标IP地址]:目标主机的IP地址或子网地址
  • [--dport目标端口号]:数据包的IP的目标端口号
  • -m:extend matches,这个选项用于提供更多的匹配参数,如:
    • -m state –state ESTABLISHED,RELATED
    • -m tcp –dport 22
    • -m multiport –dports 80,8080
    • -m icmp –icmp-type 8
  • <-j 动作>:处理数据包的动作,包括ACCEPT、DROP、REJECT等
要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过我们的计算机。

首先我们要弄明白,防火墙将怎么对待 这些数据包。这些数据包会经过一些相应的规则链,比如要进入你的计算机的数据包会首先进入INPUT链,从我们的计算机发出的数据包会经过 OUTPUT链,如果一台计算机做一个网络的网关(处于内网和外网两个网络连接的两台计算机,这两台计算机之间相互通讯的数据包会经过这台计算机,这台计 算机即相当于一个路由器),可能 会有很多数据经过这台计算机,那么这些数据包必经FORWARD链,FORWARD链即数据转发链。明白了这些“链”的概念我们才能进一步学习使用 iptables。

现在我们再来分析一下iptables规则是如何工作的,假如我们要访问网站www.yahoo.com,我们要对www.yahoo.com发出请 求,这些数据包要经过OUTPUT链,在请求发出前,Linux的内核会在OUTPUT链中检查有没有相应的规则适合这个数据包,如果没有相应的规 则,OUTPUT链还会有默认的规则,或者允许,或者不允许(事实上,不允许有两种,一种是把请求拒绝,告诉发出请示的程序被拒绝;还有一种是丢弃,让请 求发出者傻等,直到超时)。如果得到允许,请求就发出了,而www.yahoo.com服务器返回的数据包会经过INPUT链,当然,INPUT链中也会 有相应的规则等着它。

下面我们介绍几个iptable的命令
iptables -L [-t filter]
这条命令是显示当前有什么已经设置好的防火墙规则,可能的显示结果如下:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

从这里我们可以看出,iptables 有三个链分别是 INPUT OUTPUT 和FORWARD.
其中
INPUT 是外部数据要进过我们主机的第一外关卡(当然你前面也可以再加硬件防火墙).
OUTPUT 是你的主机的数据送出时要做的过绿卡
FORWARD   是转发 你在NAT时才会用到
要设置iptables 主要是对这三条链进行设置,当然也包括-nat的另外三个链 我们以后再说
你要用iptables 你就得启到它 启动命令 service iptables restart
iptables的默认设置为 三条链都是ACCEPT 如下:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
以上信息你可以用 iptables -L看到
总体来说iptables可以有二种设置
1.默认允许,拒绝特别的
2.默认拒绝,允许特别的
二者都有自己有特点,从安全角度看 个人偏向于第二种,就是默认拒绝,允许特别的.但iptalbes 默认是第一种 默认允许,拒绝特别的
你可以用命令改变默认值来达到我们的要求 命令如下
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
你再用iptables -L查看一下就会觉得默认值以改了
先来谈炎几个参数XZFL
-F 清除规则
-X 清除链
-Z 将链的记数的流量清零
一般来说 再创建访问规则时 都会将原有的规则清零 这是一个比较好的习惯,因为某些规则的存在会影响你建的规则.
基本语法:
iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] [-io interface]
[-p tcp,udp.icmp,all] [-s ip/nerwork] [–sport ports]
[-d ip/netword] [–dport ports] [-j ACCEPT DROP]
以上是iptables的基本语法
A 是添加的意思
I 是播入的意思
io 指的是数据要进入或出去所要经过的端口 如eth1 eth0 pppoe等
p 你所要指定的协议
-s 指源地址 可是单个IP如192.168.2.6 也可以是一个网络 192.168.2.0/24 还可以 是一个域名 如163.com 如果你填写的域名系统会自动解析出他的IP并在iptables里 显示
–sport 来源端口
-d 同-s相似 只不过他指的是目标地址 也可以是IP 域名 和网络
–dport 目标端口
-j 执行参数 ACCEPT DROP
注意:如果以有参数存在 则说明全部接受
1 如我要来自己l0接口的数据全部接受,我们可以写成这样:
iptables -A INPUT -i lo -j ACCEPT
2 如果我们想接受192.168.2.6这个IP地址传来的数据我们可以这样写
iptablse -A INPUT -i eth1 -p tcp -s 192.168.2.6 -j ACCEPT
3 如果我们要拒绝来自己192.168.2.0/24这个网的telnet连接
iptablse -A INPUT -i eth1 -p udp -s 192.168.2.0/24
–sport 23 -j DROP

分类: LINUX

iptables 指令
语法:
iptables [-t table] command [match] [-j target/jump]
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。个规则表的功能如下:

nat 此规则表拥有 Prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行 来源网址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将 会造成无法对同一包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。

mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三个规则链。
除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。

filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链,这个规则表顾名思义是用来进行封包过滤的理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。

常用命令列表
命令 -A, –append
范例 iptables -A INPUT …
说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。
命令 -D, –delete
范例 iptables -D INPUT –dport 80 -j DROP
使用iptables -L -n  –line-number  可以查看到每个规则chain  的序列号,只能这样才能删除指定的规则。
iptables -D INPUT 1
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
命令 -R, –replace
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行规则,规则被取代后并不会改变顺序。
命令 -I, –insert
范例 iptables -I INPUT 1 –dport 80 -j ACCEPT
iptables -I INPUT 1 -p tcp –sport 80 -j ACCEPT
说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
命令 -L, –list
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。
命令 -F, –flush
范例 iptables -F INPUT
说明 删除某规则链中的所有规则。
命令 -Z, –zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
命令 -N, –new-chain
范例 iptables -N allowed
说明 定义新的规则链。
命令 -X, –delete-chain
范例 iptables -X allowed
说明 删除某个规则链。
命令 -P, –policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
命令 -E, –rename-chain
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称。
常用封包比对参数:
参数 -p, –protocol
范例 iptables -A INPUT -p tcp
说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp …等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
参数 -s, –src, –source
范例 iptables -A INPUT -s 192.168.1.1
说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。
参数 -d, –dst, –destination
范例 iptables -A INPUT -d 192.168.1.1
说明 用来比对封包的目的地 IP,设定方式同上。
参数 -i, –in-interface
范例 iptables -A INPUT -i eth0
说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对,例如:-i ! eth0。
参数 -o, –out-interface
范例 iptables -A FORWARD -o eth0
说明 用来比对封包要从哪片网卡送出,设定方式同上。
参数 –sport, –source-port
范例 iptables -A INPUT -p tcp –sport 22
说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:–sport 22:80,表示从 22 到 80 埠之间都算是符合件,如果要比对不连续的多个埠,则必须使用 –multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
参数 –dport, –destination-port
范例 iptables -A INPUT -p tcp –dport 22
说明 用来比对封包的目的地埠号,设定方式同上。
参数 –tcp-flags
范例 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN
说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)
PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子行反向比对。
参数 –syn
范例 iptables -p tcp –syn
说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。
参数 -m multiport –source-port
范例 iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110
说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。
参数 -m multiport –destination-port
范例 iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110
说明 用来比对不连续的多个目的地埠号,设定方式同上。
参数 -m multiport –port
范例 iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80 目的地埠号为 110,这种封包并不算符合条件。
参数 –icmp-type
范例 iptables -A INPUT -p icmp –icmp-type 8
说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp –help 来查看有哪些代码可用。
参数 -m limit –limit
范例 iptables -A INPUT -m limit –limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封
数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。
参数 –limit-burst
范例 iptables -A INPUT -m limit –limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。
参数 -m mac –mac-source
范例 iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。
参数 –mark
范例 iptables -t mangle -A INPUT -m mark –mark 1
说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。
参数 -m owner –uid-owner
范例 iptables -A OUTPUT -m owner –uid-owner 500
说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。
参数 -m owner –gid-owner
范例 iptables -A OUTPUT -m owner –gid-owner 0
说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数 -m owner –pid-owner
范例 iptables -A OUTPUT -m owner –pid-owner 78
说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
参数 -m owner –sid-owner
范例 iptables -A OUTPUT -m owner –sid-owner 100
说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。
参数 -m state –state
范例 iptables -A INPUT -m state –state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。

INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

常用的处理动作:
-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、

SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(natostrouting)。
REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是
tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
iptables -A FORWARD -p TCP –dport 22 -j REJECT –reject-with tcp-reset
DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式
porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE –to-ports 1024-31000
LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。例如:
iptables -A INPUT -p tcp -j LOG –log-prefix “INPUT packets”
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT –to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination
192.168.1.1-192.168.1.10:80-100
MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费…….等。
RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp –dport 22 -j MARK –set-mark 2

分类: LINUX

网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能有所帮助。
网管员的安全意识要比空喊Linux安全重要得多。

iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
首先,把三个表清空,把自建的规则清空。

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
先把“回环”打开,以免有不必要的麻烦。

iptables -A INPUT -i eth+ -p icmp –icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp –icmp-type 0 -j ACCEPT
在所有网卡上打开ping功能,便于维护和检测。

iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp –sport 22 -j ACCEPT
打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入)

iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp –sport 3128 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.168.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.168.0/24 -p tcp –sport 3128 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -p tcp –dport 32768:61000 -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp –sport 32768:61000 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p udp –dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp –sport 53 -j ACCEPT
上面这几句是比较头痛的,我做逐一解释。

iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
允许192.168.100.0/24网段的机器发送数据包从eth0网卡进入。如果数据包是tcp协议,而且目的端口是3128(因为REDIRECT已经把80改为3128了。nat表的PREROUTING是在filter表的INPUT前面的。)的,再而且,数据包的状态必须是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,换句话说就是,允许客户端机器向服务器发出链接申请。ESTABLISHED表示通过握手已经建立起链接),通过。

iptables -A OUTPUT -o eth2 -p tcp –sport 32768:61000 -m state –state NEW,ESTABLISHED -j ACCEPT
我们先来看这一句。现在你的数据包已经进入到linux服务器防火墙上来了。squid需要代替你去访问,所以这时,服务器就成了客户端的角色,所以它要使用32768到61000的私有端口进行访问。(大家会奇怪应该是1024到65535吧。其实CentOS版的linux所定义的私有端口是32768到61000的,你可以通过cat /proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次声明:这里是squid以客户端的身份去访问其他的服务器,所以这里的源端口是32768:61000,而不是3128!

iptables -A INPUT -i eth2 -p tcp –dport 32768:61000 -m state –state ESTABLISHED -j ACCEPT
当然了,数据有去就有回。

iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp –sport 3128 -m state –state ESTABLISHED -j ACCEPT
数据包还得通过服务器,转到内网网卡上。请注意,这里,是squid帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而squid是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是3128,而不是32768:61000。

iptables -A OUTPUT -o eth2 -p udp –dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp –sport 53 -j ACCEPT
当然,DNS是不可缺少的。

iptables -A INPUT -i eth+ -p tcp –dport 80 -j LOG –log-prefix “iptables_80_alert” –log-level info
iptables -A INPUT -i eth+ -p tcp –dport 21 -j LOG –log-prefix “iptables_21_alert” –log-level info
iptables -A INPUT -i eth+ -p tcp –dport 22 -j LOG –log-prefix “iptables_22_alert” –log-level info
iptables -A INPUT -i eth+ -p tcp –dport 25 -j LOG –log-prefix “iptables_25_alert” –log-level info
iptables -A INPUT -i eth+ -p icmp –icmp-type 8 -j LOG –log-prefix “iptables_icmp8_alert” –log-level info
当然了,来点日志记录会对网管员有所帮助。

iptables 基本命令使用举例

一、链的基本操作
1、清除所有的规则。
1)清除预设表filter中所有规则链中的规则。
# iptables -F
2)清除预设表filter中使用者自定链中的规则。
#iptables -X
#iptables -Z
2、设置链的默认策略。一般有两种方法。
1)首先允许所有的包,然后再禁止有危险的包通过放火墙。
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT
2)首先禁止所有的包,然后根据需要的服务允许特定的包通过防火墙。
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
3、列出表/链中的所有规则。默认只列出filter表。
#iptables -L
4、向链中添加规则。下面的语句用于开放网络接口:
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -i eth0 -j ACEPT
#iptables -A OUTPUT -o eth1 -j ACCEPT
#iptables -A FORWARD -i eth1 -j ACCEPT
#iptables -A FORWARD -0 eth1 -j ACCEPT
注意:由于本地进程不会经过FORWARD链,因此回环接口lo只在INPUT和OUTPUT两个链上作用。
5、使用者自定义链。
#iptables -N custom
#iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP
#iptables -A INPUT -s 0/0 -d 0/0 -j DROP
二、设置基本的规则匹配
1、指定协议匹配。
1)匹配指定协议。
#iptables -A INPUT -p tcp
2)匹配指定协议之外的所有协议。
#iptables -A INPUT -p !tcp
2、指定地址匹配。
1)指定匹配的主机。
#iptables -A INPUT -s 192.168.0.18
2)指定匹配的网络。
#iptables -A INPUT -s 192.168.2.0/24
3)匹配指定主机之外的地址。
#iptables -A FORWARD -s !192.168.0.19
4)匹配指定网络之外的网络。
#iptables -A FORWARD -s ! 192.168.3.0/24
3、指定网络接口匹配。
1)指定单一的网络接口匹配。
#iptables -A INPUT -i eth0
#iptables -A FORWARD -o eth0
2)指定同类型的网络接口匹配。
#iptables -A FORWARD -o ppp+
4、指定端口匹配。
1)指定单一端口匹配。
#iptables -A INPUT -p tcp –sport www
#iptables -A INPUT -p udp –dport 53
2)匹配指定端口之外的端口。
#iptables -A INPUT -p tcp –dport !22
3)匹配端口范围。
#iptables -A INPUT -p tcp –sport 22:80
4)匹配ICMP端口和ICMP类型。
#iptables -A INOUT -p icmp –icimp-type 8
5)指定ip碎片。

个网络接口都有一个MTU(最大传输单元),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数据包
(称为ip碎片)来传输,而接受方则对这些ip碎片再进行重组以还原整个包。这样会导致一个问题:当系统将大数据包划分成ip碎片传输时,第一个碎片含有
完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。因此,检查后面的ip碎片的头部(象有
TCP、UDP和ICMP一样)是不可能的。假如有这样的一条规则:
#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT
并且这时的FORWARD的policy为DROP时,系统只会让第一个ip碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通过—fragment/-f 选项来指定第二个及以后的ip碎片解决上述问题。
#iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
注意现在有许多进行ip碎片攻击的实例,如DoS攻击,因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。
三、设置扩展的规则匹配(举例已忽略目标动作)
1、多端口匹配。
1)匹配多个源端口。
#iptables -A INPUT -p tcp -m multiport –sport 22,53,80,110
2)匹配多个目的端口。
#iptables -A INPUT -p tcp -m multiport –dpoort 22,53,80
3)匹配多端口(无论是源端口还是目的端口)
#iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
2、指定TCP匹配扩展
使用 –tcp-flags 选项可以根据tcp包的标志位进行过滤。
#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN
#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK
上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。
#iptables -A FORWARD -p tcp –syn
选项—syn相当于”–tcp-flags SYN,RST,ACK SYN”的简写。
3、limit速率匹配扩展。
1)指定单位时间内允许通过的数据包个数,单位时间可以是/second、/minute、/hour、/day或使用第一个子母。
#iptables -A INPUT -m limit –limit 300/hour
2 )指定触发事件的阀值。
#iptables -A INPUT -m limit –limit-burst 10
用来比对一次同时涌入的封包是否超过10个,超过此上限的包将直接丢弃。
3)同时指定速率限制和触发阀值。
#iptables -A INPUT -p icmp -m limit –-limit 3/m –limit-burst 3
表示每分钟允许的最大包数量为限制速率(本例为3)加上当前的触发阀值burst数。任何情况下,都可保证3个数据包通过,触发阀值burst相当于允许额外的包数量。
4)基于状态的匹配扩展(连接跟踪)
每个网络连接包括以下信息:源地址、目标地址、源端口、目的端口,称为套接字对(socket pairs);协议类型、连接状态(TCP协议)
和超时时间等。防火墙把这些信息称为状态(stateful)。状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单包过滤防火墙具有更大的安全性,命令格式如下:
iptables -m state –-state [!]state [,state,state,state]
其中,state表是一个逗号分割的列表,用来指定连接状态,4种:
>NEW: 该包想要开始一个新的连接(重新连接或连接重定向)
>RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:
FTP的数据传输连接和控制连接之间就是RELATED关系。
>ESTABLISHED:该包属于某个已经建立的连接。
>INVALID:该包不匹配于任何连接,通常这些包被DROP。
例如:
(1)在INPUT链添加一条规则,匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包。
#iptables -A INPUT -m state –state RELATED,ESTABLISHED
(2)在INPUT链链添加一条规则,匹配所有从非eth0接口来的连接请求包。
#iptables -A INPUT -m state -–state NEW -i !eth0
又如,对于ftp连接可以使用下面的连接跟踪:
(1)被动(Passive)ftp连接模式。
#iptables -A INPUT -p tcp –sport 1024: –dport 1024: -m state –-state ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -p tcp –sport 1024: –dport 1024: -m
state -–state ESTABLISHED,RELATED -j ACCEPT
(2)主动(Active)ftp连接模式
#iptables -A INNPUT -p tcp –sport 20 -m state –-state ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -p tcp –OUTPUT -p tcp –dport 20 -m state –state ESTABLISHED -j ACCEPT

分类: LINUX

1.概述

1.1 什么是NAT

在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改, 更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。

1.2 为什么要进行NAT

我们来看看再什么情况下我们需要做NAT。

假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW 服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过NAT技术使发给其中某 一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。

再比如使用拨号上网的网吧,因为只有一个合法的IP地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其 是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用NAT来解决这个 问题,

因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。

还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。

1.3 NAT的类型

在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。

2.原理

下图是linux2.4的原理图:

   在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux 核心中一个通用架构,它提供了一系列的”表”(tables),每个表由若干”链”(chains)组成,而每条链中可以有一条或数条规则(rule)组 成。并且系统缺省的表是”filter”。但是在使用NAT的时候,我们所使用的表不再是”filter”,而是”nat”表,所以我们必须使用”-t nat”选项来显式地指明这一点。因为系统缺省的表是”filter”,所以在使用filter功能时,我们没有必要显式的指明”-t filter”。

同filter表一样,nat表也有三条缺省的”链”(chains),这三条链也是规则的容器,它们分别是:

PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT;
POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。
OUTPUT:定义对本地产生的数据包的目的NAT规则。
3.操作语法

如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用”-t nat”显示的指明使用nat表。然后使用以下的选项:

3.1 对规则的操作

加入(append) 一个新规则到一个链 (-A)的最后。
在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
在链内某个位置替换(replace) 一条规则 (-R)。
在链内某个位置删除(delete) 一条规则 (-D)。
删除(delete) 链内第一条规则 (-D)。
3.2 指定源地址和目的地址

通过–source/–src/-s来指定源地址(这里的/表示或者的意思,下同),通过–destination/–dst/-s来指定目的地址。可以使用以 下四中方法来指定ip地址:

使用完整的域名,如“www.linuxaid.com.cn”;
使用ip地址,如“192.168.1.1”;
用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;
用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是UNIX环境中通常使用的表示方法。缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。
3.3 指定网络接口

可以使用–in-interface/-i或–out-interface/-o来指定网络接口。从NAT的原理可以看出,对于 PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。

3.4 指定协议及端口

可以通过–protocol/-p选项来指定协议,如果是udp和tcp协议,还可–source-port/–sport和 –destination-port/–dport来指明端口。

4.准备工作

4.1 编译内核,编译时选中以下选项,具体可参看“用iptales实现包过虑型防火墙”一文:

Full NAT
MASQUERADE target support
REDIRECT target support
4.2 要使用NAT表时,必须首先载入相关模块:
modprobe ip_tables
modprobe ip_nat_ftp

iptable_nat 模块会在运行时自动载入。

5.使用实例

5.1 源NAT(SNAT)

比如,更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT –to 1.2.3.4

这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。

有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使用。比如
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

可以看出,这时候我们没有必要显式的指定源ip地址等信息。

5.2 目的SNAT(DNAT)

比如,更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT –to 1.2.3.4

这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。

有一种DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网 络接口的ip地址。通常是在与squid配置形成透明代理时使用,假设squid的监听端口是3128,我们可以通过以下语句来将来自 192.168.1.0/24,目的端口为80的数据包重定向到squid监听端口:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 –dport 80 -j REDIRECT –to-port 3128

6.综合例子

6.1 使用拨号带动局域网上网

小型企业、网吧等多使用拨号网络上网,通常可能使用代理,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域网上网。

成功升级内核后安装iptables,然后执行以下脚本:

#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
#进行ip伪装
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

6.2 ip映射

假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW 服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务 器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。

我们假设以下情景:

该ISP分配给A单位www服务器的ip为:

伪ip:192.168.1.100

真实ip:202.110.123.100

该ISP分配给B单位www服务器的ip为:

伪ip:192.168.1.200

真实ip:202.110.123.200

linux防火墙的ip地址分别为:

内网接口eth1:192.168.1.1

外网接口eth0:202.110.123.1

然后我们将分配给A、B单位的真实ip绑定到防火墙的外网接口,以root权限执行以下命令:

ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0

成功升级内核后安装iptables,然后执行以下脚本:

#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp

首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):

iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT –to 192.168.1.100
iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT –to 192.168.1.200

其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):

iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT –to 202.110.123.100
iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT –to 202.110.123.200

这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和 192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由 202.110.123.100和202.110.123.200,从而也就实现了ip映射。

分类: LINUX

本文旨在用为公司做防火墙的实例,让大家对Linux+iptables做防火墙的安装和配置有一个大致的了解,希望能起到抛砖引玉的作用。

系统环境与网络规化

先了解一下公司的环境,公 司利用2M ADSL专线上网,电信分配公用IP为218.4.62.12/29,网关为218.4.62.13 ,公司有电脑五十多台,使用DHCP,IP是192.168.2.XXX,DHCP Server建在iptables Server上;另公司有一电脑培训中心,使用指定固定IP,IP为192.168.20.XXX,为了更加快速的浏览网页,我们架了一台Squid Server,所有电脑通过Squid Server浏览网页,公司还另有一台WEB Server+Mail Server+Ftp Server。其IP为218.4.62.18。以上电脑和服务器要求全架在防火墙内。我们规化如下:

Iptables Server上有三块网卡,eth0上加有二个IP,218.4.62.14和218.4.62.18。

其中 218.4.62.14为共享上网,218.4.62.18为WEB Server专用,Eth1的IP为192..168.2.9;为了使培训中心PC与公司PC之间互不访问,所以直接从Iptables Server接到Switch-B,eth2接至Switch-A,连接培训中心PC和Squid Server, Web Server。

网络规化好了后,就开始装服务器了,Iptables Server 用的系统为Redhat Linux V7.3。在装服务器时要注意选上防火墙的安装包。

IPTABLES基础

Iptables语法:

Iptables [-t TABLE] ACTION [PATTERN] [-j TARGET]

TABLE:

有filter,nat,mangle;若无指定,预设为filter table.

ACTION(对Chains执行的动作):

ACTION 说明

-L Chain 显示Chain中的所有规则

-A Chain 对Chain新增一条规则

-D Chain 删除Chain中的一条规则

-I Chain 在Chain中插入一条规则

-R Chain 替换Chain中的某一条规则

-P Chain 对Chain设定的预设的Policy

-F Chain 清除Chain中的所有规则

-N Chain 自订一个Chain

-X 清除所有的自订Chain

CHAINS:

Iptables 有五条默认的Chains(规则链),如下表:

Chains 发生的时机

PREROUTING 数据包进入本机后,进入Route Table前

INPUT 数据包通过Route Table后,目地为本机

OUTPUT 由本机发出,进入Route Table前

FORWARD 通过Route Table后,目地不是本机时

POSTROUTING 通过Route Table后,送到网卡前

PATTERN(设定条件部份):

参数 内容 说明

-p Protocol 通讯协议,如tcp,udp,icmp,all等。。。

-s Address 指定的Source Address为Address

-d Address 指定的Destination Address为Address

-I Interface 指定数据包进入的网卡

-o Interface 指定数据包输出的网卡

-m Match 指定高级选项,如mac,state,multiport等。。。

TARGET(常用的动作):

TARGET 说明

ACCEPT 让这个数据包通过

DROP 丢弃数据包

RETURN 不作对比直接返回

QUEUE 传给User-Space的应用软件处理这个数据包

SNAT nat专用:转译来源地址

DNAT nat专用:转译目地地址

MASQUERADE nat专用:转译来源地址成为NIC的MAC

REDIRECT nat专用:转送到本机的某个PORT

用/etc/rc.d/init.d/iptables save可在/etc/sysconfig/中产生一iptables文件,大家可以看到,它有三个*号开始的行,其每一个以*号开始的行对应一个 table,以COMMIT表示此table 的结束。可将要定的规则加入到对应的table中,如下:

[root@jiaoyuang init.d]# ./iptables saveSaving current rules to /etc/sysconfig/iptables: [ OK ][root@jiaoyuang init.d]# cat /etc/sysconfig/iptables

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*mangle

:PREROUTING ACCEPT [61522:8074850]

:OUTPUT ACCEPT [1079:79301]

COMMIT

# Completed on Sat Sep 28 16:51:22 2002

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*nat

:PREROUTING ACCEPT [31850:5091703]

:POSTROUTING ACCEPT [20:1240]

:OUTPUT ACCEPT [12:776]

COMMIT

# Completed on Sat Sep 28 16:51:22 2002

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*filter

:INPUT ACCEPT [61444:8070296]

:FORWARD ACCEPT [34:1984]

:OUTPUT ACCEPT [1079:79301]

COMMIT

安装并启动IPTABLES

在安装RedHat Linux V7.3后,iptables就已经被安装了,但默认启动的是ipchains。你在安装时所定义的一些规则也在/etc/sysconfig /ipchains中被定义。我们需要将其停止,才能启动iptables(注意:虽然不停止ipchains也可以启动iptables,但这时 iptables并没有真正的起作用。Ipchains和iptables是两个防火墙,你只能选择一个)。

service ipchains stop (停止ipchains)

chkconfig –level 2345 ipchains off (使ipchains系统启动时不自动启动)

chkconfig –level 2345 iptables on (使iptables 在系统启动时自动启动)

vi /etc/rc.d/rc.local (编辑rc.local,将下面四行加到最后)

ifconfig eth0 add 218.4.62.18 netmask 255.255.255.248

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

echo “1” > /proc/sys/net/ipv4/ip_forward

(第一行是在eth0上再加一个IP:218.4.62.18,因在安装时只能设一个IP:218.4.62.14。Ip_conntrack_ftp 和ip_nat_ftp为iptables运得必须的两个模块;最后一行为使开启服务器IP转发功能。)

(如果你将iptables的模块加到了内核中,以上第二,三行可省略。)

配置DHCP Server,以便让公司PC自动获得IP和网关,网关为192.168.2.9。具体的方法请参见相关资料,本文不作详述。

reboot

重新启动服务器后,Iptables 就已经开始运行了。

配置IPTABLES

对iptables 有了一个基本的了解后,我们就可以来配置我们的服务器了。首先要发布我们的WEB Server,将以下二行加入/etc/sysconfig/iptables中的nat table内:

-A PREROUTING -d 218.4.62.18 -j DNAT –to-destination 192.168.20.254

-A POSTROUTING -s 192.168.2.254 -j SNAT –to-source 218.4.62.18

第一行为将至服务器的所有 目地地址为218.4.62.18的包都NAT为192.168.2.254,第二行为将至服务器的所有源地址为192.168.2.254的包为NAT 到218.4.62.18。请把WEB Server 的网关设为192.168.20.9。

下面我们将所有从服务器共享出去的包都SNAT为218.4.62.14,就可完成共享上网的功能了:

-A POSTROUTING -s 192.168.0.0/16 -j SNAT –to-source 218.4.62.14

将下面的规则加入到/etc/sysconfig/iptables中的filter tables内:

-A INPUT -p icmp -m icmp –icmp-type 8 -m limit –limit 6/min –limit-burst 2 -j ACCEPT

-A INPUT -p icmp -m icmp –icmp-type 8 -j REJECT –reject-with icmp-port-unreachable

以上两行是为了防止Dos攻击做的一个简单的处理,大家对于各种攻击可做出相应的处理。

-A INPUT –i eth0 –m state –state ESTABLISHED,RELATED –j ACCEPT-A INPUT –i eth0 –j DROP

以上两行是做了一个INPUT状态防火墙的处理,其主要作用为防止外部的连接和攻击,因其接受ESTABLISHED,RELATED状态(一个包分为NEW,ESTABLISHED,RELATED,INVALID四种状态)的包,故又不妨碍从本机出去的连接。

由于并不是所有的电脑都可以上网,所以还要对共享上网的电脑做一个限制:

IP限制:

-A FORWARD –s 192.168.2.0/29 –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –s 192.168.2.0/29 –p tcp –m multiport –port 3128,110,25 –j ACCEPT

-A FORWARD –s 192.168.20.253 –j ACCEPT

充许 192.168.2.0~192.168.2.7和 192.168.20.253(squid server)的电脑可上网和发邮件。3128是squid server的proxy port。我们用它去共享上网,110为pop3,25为smtp。Udp的53为DNS所要的port。不过由于使用的是DHCP,可能每次得到的IP 都不一样,所以我们就要用下面一种MAC限制的方法了。

MAC 限制:

-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

如上就可通过网卡来控制上网了,但现在电脑高手多多,改一个MAC的地址好像也不是什么难事了,怎么办呢?那就用我们的第三种方法吧。

MAC+IP限制:

更改/etc/dhcpd.conf,如果MAC与IP绑定:

subnet 192.168.2.0

netmask 255.255.255.0{

range 192.168.2.30 192.168.2.230;

option broadcast-address 192.168.2.255;

option routers 192.168.2.9;

option domain-name-servers 212.132.16.163;

host meeting-room {

hardware ethernet 00:50:ba:c8:4b:3a;

fixed-address 192.168.2.35;

}}

我们的Iptables改为:0

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

这样做之后,高手也无能为力了,不过公司有位MM是兄台的GF,上班的时候想和她聊聊天,培养培养感情;怎么办呢?我们知道QQ用的是udp的4000端口,如占用则4002,4003。。。那么就如下了:

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53,4000,4001,4002,4003,4004,4005 –j ACCEPT

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

最后加一句:

-A FORWARD –s 192.168.0.0/16 –j DROP

由于前面应该开的都开了,所以最后全部禁止。呵呵,到此大功告成。

总结

世界上没有绝对安全的防火 墙,安全永远是相对的。配置iptables的思路是先 ACCEPT再DROP。共享上网的办法还有一个就是用iptables server的Owner,但由于linux没有像win2k那样的验证模式,在验证owner时有些困难。本人正在测试,但目前还没有比较好的解决办 法,哪位兄弟搞定的话请Mail小弟,小弟将不胜感激。值得注意的是在做NAT时,客户端的网关一定要是iptagles的IP。

发表评论

电子邮件地址不会被公开。 必填项已用*标注