防火墙——NAT与iptables

来源:互联网 发布:幼儿美工室活动记录 编辑:程序博客网 时间:2024/05/22 15:55

一、Iptables

1、Linux Kernel中的包过滤防火墙

(1)Ipfw/ipfwadm

   2.0.*中使用移植于BSD的ipfw
   缺点:包过滤、NAT等代码混杂在整个网络相关代码中

(2)Ipchains

   2.2.*中使用

(3)Netfilter/iptables

   2.4.*iptables

   可以从 www.netfilter.org 下载
   模块化,支持状态跟踪

2、Netfilter/iptables

(1)可以实现完整的基于连接跟踪的包过滤防火墙
(2)Netfilter is the framework in Linux 2.4 kernels that allow for firewalling, NAT.
(Netfilter是Linux kernel 中对数据包进行处理的框架)
(3)Iptables is the userspace tools that works with the Netfilter framework

3、iptables结构示意图



4、表和链

(1)表

       
filter:实现数据报过滤
       
nat:网络地址转换 (NAT:Network Address Translator)
       
Mangle:  数据报处理

(2)链

       
INPUT:位于 filter 表,匹配目的 IP 是本机的数据包
       
FORWARD:位于 filter 表,匹配穿过本机的数据包
       
PREROUTING:位于 nat 表,用于修改目的地址(DNAT)
       
POSTROUTING:位于 nat 表,用于修改源地址  (SNAT)


5、Iptables 语法


iptables [-t 要操作的表]
          
<操作命令>
          
[要操作的链]
          
[规则号码]
          
[匹配条件]
          
[-j 匹配到以后的动作]


6、命令概述

操作命令(-A、-I、-D、-R、-P、-F)

查看命令(-[vnx]L)


(1)-A <链名>

   
 APPEND,追加一条规则(放到最后)
例如:
    iptables -t filter -A INPUT -j DROP

在 filter 表的 INPUT 链里追加一条规则(作为最后一条规则),匹配所有访问本机 IP 的数据包,匹配到的丢弃


(2)-I <链名> [规则号码]

    
INSERT,插入一条规则
例如:
    iptables -I INPUT -j DROP
    
在 filter 表的 INPUT 链里插入一条规则(插入成第 1 条)

    
    iptables -I INPUT 3 -j DROP
    
在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)


注意:
       
1、-t filter 可不写,不写则自动默认是 filter 表
      
2、-I 链名 [规则号码],如果不写规则号码,则默认是 1
       
3、确保规则号码 ≤ (已有规则数 + 1),否则报错


(3)-D <链名> <规则号码 | 具体规则内容>

    
DELETE,删除一条规则
例如:
    iptables -D INPUT 3(按号码匹配)
    
删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)

    
    iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配)
    
删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则(不管其位置在哪里)

注意:
    
1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
    
2、按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错
    
3、按内容匹配删除时,确保规则存在,否则报错


(4)-R <链名> <规则号码> <具体规则内容>

    
REPLACE,替换一条规则
例如:
    iptables -R INPUT 3 -j ACCEPT
    
将原来编号为 3 的规则内容替换为“-j ACCEPT”

注意:
    确保规则号码 ≤ 已有规则数,否则报错

(5)-P <链名> <动作>

    
POLICY,设置某个链的默认规则
例如:
    iptables -P INPUT DROP
    
设置 filter 表 INPUT 链的默认规则是 DROP

注意:
    当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理。动作前面不能加 –j,这也是唯一一种匹配动作前面不加 –j 的情况。


(6)-F [链名]

    
FLUSH,清空规则
例如:
    iptables -F INPUT
    
清空 filter 表 INPUT 链中的所有规则

    iptables -t nat -F PREROUTING
    
清空 nat 表 PREROUTING 链中的所有规则

注意:
    
1、-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则
    
2、-P 设置了 DROP 后,使用 -F 一定要小心!!!
    
3、如果不写链名,默认清空某表里所有链里的所有规则


(7)-L [链名]

    
LIST,列出规则
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
    
x:在 v 的基础上,禁止自动单位换算(K、M)
    
