2.1框架图
-->PREROUTING-->[ROUTE]-->FORWARD-->POSTROUTING-->
mangle|mangle^mangle
nat|filter|nat
||
||
v|
INPUTOUTPUT
|mangle^mangle
|filter|nat
v------>local------->|filter
2.2链和表
表
filter:顾名思义,用于过滤的时候
nat:顾名思义,用于做NAT的时候
NAT:NetworkAddressTranslator
链
INPUT:位于filter表,匹配
目的IP是本机的
数据包FORWARD:位于filter表,匹配穿过本机的数据包,
PREROUTING:位于nat表,用于修改目的
地址(DNAT)
POSTROUTING:位于nat表,用于修改源地址(SNAT)
3.1iptables语法概述
iptables[-t要操作的表]
<操作命令>
[要操作的链]
[
规则号码]
[匹配条件]
[-j匹配到以后的动作]
3.2命令概述
操作命令(-A、-I、-D、-R、-P、-F)
查看命令(-[vnx]L)
3.2.1-A
-A<链名>
APPEND,追加一条规则(放到最后)
例如:
iptables-tfilter-AINPUT-jDROP
在filter表的INPUT链里追加一条规则(作为最后一条规则)
匹配所有访问本机IP的数据包,匹配到的丢弃
3.2.2-I
-I<链名>[规则号码]
INSERT,插入一条规则
例如:
iptables-IINPUT-jDROP
在filter表的INPUT链里插入一条规则(插入成第1条)
iptables-IINPUT3-jDROP
在filter表的INPUT链里插入一条规则(插入成第3条)
注意:1、-tfilter可不写,不写则自动默认是filter表
2、-I链名[规则号码],如果不写规则号码,则默认是1
3、确保规则号码≤(已有规则数+1),否则报错
3.2.3-D
-D<链名><规则号码|具体规则内容>
DELETE,删除一条规则
例如:
iptables-DINPUT3(按号码匹配)
删除filter表INPUT链中的第三条规则(不管它的内容是什么)
iptables-DINPUT-s192.168.0.1-jDROP(按内容匹配)
删除filter表INPUT链中内容为-s192.168.0.1-jDROP的规则
(不管其位置在哪里)
注意:
1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
2、按号码匹配删除时,确保规则号码≤已有规则数,否则报错
3、按内容匹配删除时,确保规则存在,否则报错
3.2.3-R
-R<链名><规则号码><具体规则内容>
REPLACE,替换一条规则
例如:
iptables-RINPUT3-jACCEPT
将原来编号为3的规则内容替换为-jACCEPT
注意:
确保规则号码≤已有规则数,否则报错
3.2.4-P
-P<链名><动作>
POLICY,设置某个链的默认规则
例如:
iptables-PINPUTDROP
设置filter表INPUT链的默认规则是DROP
注意:
当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理
3.2.5-F
-F[链名]
FLUSH,清空规则
例如:
iptables-FINPUT
清空filter表INPUT链中的所有规则
iptables-tnat-FPREROUTING
清空nat表PREROUTING链中的所有规则
注意:
1、-F仅仅是清空链中规则,并不影响-P设置的默认规则
2、-P设置了DROP后,使用-F一定要小心!!!
3、如果不写链名,默认清空某表里所有链里的所有规则
3.2.6-[vxn]L
-L[链名]
LIST,列出规则
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在v的基础上,禁止自动单位换算(K、M)
n:只显示IP地址和
端口号码,不显示域名和服务名称
例如:
iptables-L
粗略列出filter表所有链及所有规则
iptables-tnat-vnL
用详细方式列出nat表所有链的所有规则,只显示IP地址和端口号
iptables-tnat-vxnLPREROUTING
用详细方式列出nat表PREROUTING链的所有规则以及详细数字,不反解
3.3匹配条件
流入、流出接口(-i、-o)
来源、目的地址(-s、-d)
协议类型(-p)
来源、目的端口(--sport、--dport)
3.3.1按网络接口匹配
-i<匹配数据进入的网络接口>
例如:
-ieth0
匹配是否从网络接口eth0进来
-ippp0
匹配是否从网络接口ppp0进来
-o匹配数据流出的网络接口
例如:
-oeth0
-oppp0
3.3.2按来源目的地址匹配
-s<匹配来源地址>
可以是IP、NET、DOMAIN,也可空(任何地址)
例如:
-s192.168.0.1匹配来自192.168.0.1的数据包
-s192.168.1.0/24匹配来自192.168.1.0/24网络的数据包
-s192.168.0.0/16匹配来自192.168.0.0/16网络的数据包
-d<匹配目的地址>
可以是IP、NET、DOMAIN,也可以空
例如:
-d202.106.0.20匹配去往202.106.0.20的数据包
-d202.106.0.0/16匹配去往202.106.0.0/16网络的数据包
-dwww.abc.com匹配去往域名www.abc.com的数据包
3.3.3按协议类型匹配
-p<匹配协议类型>
可以是TCP、UDP、ICMP等,也可为空
例如:
-ptcp
-pudp
-picmp--icmp-type类型
ping:type8pong:type0
3.3.4按来源目的端口匹配
--sport<匹配源端口>
可以是个别端口,可以是端口范围
例如:
--sport1000匹配源端口是1000的数据包
--sport1000:3000匹配源端口是1000-3000的数据包(含1000、3000)
--sport:3000匹配源端口是3000以下的数据包(含3000)
--sport1000:匹配源端口是1000以上的数据包(含1000)
--dport<匹配目的端口>
可以是个别端口,可以是端口范围
例如:
--dport80匹配源端口是80的数据包
--dport6000:8000匹配源端口是6000-8000的数据包(含6000、8000)
--dport:3000匹配源端口是3000以下的数据包(含3000)
--dport1000:匹配源端口是1000以上的数据包(含1000)
注意:--sport和--dport必须配合-p参数使用
3.3.5匹配应用举例
1、端口匹配
-pudp--dport53
匹配网络中目的地址是53的UDP协议数据包
2、地址匹配
-s10.1.0.0/24-d172.17.0.0/16
匹配来自10.1.0.0/24去往172.17.0.0/16的所有数据包
3、端口和地址联合匹配
-s192.168.0.1-dwww.abc.com-ptcp--dport80
匹配来自192.168.0.1,去往www.abc.com的80端口的TCP协议数据包
注意:
1、--sport、--dport必须联合-p使用,必须指明协议类型是什么
2、条件写的越多,匹配越细致,匹配范围越小
3.4动作(处理方式)
ACCEPT
DROP
SNAT
DNAT
MASQUERADE
3.4.1-jACCEPT
-jACCEPT
通过,允许数据包通过本链而不拦截它
类似Cisco中ACL里面的permit
例如:
iptables-AINPUT-jACCEPT
允许所有访问本机IP的数据包通过
3.4.2-jDROP
-jDROP
丢弃,阻止数据包通过本链而丢弃它
类似Cisco中ACL里的deny
例如:
iptables-AFORWARD-s192.168.80.39-jDROP
阻止来源地址为192.168.80.39的数据包通过本机
3.4.3-jSNAT
-jSNAT--toIP[-IP][:端口-端口](nat表的POSTROUTING链)
源地址转换,SNAT支持转换为单IP,也支持转换到IP地址池
(一组连续的IP地址)
例如:
iptables-tnat-APOSTROUTING-s192.168.0.0/24\
-jSNAT--to1.1.1.1
将内网192.168.0.0/24的原地址修改为1.1.1.1,用于NAT
iptables-tnat-APOSTROUTING-s192.168.0.0/24\
-jSNAT--to1.1.1.1-1.1.1.10
同上,只不过修改成一个地址池里的IP
3.4.4-jDNAT
-jDNAT--toIP[-IP][:端口-端口](nat表的PREROUTING链)
目的地址转换,DNAT支持转换为单IP,也支持转换到IP地址池
(一组连续的IP地址)
例如:
iptables-tnat-APREROUTING-ippp0-ptcp--dport80\
-jDNAT--to192.168.0.1
把从ppp0进来的要访问TCP/80的数据包目的地址改为192.168.0.1
iptables-tnat-APREROUTING-ippp0-ptcp--dport81\
-jDNAT--to192.168.0.2:80
iptables-tnat-APREROUTING-ippp0-ptcp--dport80\
-jDNAT--to192.168.0.1-192.168.0.10
3.4.5-jMASQUERADE
-jMASQUERADE
动态源地址转换(动态IP的情况下使用)
例如:
iptables-tnat-APOSTROUTING-s192.168.0.0/24-jMASQUERADE
将源地址是192.168.0.0/24的数据包进行地址伪装
3.5附加模块
按包状态匹配(state)
按来源MAC匹配(mac)
按包速率匹配(limit)
多端口匹配(multiport)
3.5.1state
-mstate--state状态
状态:NEW、RELATED、ESTABLISHED、INVALID
NEW:有别于tcp的syn
ESTABLISHED:连接态
RELATED:衍生态,与conntrack关联(FTP)
INVALID:不能被识别属于哪个连接或没有任何状态
例如:
iptables-AINPUT-mstate--stateRELATED,ESTABLISHED\
-jACCEPT
3.5.2mac
-mmac--mac-sourceMAC
匹配某个MAC地址
例如:
iptables-AFORWARD-m--mac-sourcexx:xx:xx:xx:xx:xx\
-jDROP
阻断来自某MAC地址的数据包,通过本机
注意:
MAC地址不过路由,不要试图去匹配路由后面的某个MAC地址
3.5.3limit
-mlimit--limit匹配速率[--burst缓冲数量]
用一定速率去匹配数据包
例如:
iptables-AFORWARD-d192.168.0.1-mlimit--limit50/s\
-jACCEPT
iptables-AFORWARD-d192.168.0.1-jDROP
注意:
limit仅仅是用一定的速率去匹配数据包,并非限制
3.5.4multiport
-mmultiport<--sports|--dports|--ports>端口1[,端口2,..,端口n]
一次性匹配多个端口,可以区分源端口,目的端口或不指定端口
例如:
iptables-AINPUT-ptcp-mmultiports--ports\
21,22,25,80,110-jACCEPT
注意:
必须与-p参数一起使用
4.实例分析
单服务器的防护
如何做网关
如何限制内网用户
内网如何做对外服务器
连接追踪模块
4.1单服务器的防护
弄清对外服务对象
书写规则
网络接口lo的处理
状态监测的处理
协议+端口的处理
实例:一个普通的web服务器
iptables-AINPUT-ilo-jACCEPT
iptables-AINPUT-ptcp-mmultiport22,80-jACCEPT
iptables-AINPUT-mstate--stateRELATED,ESTABLISHED-jACCEPT
iptables-PINPUTDROP
注意:确保规则循序正确,弄清逻辑关系,学会时刻使用-vnL
4.2如何做网关
弄清网络拓扑
本机上网
设置nat
启用路由转发
地址伪装SNAT/MASQUERADE
实例:ADSL拨号上网的拓扑
echo"1">/proc/sys/net/ipv4/ip_forward
iptables-tnat-APOSTROUTING-s192.168.1.0/24-oppp0\
-jMASQUERADE
4.3如何限制内网用户
过滤位置filer表FORWARD链
匹配条件-s-d-p--s/dport
处理动作ACCEPTDROP
实例:
iptables-AFORWARD-s192.168.0.3-jDROP
iptables-AFORWARD-mmac--mac-source11:22:33:44:55:66\
-jDROP
iptables-AFORWARD-dbbs.chinaunix.net-jDROP
4.4内网如何做对外服务器
服务协议(TCP/UDP)
对外服务端口
内部服务器私网IP
内部真正服务端口
实例:
iptables-tnat-APREROUTING-ippp0-ptcp--dport80\
-jDNAT--to192.168.1.1
iptables-tnat-APREROUTING-ippp0-ptcp--dport81\
-jDNAT--to192.168.1.2:80
4.5连接追踪模块
为什么要使用连接追踪模块
FTP协议的传输原理
传统防火墙的做法
如何使用
4.5.1FTP协议传输原理
使用端口
commandport
dataport
传输模式
主动模式(ACTIVE)
被动模式(PASSIVE)
4.5.1FTP协议传输原理
主动模式
clientserver
xxxx|---|----------|-->|21
yyyy|<--|----------|---|20
FW1FW2
被动模式
clientserver
xxxx|---|----------|--->|21
yyyy|---|----------|--->|zzzz
FW1FW2
4.5.2传统防火墙的做法
只使用主动模式,打开TCP/20
防火墙打开高范围端口
配置FTP服务,减小被动模式端口范围
4.5.3如何使用连接追踪模块
modprobeipt_conntrack_ftp
modprobeipt_nat_ftp
iptables-AINPUT-ptcp--dport21-jACCEPT
iptables-AINPUT-mstate--state\
RELATED,ESTABLISHED-jACCEPT
iptables-PINPUTDROP
5.网管策略
怕什么
能做什么
让什么vs不让什么
三大纪律五项注意
其他注意事项
5.1必加项
echo"1">/proc/sys/net/ipv4/ip_forward
echo"1">/proc/sys/net/ipv4/tcp_syncookies
echo"1">\
/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
modprobeip_conntrack_ftp
modprobeip_nat_ftp
5.2可选方案
堵:
iptables-AFORWARD-ptcp--dportxxx-jDROP
iptables-AFORWARD-ptcp--dportyyy:zzz-jDROP
通:
iptables-AFORWARD-ptcp--dportxxx-jACCEPT
iptables-AFORWARD-ptcp--dportyyy:zzz-jACCEPT
iptables-AFORWARD-mstate--stateRELATED,ESTABLISHED\
-jACCEPT
iptables-PFORWARDDROP
5.3三大纪律五项注意
三大纪律——专表专用
filter
nat
mangle
五项注意——注意数据包的走向
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
5.4其他注意事项
养成好的习惯
iptables-vnL
iptables-tnat-vnL
iptables-save
注意逻辑顺序
iptables-AINPUT-ptcp--dportxxx-jACCEPT
iptables-IINPUT-ptcp--dportyyy-jACCEPT
学会写简单的
脚本6.FAQ.1
Q:我设置了iptables-AOUTPUT-d202.xx.xx.xx-jDROP
为何内网用户还是可以访问那个地址?
A:filter表的OUTPUT链是本机访问外面的必经之路,内网数据不经过该链
Q:我添加了iptables-AFORWARD-d202.xx.xx.xx-jDROP
为何内网用户还是可以访问那个地址?
A:检查整个规则是否存在逻辑错误,看是否在DROP前有ACCEPT
Q:iptables-tnat-APOSTROUTING-ieth1-oeth2-jMASQUERADE
这条语句为何报错?
A:POSTROUTING链不支持流入接口-i参数
同理,PREROUTING链不支持流出接口-o参数
6.FAQ.2
Q:我应该怎么查看某个模块具体该如何使用?
A:ipitables-m模块名-h
Q:执行iptables-AFORWARD-mxxx-jyyy
提示iptables:Nochain/target/matchbythatname
A:/lib/modules/`uname-r`/kernel/net/ipv4/netfilter目录中,
缺少与xxx模块有关的文件,或缺少与yyy动作有关的文件
名字为ipt_xxx.o(2.4内核)或ipt_yyy.ko(2.6内核)
Q:脚本写好了,内网上网没问题,FTP访问不正常,无法列出目录,为什么?
A:缺少ip_nat_ftp这个模块,modprobeip_nat_ftp
6.FAQ.3