分类: LINUX
2010-07-30 14:49:35
Iptables 学习
1. 概述
2. 框架图
3. 语法
4. 实例分析
5. 网管策略
6. 使用总则、FAQ
7. 实战
--------------------------------------------------------------------
一、概述:
2.4.x、2.6.x 内核 netfilter/iptables
-----------------------------------------------------------------------------------------
二、框架图:
----------------------------------------------------------------
三、语法:
(1)操作命令:(-A、-I、D、R、P、F)
查看命令:-(v、n、x)L
1、-A <链名>
Append,追加一条规则(放到最后)
E.G:
iptables -t filter -A INPUT -j DROP
注释:在filter表的INPUT链里追加一条规则(作为最后一条规则),匹配所有访问到本机的数据包,匹配的丢弃掉。
2、-I <链名> [规则号码]
Insert,插入一条规则
E.G:
Iptables -t filter -I INPUT -j DROP
注释:在filter表的INPUT链里追加一条规则(插入成第一条)
Iptables -t filter -I 3 INPUT -j DROP
注释:在filter表的INPUT链里追加一条规则(插入成第三条)
(1)-t filter 可以不写,不写自然默认是filter表
(2)-I 链名 [规则号码] 如果不写规则号码,默认是1
(3)确保规则号码<=(已有规则号码+1),否则报错
3、-D <链名> <规则号码|具体规则内容>
Delete,删除一条规则
E.G:
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,替换一条规则
E.G:
Iptables -R INPUT 3 -j ACCEPT
注释:将号码为3规则内容替换为“-j ACCEPT”确保规则号码<=已有的规则数,否则报错
5、-P <链名> <动作>
Policy,设置某个链的默认规则
E.G:
Iptables -P INPUT DROP
注释:设置INPUT表的默认规则是DROP
当数据包没有被规则表里的任何规则匹配到时,按此默认规则处理,动作前面不能加-j,这也是唯一一种匹配动作前面不加-j的情况。
6、-F <链名>
Flush,清空规则
E.G:
Iptables -F INPUT DROP
注释:清空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地址和端口号码,不显示域名和服务名称
E.G:
Iptables -L
注释:粗略列出filter表所有链以及所有规则
Iptables -t nat -vnL
注释:用详细方式列出nat表所有链的所有规则,只显示IP地址和端口号
Iptables -t nat -vxnl PREROUTING
注释:用详细方式列出nat表PREROUTING链的所有规则以及详细数字,不反解。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
匹配的条件:
流入、流出接口:(-i,-o)
来源、目的地址:(-s,-d)
(2)协议类型:(-p)
来源、目的端口:--sport、--dport
1、按网络接口匹配:
-i <匹配数据进入的网络接口>
E.G:
-i eth0 匹配是否从网络接口eth0进来
-i ppp0 匹配是否从网络接口ppp0进来
-o <匹配数据流出的网络接口>
E.G: -i eth0
-o eth0
2、按来源目的匹配:
-s <匹配来源地址>
可以是IP、NET、DOMAIN,也可空(任何地址)
E.G:
-s 192.168.0.1 匹配来自192.168.0.1的数据包
-s 192.168.0.1/24 匹配来自192.168.0.1/24网络的数据包
-s 192.168.0.0/16 匹配来自192.168.0.0/16网络的数据包
-d <匹配目的地址>
可以是IP、NET、DOMAIN,也可空(任何地址)
E.G:
-d 202.106.0.20 匹配去往202.106.0.20的数据包
-d 202.106.0.0/16 匹配去往202.106.0.20/16网络的数据包
-d 匹配去往域名的数据
3、按协议类型匹配:
-p <匹配协议类型>
可以是tcp,udp,icmp等,也可为空。
E.G:
-p tcp
-p udp
-p icmp --icmp-type 类型 (type 8,type 0)
4、按源目的端口匹配
--sport <匹配源端口>
可以是个别端口,可以是端口范围
E.G:--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000-3000的数据包(包含1000、3000)
--sport :3000 匹配源端口是3000以下的数据包(含3000)
--sport 3000: 匹配源端口是3000以上的数据包(含3000)
--dport <匹配目的端口>
可以是个别端口,可以是端口范围
E.G:
--dport 80 匹配目的端口是80的数据包
--dport 6000:8000 匹配目的端口是6000-8000的数据包(含6000、8000)
--dport :3000 匹配目的端口是3000以下的数据包
--dport 1000: 匹配目的端口是1000以上的数据包(含1000)
注意:--sport 和--dport必须配合-p参数使用。
(3)匹配应用举例:
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 -p tcp --dport 80
匹配来自192.168.0.1,去往的80端口的tcp协议数据包
注意:
(1)--dport、--sport必须联合-p使用,必须指明协议类型。
(2)条件写的越多,匹配越细致,匹配范围越小。
(4)动作,处理方式
1、ACCEPT: -j ACCEPT允许数据包通过本链,而不拦截
2、DROP: -j DROP 丢弃,阻止数据包通过本链,而丢弃
3、SNAT: -j SNAT --to nat表中的PREROUTING链原地址转换,SNAT支持转换为单IP,也支持转换为地址池(一组连续的IP地址)
E.G:
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
4、DNAT: -j DNAT --to nat表中的PREROUTING链目的地址转换,SNAT支持转换为单IP,也支持转换为地址池(一组连续的IP地址)
E.G:
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、MASQUERADE:-j MASQQUERADE 动态源地址转换(动态IP的情况下使用)
E.G:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
把源地址是192.168.0.0/24的数据包进行伪装。
(5)附加模块
1、按包的状态匹配(state)
-m state --state 状态
状态:NEW、RELATED、ESTABLISHED、INVALID
NEW 有别于tcp的syn,ESTABLISHED:连接状态,RELATED:衍生态,与conntrack关联(FTP)
INVALID:不能不识别属于哪个连接或没有任何状态
E.G:
Iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
2、按来源MAC匹配(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 匹配速率 [--brust 缓冲数量] 用一定的速率去匹配数据包
注意:limit英文上是限制的意思,但实际只是按一定的速率去匹配而已,要想限制的后面再跟一条DROP
4、多端口匹配(multiport)
-m multiport <--sports|--dports|ports> 端口1[端口2,端口3...端口n]
一次性匹配多个端口,可以区分源端口,目的端口或不指定端口。
Iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT
注意:必须与-p参数一起使用
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
实例分析
一、单服务器的防护
书写规则:网络接口lo的处理,状态检测的处理,协议+端口的处理
实例:一台普通的web服务器
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Iptables -P INPUT DROP
注意:确保规则顺序正确,弄清逻辑关系,学会时刻使用-vnL
二、如何做网关
弄清楚网络拓扑图,本机上网,设置nat
启用路由转发,地址伪装SNAT/MASQUERADE
实例:ADSL上网拓扑
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
三、如何限制内网用户
1、过滤位置filter表FORWARD链
2、匹配条件-s -d -p --s/dport
3、处理动作ACCEPT,DROP
实例:
iptables -A FORWARD -s 192.168.0.3 -j DROP
iptables -A FORWARD -m mac --mac-source 11:22:33:44:55:66 -j DROP
iptables -A FORWARD -d bbs.chinaunix.net -j DROP
四、内网如何做对外服务器
服务器协议(tcp/udp)
对外服务端口
内部服务器的私有IP地址
内部真正服务的端口
实例:
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.1.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.1.2:80
五、连接追踪模块
1、为什么要使用连接追踪模块?
FTP协议的传输原理
传统防火墙的做法
2、如何使用?
modprobe ip_net_ftp
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLEISHED -j ACCEPT
iptables -P INPUT DROP
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
网管策略:
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
modprobe ip_net_ftp
2、可选方案:
堵:
iptables -A FORWARD -p tcp --dport xxx -j DROP
iptables -A FORWARD -p tcp --dport yyy:zzz -j DROP
通:
iptables -A FORWARD -p tcp --dport xxx -j ACCEPT
iptables -A FORWARD -p tcp --dport yyy:zzz -j ACCEPT
iptables -A FORWARD -p tcp --dport -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P FORWARD DROP
3、三张链,五张表。
filter,nat,mangle
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
4、其他注意事项
(1)养成好习惯
iptables -vnL
iptables -t nat -vnL
iptables-save
(2)注意逻辑顺序
iptables -A INPUT -p tcp --dport xxx -j ACCEPT
iptables -I INPUT -p tcp --dport yyy -j ACCEPT
(3)学会写简单的脚本
5、使用总规则
1、所有链必须大写:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
2、所有表明必须小写:filter,nat,mangle
3、所有动作必须大写:ACCEPT,DROP,SNAT,MASQUERADE
4、所有匹配必须小写:-s/-d/-m
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
实战:
实战一:
内网(client)-------------------linux(网关)---------------------外网
内网:192.168.0.0/24,gw:192.168.0.254
网关linux:192.168.0.254(eth1),202.106.0.254(eth0)
外网服务器:202.106.0.20
外网:
ifconfig eth0 202.106.0.20 netmask 255.255.255.0
内网:
ifconfig eth0 192.168.0.1 netmask 255.255.255.0
Route add default gw 192.168.0.254
网关linux:
ifconfig eth0 202.106.0.254 netmask 255.255.255.0
ifconfig eth1 192.168.0.254 netmask 255.255.255.0
service iptables stop
modprobe ip_nat_ftp
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 202.106.0.254
实战二:
在Linux服务器上增加了一块网卡eth2,用来做Web服务器线路。
eth2配置:172.17.0.254
web server:172.17.0.1
其他配置对比实战一
web server:
ifconfig eth0 172.17.0.1 netmask 255.255.255.0
route add default gw 172.17.0.254
iptables防火墙配置:
ifconfig eth0 202.106.0.254 netmask 255.255.255.0
ifconfig eth1 192.168.0.254 netmask 255.255.255.0
ifconfig eth2 172.17.0.254 netmask 255.255.255.0
service iptables stop
modprobe ip_net_ftp
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT
Iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 202.106.0.254
iptables -t nat -A PREROUTING -d 202.106.0.254 -p tcp --dport 80 -j DNAT --to 172.17.0.1
iptables -A FORWARD -i eth2 -o eth1 -m state --state NEW -j DROP