ChinaUnix讲座2小时玩转iptablescu.platinum@gmail.com2006.03.18v1.4主题大纲1.概述2.框架图3.语法4.实例分析5.网管策略6.FAQ7.实战1.概述2.4.x、2.6.x内核netfilter/iptables2.1框架图--PREROUTING--[ROUTE]--FORWARD--POSTROUTING--mangle|mangle^manglenat|filter|nat||||v|INPUTOUTPUT|mangle^mangle|filter|natv------local-------|filter2.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链名[规则号码],如果不写规则号码,则默认是13、确保规则号码≤(已有规则数+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-oppp03.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网络的数据包-d、UDP、ICMP等,也可为空例如:-ptcp-pudp-picmp--icmp-type类型ping:type8pong:type03.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-d,去往协议数据包注意:1、--sport、--dport必须联合-p使用,必须指明协议类型是什么2、条件写的越多,匹配越细致,匹配范围越小3.4动作(处理方式)ACCEPTDROPSNATDNATMASQUERADE3.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,用于NATiptables-tnat-APOSTROUTING-s192.168.0.0/24\-jSNAT--to1.1.1.1-1.1.1.10同上,只不过修改成一个地址池里的IP3.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.1iptables-tnat-APREROUTING-ippp0-ptcp--dport81\-jDNAT--to192.168.0.2:80iptables-tnat-APREROUTING-ippp0-ptcp--dport80\-jDNAT--to192.168.0.1-192.168.0.103.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、INVALIDNEW:有别于tcp的synESTABLISHED:连接态RELATED:衍生态,与conntrack关联(FTP)INVALID:不能被识别属于哪个连接或没有任何状态例如:iptables-AINPUT-mstate--stateRELATED,ESTABLISHED\-jACCEPT3.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\-jACCEPTiptables-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单服务器的防护弄清对外服务对象书写规则网络接口l