ChinaUnix讲座iptables高级使用研讨cu.platinum@gmail.com2010.08.07最后修改时间:2010.08.07文档维护者:白金(platinum)v1.0.0主题大纲1.基础部分2.一些误区3.高级技巧4.提高部分5.FAQ1.基础部分1.1REDIRECT与DNAT的区别?1.2MASQUERADE与SNAT的区别?1.3-j与-g的区别?1.4raw表的用途?1.5何为专表专用、专链专用?1.0回顾--PREROUTING--[ROUTE]--FORWARD--POSTROUTING--raw|mangle^manglemangle|filter|natnat||v|INPUTOUTPUT|mangle^raw|filter|mangle||nat||filterv------local-------|1.0回顾语法:iptables[-ttable]-ACHAIN[rule]\[-mmatch][-jTARGET]1.1REDIRECT与DNAT的区别?环境:WAN(eth0),LAN(eth1)iptables-tnat-APREROUTING-ieth1-ptcp\--dport80-jREDIRECT--to3128iptables-tnat-APREROUTING-ieth1-ptcp\--dport80-jDNAT--to172.16.11.1:3128iptables-tnat-APREROUTING-ieth0-ptcp\--dport3389-jDNAT--to172.16.11.250结论:REDIRECT是DNAT的一个特例DNAT的功能更强大1.2MASQUERADE与SNAT的区别?iptables-tnat-s172.16.11.0/24-oeth0\-jMASQUERADEiptables-tnat-s172.16.11.0/24-oeth0\-jSNAT--to123.123.123.123iptables-tnat-s172.16.11.0/24-oeth0\-jSNAT--to123.123.123.1-123.123.123.10结论:MASQUERADE自动根据路由选择出口SNAT适用于固定IP的环境,负载小SNAT可实现地址面积映射1.3-j与-g的区别?iptables-NTESTAiptables-NTESTBiptables-AFORWARD-s172.16.11.1-jTESTAiptables-AFORWARD-s172.16.11.2-gTESTBiptables-ATESTA-jMARK--set-mark1iptables-ATESTB-jMARK--set-mark2iptables-AFORWARD-mmark--mark1-jDROPiptables-AFORWARD-mmark--mark2-jDROP结论:-j(jump)相当于调用,自定义链结束后返回-g(goto)一去不复返1.4raw表的用途?maniptablesiptables-traw-vnLiptables-traw-APREROUTING-ieth1-s\172.16.11.250-jDROP结论:raw表工作于最前端,在conntrack之前可以明确对某些数据不进行连接追踪raw可提前DROP数据,有效降低负载1.5何为专表专用、专链专用?filter:专门用于过滤数据nat:用于地址转换(只匹配初始连接数据)mangle:用于修改数据包内容raw:用于在连接追踪前预处理数据PREROUTING:用于匹配最先接触到的数据(raw,mangle,nat)INPUT:用于匹配到达本机的数据(mangle,filter)FORWARD:用于匹配穿越本机的数据(mangle,filter)OUTPUT:用于匹配从本机发出的数据(raw,mangle,nat,filter)POSTROUTING:用于匹配最后离开的数据(mangle,nat)2.一些误区2.1一个公网IP的最大连接数?2.2该不该使用LOG?2.3limit到底应如何使用?2.4iptables能阻止synflood攻击吗?2.5我的iptables脚本有什么问题?2.1一个公网IP的最大连接数?staticu_int32_t__hash_conntrack(conststructnf_conntrack_tuple*tuple,u16zone,unsignedintsize,unsignedintrnd){unsignedintn;u_int32_th;/*Thedirectionmustbeignored,sowehasheverythinguptothe*destinationports(whichisamultipleof4)andtreatthelast*threebytesmanually.*/n=(sizeof(tuple-src)+sizeof(tuple-dst.u3))/sizeof(u32);h=jhash2((u32*)tuple,n,zone^rnd^(((__force__u16)tuple-dst.u.all16)|tuple-dst.protonum));return((u64)h*size)32;}结论:可以最大有nf_conntrack_max个连接2.2该不该使用LOG?数据包记录流程:获取数据包分析包信息(根据各协议计算各部分数据偏移量)打印内核信息(根据不同协议打印不同信息)syslog捕获内核信息根据syslog配置决定如何输出(文件/远程)iptables-AFORWARD-mstate--stateNEW-ptcp!--syn\-jLOG-log-prefixBADTCPiptables-AFORWARD-mstate--stateNEW-ptcp!--syn\-jDROP结论:LOG需占用一定负载,尽量不写硬盘如须记录,尽量少记,否则雪上加霜2.3limit到底应如何使用?错误:iptables-AFORWARD-picmp-s172.16.11.0/24\-mlimit--limit10/s-jDROP正确:iptables-AFORWARD-picmp-s172.16.11.0/24\-mlimit--limit10/s-jACCEPTiptables-AFORWARD-picmp-s172.16.11.0/24\-jDROP结论:limit仅按一定速率匹配数据若限制,先放过一定速率数据,然后阻断2.4能阻止synflood攻击吗?iptables-Nsyn_floodiptables-AINPUT-ptcp--syn-jsyn_floodiptables-Asyn_flood-mlimit--limit1/s-jRETURNiptables-Asyn_flood-jDROP攻击强度微弱猛烈无攻击访问效果(无防)很难访问无法访问正常访问服务器负载中高低访问效果(限速)无法访问无法访问极难访问服务器负载无无无结论:限速方案是一把双刃剑,治标不治本启用syncookie,减小synack_retries增大tcp_max_syn_backlog,其它2.5我的脚本有什么问题?你的需求?你的环境?你的做法?你的态度?你的……?结论:提问前,请参考《提问的智慧》3.高级技巧3.1如何访问部分网站时不使用squid?3.2如何防止被探测SSH密码?3.3如何实现IP/MAC绑定?3.4如何防止小路由(及如何破解)?3.5如何防止被tracert?3.6如何实现服务器负载分担?3.7如何得知内网用户流量?3.8如何对DNS域名进行过滤?3.9如何有效阻止疯狂下载人士?3.1访问部分网站不使用squid?iptables-tnat-APREROUTING-ieth1-s\172.16.11.250-jACCEPTiptables-tnat-APREROUTING-ieth1-d\123.123.123.123-jACCEPTiptables-tnat-APREROUTING-ieth1-s\172.16.11.0/24-jREDIRECT--to3128结论:让无需转向的数据提前脱离“魔掌”3.2如何防止被探测SSH密码?iptables-AINPUT-ptcp--dport22\-mstate--stateNEW-mrecent--set\--nameSSH--rsource-mrecent--nameSSH\--update--seconds10--hitcount4\--rsource-jDROP结论:模块可以在同一个规则内反复使用优点:合并使用可降低负载3.3如何实现IP/MAC绑定?iptables-NMAC_CHECKiptables-AFORWARD-ieth1-oeth0-jMAC_CHECKiptables-AMAC_CHECK-s172.16.11.101-mmac\--mac-sourceXX:XX:XX:XX:XX:XX-jRETURNiptables-AMAC_CHECK-s172.16.11.102-mmac\--mac-sourceYY:YY:YY:YY:YY:YY-jRETURNiptables-AMAC_CHECK-s172.16.11.103-mmac\--mac-sourceZZ:ZZ:ZZ:ZZ:ZZ:ZZ-jRETURNiptables-AMAC_CHECK-jDROP3.4如何防止小路由(及破解)?iptables-NTTL_CHECKiptables-AFORWARD-ieth1-oeth0-jTTL_CHECKiptables-ATTL_CHECK-mttl--ttl-eq128-jRETURNiptables-ATTL_CHECK-mttl--ttl-eq64-jRETURNiptables-ATTL_CHECK-mttl--ttl-eq255-jRETURNiptables-ATTL_CHECK-jDROP3.5如何防止被tracert?ping?=tracertping=ICMPtracert=TTL试探iptables-AINPUT-mttl--ttl-eq1-jDROPiptables-AINPUT-mttl--ttl-lt4-jDROPiptables-AFORWARD-mttl--ttl-lt6-jDROP如何一跳直达?3.6如何实现服务器负载分担?iptables-tnat-APREROUTING-ieth0-ptcp--dport80\-mstatistic--modenth--every3-jDNAT--to172.16.11.101iptables-tnat-APREROUTING-ieth0-ptcp--dport80\-mstatistic--modenth--every2-jDNAT--to172.16.11.102iptables-tnat-APREROUTING-ieth0-ptcp--dport80\-jDNAT--to172.16.11.103statistic的其它用途?iptables-AFORWARD-ieth1-oeth0-s172.16.11.250-m\statistic--moderandom--probability0.1-jDROP3.7如何得知内网用户流量?如何对DNS域名进行过滤?为什么string模块无法匹配?