n:只显示 IP 地址和端口号码,不显示域名和服务名称


例如:

    iptables -L
    
粗略列出 filter 表所有链及所有规则

    iptables -t nat -vnL
    
用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号

    iptables -t nat -vxnL PREROUTING
    
用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解


7、匹配条件

流入、流出接口(-i、-o)

来源、目的地址(-s、-d)

协议类型    (-p)

来源、目的端口(--sport、--dport)



(1)按网络接口匹配

-i <匹配数据进入的网络接口>

例如:
    
-i eth0
    匹配是否从网络接口 eth0 进来

    
-i ppp0
    匹配是否从网络接口 ppp0 进来



-o 匹配数据流出的网络接口

例如:
    
-o eth0
    
-o ppp0



(2)按来源目的地址匹配

-s <匹配来源地址>
    
可以是 IP、NET、DOMAIN,也可空(任何地址)

例如:
    
-s 192.168.0.1     匹配来自 192.168.0.1 的数据包
    
-s 192.168.1.0/24  匹配来自 192.168.1.0/24 网络的数据包
    
-s 192.168.0.0/16  匹配来自 192.168.0.0/16 网络的数据包



-d <匹配目的地址>
    可以是 IP、NET、DOMAIN,也可以空

例如:
    
-d 202.106.0.20    匹配去往 202.106.0.20 的数据包
    
-d 202.106.0.0/16  匹配去往 202.106.0.0/16 网络的数据包
    
-d www.abc.com     匹配去往域名 www.abc.com 的数据包

(3)按协议类型匹配

-p <匹配协议类型>
    
可以是 TCP、UDP、ICMP 等,也可为空

例如:
    
-p tcp
    
-p udp
    
-p icmp --icmp-type 类型
    
ping: type 8


(4)按来源目的端口匹配


--sport <匹配源端口>
    
可以是个别端口,可以是端口范围

例如:
    
--sport 1000      匹配源端口是 1000 的数据包
    
--sport 1000:3000 匹配源端口是 1000-3000 的数据包(含1000、3000)
    
--sport :3000     匹配源端口是 3000 以下的数据包(含 3000)
    
--sport 1000:     匹配源端口是 1000 以上的数据包(含 1000)



--dport <匹配目的端口>
    
可以是个别端口,可以是端口范围

例如:
    
--dport 80        匹配目的端口是 80 的数据包
    
--dport 6000:8000 匹配目的端口是 6000-8000 的数据包(含6000、8000)
    
--dport :3000     匹配目的端口是 3000 以下的数据包(含 3000)
    
--dport 1000:     匹配目的端口是 1000 以上的数据包(含 1000)

注意:--sport 和 --dport 必须配合 -p 参数使用


(5)匹配应用举例


1、端口匹配
-p udp --dport 53

匹配网络中目的端口是 53 的 UDP 协议数据包


2、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16

匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包


3、端口和地址联合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80

匹配来自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 协议数据包



注意:

1、--sport、--dport 必须联合 -p 使用,必须指明协议类型是什么

2、条件写的越多,匹配越细致,匹配范围越小




8、动作(处理方式)

ACCEPT

DROP

SNAT

DNAT

MASQUERADE


(1)-j ACCEPT

    
通过,允许数据包通过本链而不拦截它
    
类似 Cisco 中 ACL 里面的 permit


例如:
    
iptables -A INPUT -j ACCEPT
    
允许所有访问本机 IP 的数据包通过


(2)-j DROP

    
丢弃,阻止数据包通过本链而丢弃它
    
类似 Cisco 中 ACL 里的 deny


例如:
    
iptables -A FORWARD -s 192.168.80.39 -j DROP
     
阻止来源地址为 192.168.80.39 的数据包通过本机


(3)-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 链)

    
源地址转换,SNAT 支持转换为单 IP,也支持转换到 IP 地址池
   (一组连续的 IP 地址)

例如:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \-j SNAT --to 1.1.1.1

将内网 192.168.0.0/24 的原地址修改为 1.1.1.1,用于 NAT


iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \-j SNAT --to 1.1.1.1-1.1.1.10

同上,只不过修改成一个地址池里的 IP

(4)-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 链)

    
目的地址转换,DNAT 支持转换为单 IP,也支持转换到 IP 地址池
   (一组连续的 IP 地址)

例如:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \-j DNAT --to 192.168.0.1

把从 ppp0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1


iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 \-j DNAT --to 192.168.0.2:80

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \-j DNAT --to 192.168.0.1-192.168.0.10

(5)-j MASQUERADE


动态源地址转换(动态 IP 的情况下使用)


例如:
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

将源地址是 192.168.0.0/24 据包进行地址伪装


9、附加模块


按包状态匹配   (state)

按来源 MAC 匹配(mac)

按包速率匹配   (limit)

多端口匹配     (multiport)

(1)state

-m state --state 状态

状态:NEW、RELATED、ESTABLISHED、INVALID
      
NEW:有别于 tcp 的 syn
      
ESTABLISHED:连接态
      
RELATED:衍生态,与 conntrack 关联(FTP)
      
INVALID:不能被识别属于哪个连接或没有任何状态

例如:
    iptables -A INPUT -m state --state RELATED,ESTABLISHED \-j ACCEPT

(2)mac

-m mac --mac-source MAC

匹配某个 MAC 地址


例如:
   
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx \-j DROP
   
阻断来自某 MAC 地址的数据包,通过本机

注意:
    
报文经过路由后,数据包中原有的 mac 信息会被替换,所以在路由后的 iptables 中使用 mac 模块是没有意义的


(3)limit

-m limit --limit 匹配速率 [--burst 缓冲数量]
    
用一定速率去匹配数据包

例如:
   
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s \-j ACCEPT
   
iptables -A FORWARD -d 192.168.0.1 -j DROP

注意:
 
limit 英语上看是限制的意思,但实际上只是按一定速率去匹配而已,要想限制的话后面要再跟一条 DROP

(4)multiport

-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]

一次性匹配多个端口,可以区分源端口,目的端口或不指定端口

例如:
   
iptables -A INPUT -p tcp -m multiport --dports \21,22,25,80,110 -j ACCEPT

注意:
    
必须与 -p 参数一起使用

10、iptables使用规则



所有链名必须大写   INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING

所有表名必须小写   filter/nat/mangle

所有动作必须大写   ACCEPT/DROP/SNAT/DNAT/MASQUERADE

所有匹配必须小写   -s/-d/-m <module_name>/-p


二、NAT

NAT:Network Address Translation

允许多个users使用Private IP Address并通过一个Public IP Address连接Internet

DNAT : Destination NAT,可用来改变Destination IP Address

SNAT : Source NAT,可用来改变Source IP Address

1、NAT



2、Private IP Address space


10.0.0.0     - 10.255.255.255

172.16.0.0   -172.31.255.255

192.168.0.0  -192.168.255.255

3、NAT实战


4、Nat网关实例

#out eth0 192.168.22.134

#in eth1 192.168.0.254

#Refresh all chains

iptables –F

#############Open ip_forward ##############

echo “1” >/proc/sys/net/ipv4/ip_forward   #ip_forward=1,启动封包转送


#############加载必要的模块 ############

/sbin/modprobe ip_tables    

/sbin/modprobe iptable_filter

/sbin/modprobe iptable_nat

/sbin/modprobe ip_conntrack         #IP连线追踪模块

/sbin/modprobe ip_conntrack_ftp     #FTP连线追踪模块

/sbin/modprobe ip_nat_ftp           #允许private side的主机使用ftp服务


5、Nat网关实例


#############Define nat ############

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE  #伪装

#############FORWARD DEFAULT POLICY############

iptables -P FORWARD DROP


###############Define packets################

iptables -A FORWARD -p tcp  -i eth0 -j ACCEPT

iptables -A FORWARD -p udp  -i eth0 -j ACCEPT

iptables -A FORWARD -p tcp  -i eth1 -j ACCEPT

iptables -A FORWARD -p udp  -i eth1 -j ACCEPT


################Define fregment rule###########

iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT


###############Define icmp rule##############

iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT


6、Nat网关实例


原创粉丝点击