<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[iptables应用汇总]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Wed, 08 Feb 2012 16:34:35 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	本文仅对iptables的使用做一些总结，如果您对原理感兴趣，请参阅其它文档，谢谢！<br/><br/>1. 匹配方式<br/><br/>&nbsp;&nbsp; 内建匹配方式：<br/><br/>&nbsp;&nbsp; 1.1 匹配网络接口 -i/-o，如 -i eth0 -o eth1<br/>&nbsp;&nbsp; 1.2 匹配协议 -p，如 -p tcp、-p udp、-p icmp、-p all<br/>&nbsp;&nbsp; 1.3 匹配地址 -s/-d，如 -s 192.168.1.188 -d 202.96.134.133、-s 192.168.1.0/24、-d <a href="http://www.google.cn" target="_blank">www.google.cn</a> （名称实际上会域名解析出地址）<br/>&nbsp;&nbsp; 1.4 匹配端口 --sport/--dport，如 --sport 1024、--dport 21:25（最多匹配两个）<br/><br/>&nbsp;&nbsp; 内建匹配方式的高级应用：<br/><br/>&nbsp;&nbsp; -p tcp --dport 21 --syn --m state --state NEW -j ACCEPT<br/>&nbsp;&nbsp; -p tcp --dport 21 --tcp-flags ALL SYN,FIN -j DROP<br/>&nbsp;&nbsp; -p tcp --dport 21 --tcp-flags SYN,FIN SYN,FIN -j DROP<br/>&nbsp;&nbsp; -p imcp --icmp-type 8 -j ACCEPT<br/><br/>&nbsp;&nbsp; 模块匹配方式：<br/><br/>&nbsp;&nbsp; 1.5 匹配MAC地址 -m mac --mac-source/--mac-dest，如 -m mac --mac-source 00-21-5D-A5-87-8C<br/>&nbsp;&nbsp; 1.6 匹配IP地址范围 -m iprange --src-range/--dst-range，如 -m iprange --src-range 192.168.1.1-192.168.1.254<br/>&nbsp;&nbsp; 1.7 匹配多个端口 -m multiport --sports/--dports/--ports，如 -m multiport --sports 21,25,80,110（最多匹配15个）<br/>&nbsp;&nbsp; 1.8 匹配会话状态 -m state --state，如 -m state --state NEW/ESTABLISHED/RELATED/INVALID<br/>&nbsp;&nbsp; 1.9 匹配TTL -m ttl --ttl-eq/--ttl-lt/--ttl-gt， 如 -m ttl --ttl-eq 64 （WINDOWS）<br/>&nbsp;&nbsp; 1.10 匹配包类型 -m pkttype --pkt-type，如 -m pkttype --pkt-type unicast/multicast/boradcast<br/>&nbsp;&nbsp; 1.11 匹配包长度 -m length --length，如 -m length --length 60[:80] -p imcp --icmp-type 8<br/>&nbsp;&nbsp; 1.12 匹配字符串 -m string --algo bm --string "system32"<br/>&nbsp;&nbsp; 1.13 匹配发包速率 -m limit --limit 6/m --limit-burst 10<br/>&nbsp;&nbsp; 1.14 匹配最近记录 -m recent 参数比较多，举例中说明<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recent模块默认只能记录100个IP来源，且为每个来源记录20笔记录，可以使用下面的语句修改<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modprobe ipt_recent ip_list_tot=16384<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modprobe ipt_recent ip_pkt_list_tot=50<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;或 modprobe ipt_recent ip_list_tot=16384 ip_pkt_list_tot=50<br/><br/>&nbsp;&nbsp; 综合应用举例：<br/><br/>&nbsp;&nbsp; 打开本机的SSH和WEB服务<br/>&nbsp;&nbsp; IPT="/sbin/iptables -t filter"<br/>&nbsp;&nbsp; $IPT -F<br/>&nbsp;&nbsp; $IPT -X （只有先清除所有规则，才能清用户链）<br/>&nbsp;&nbsp; $IPT -Z （重置计数器）<br/>&nbsp;&nbsp; $IPT -P OUTPUT ACCEPT<br/>&nbsp;&nbsp; $IPT -P INPUT DROP<br/>&nbsp;&nbsp; $IPT -A INPUT -p all -m state --state INVALID DROP<br/>&nbsp;&nbsp; $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT<br/>&nbsp;&nbsp; $IPT -A INPUT -p tcp -m multiport --dports 22,80 [-m state --state NEW --syn] -j ACCEPT<br/><br/>&nbsp;&nbsp; 仅允许长度为168的imcp ping包进来<br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp --icmp-type 8 -m length --length 140 -j ACCEPT (168-28=140)<br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp -j DROP<br/><br/>&nbsp;&nbsp; 控制本机接收imcp ping包的频率，如果超过每分钟10个，则以后每分钟仅允许6个，<br/>&nbsp;&nbsp; 如果发送端停止发包，则在10*6=60s后会完全解除这个限制<br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit-burst 10 -j ACCEPT<br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp -j DROP<br/><br/>&nbsp;&nbsp; 接下来，使用recent模块完成上面的功能<br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --rcheck --second 60 --hitcount 6 -j DROP<br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --set<br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT<br/>&nbsp;&nbsp; 这样将在 /proc/net/xt_recent/目录下建立 icmp_db数据库，可以使用cat icmp_db查看内容<br/>&nbsp;&nbsp; 如果只要来源不停止发包，就让他永远无法通法，可以使用--update<br/><br/>&nbsp;&nbsp; 锁定PortScan攻击者IP，使其在10分钟之内不得再访问本机任何服务；<br/>&nbsp;&nbsp; modprobe ipt_recent ip_list_tot=1024 ip_pkt_list_tot=50<br/>&nbsp;&nbsp; $IPT -A INPUT -p tcp --syn -m recent --name PortScan --update --second 600 --hitcount 10 -j DROP<br/>&nbsp;&nbsp; $IPT -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT<br/>&nbsp;&nbsp; $IPT -A INPUT -p tcp --syn -m state --state NEW -m multiport --dports 22,25,110 -j ACCEPT<br/>&nbsp;&nbsp; $IPT -A INPUT -p tcp --syn -m recent --name PortScan --set<br/>&nbsp;&nbsp; 也要以考虑改变规则的位置来影响防御效果；<br/><br/>&nbsp;&nbsp; 注意：规则的排列顺序也是很重要的，请将匹配频率最高的移动前面，可以iptables -L -n -v查看；<br/><br/><br/>2. 处理方法<br/><br/>&nbsp;&nbsp; 2.1 RETURN <br/>&nbsp;&nbsp; 只能用于用户链中，用于返回父链，如：<br/><br/>&nbsp;&nbsp; $IPT -N ICMP<br/>&nbsp;&nbsp; $IPT -A ICMP -p icmp -j DROP<br/>&nbsp;&nbsp; $IPT -A ICMP -p all -j RETURN<br/><br/>&nbsp;&nbsp; $IPT -A INPUT -p icmp -j ICMP<br/>&nbsp;&nbsp; $IPT -A INPUT -p all -j ACCEPT<br/><br/>&nbsp;&nbsp; 2.2 REJECT <br/>&nbsp;&nbsp; -j REJECT --reject-with icmp-net-unreachable/icmp-host-unreachable/icmp-port-unreachable<br/><br/>&nbsp;&nbsp; 2.3 LOG<br/><br/>&nbsp;&nbsp; -j LOG 默认会保存到 /var/log/message<br/><br/>&nbsp;&nbsp; 在/etc/syslog.conf后加入一行<br/>&nbsp;&nbsp; kern.=alert /var/log/netfilter<br/>&nbsp;&nbsp; 然后这样使用<br/>&nbsp;&nbsp; -j LOG --log-level alert [--log-prefix "ICMP-PREFIX"]<br/><br/>&nbsp;&nbsp; 2.4 REDIRECT<br/>&nbsp;&nbsp; 可以将包转给自己的特定端口，下面的例子用于代理服务器<br/><br/>&nbsp;&nbsp; iptables -t nat -A PREROUTING -d 10.1.1.201 -p tcp --dport 80 -j REDIREDT --to-port 3124<br/><br/><br/>3. 路由功能<br/>&nbsp;&nbsp; 系统默认是不打开路由功能的，下面提供两种方法：<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp; 方法一：编辑/etc/sysctl.conf，修改 net.ipv4.ip_forward=1（默认是0）<br/>&nbsp;&nbsp; 方法二：echo "1" > /proc/sys/net/ipv4/ip_forward<br/><br/>&nbsp;&nbsp; $IPT -P FORWARD DROP<br/>&nbsp;&nbsp; $IPT -A FORWARD -s 192.168.1.0/24 -j ACCEPT<br/>&nbsp;&nbsp; $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT<br/><br/>4. NAT功能<br/><br/>&nbsp;&nbsp; IPT="iptables -t nat"<br/>&nbsp;&nbsp; $IPT -F<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; 4.1 一对多NAT（IP共享）<br/>&nbsp;&nbsp; $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201<br/><br/>&nbsp;&nbsp; 4.2 多对多NAT<br/>&nbsp;&nbsp; $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201-10.0.0.205<br/><br/>&nbsp;&nbsp; 4.3 一对一NAT<br/>&nbsp;&nbsp; $IPT -A POSTROUTING -o eth1 -s 192.168.1.201 -j SNAT --to 10.0.0.201<br/>&nbsp;&nbsp; $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -j DNAT --to 192.168.1.201<br/><br/>&nbsp;&nbsp; 4.4 NAPT<br/>&nbsp;&nbsp; $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -p tcp --dport 80 -j DNAT --to 192.168.1.201:80<br/>&nbsp;&nbsp; $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201<br/><br/>&nbsp;&nbsp; 4.5 负载均衡<br/>&nbsp;&nbsp; $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -j DNAT --to 192.168.1.201-192.168.1.205<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; <br/>5. “连接追踪”<br/><br/>&nbsp;&nbsp; 当我们使用-m state模块功能的时候，iptables除了装载xt_state.ko模块外，还装载ip_conntrack.ko，接着它会建立<br/>&nbsp;&nbsp; /proc/net/ip_conntrack数据库<br/>&nbsp;&nbsp; 保存各种超时的文件在 /proc/sys/net/ipv4/netfilter/*<br/>&nbsp;&nbsp; 如 ip_conntrack_tcp_timeout_syn_sent 120s<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_conntrack_tcp_timeout_syn_recv 60s<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_conntrack_tcp_timeout_syn_established 432000s<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_conntrack_udp_timeout 30s<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_conntrack_udp_timeout_stream 180s<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_conntrack_ICMP_timeout 30s<br/><br/>&nbsp;&nbsp; 追踪的最大连接数 /proc/sys/net/ipv4/ip_conntrack_max<br/>&nbsp;&nbsp; 系统默认为 最大内存(K)/16K/(系统位数/32)，若 512M内存，则默认的最大连接数为 32768<br/>&nbsp;&nbsp; 要修改这个限制，必须以手动方式加载 ip_contrack模块，命令为：<br/>&nbsp;&nbsp; modprobe ip_conntrack hashsize=16384<br/>&nbsp;&nbsp; 每个hashsize可容纳8条连接，那么修改后连接数为16384*8=131072<br/><br/>&nbsp;&nbsp; 每条连接消耗内存为228B，可以查看/var/log/message ip_conntrack加载日志<br/>&nbsp;&nbsp; 131072*228/(1024*1024)=28.5M<br/><br/>&nbsp;&nbsp; 可以使用raw table功能来取消某些连接的追踪功能，如下<br/>&nbsp;&nbsp; iptables -t raw -A PREROUTING -i eth0 -o eth1 -p tcp --dport 25 -j NOTRACK<br/>&nbsp;&nbsp; iptables -t raw -A PREROUTING -i eth1 -o eth0 -p tcp --sport 25 -j NOTRACK<br/>&nbsp;&nbsp; 这样将使包跳过NAT和ip_contrack模块，造成不能NAT功能；<br/><br/>&nbsp;&nbsp; 对于复杂的通讯协议，必须加载扩展模块，如ftp，必须加载<br/>&nbsp;&nbsp; modprobe ip_conntrack_ftp<br/>&nbsp;&nbsp; modprobe ip_nat_ftp<br/><br/><br/>6. DDOS攻击防御<br/><br/>&nbsp;&nbsp; 调整系统核心参数 /etc/sysctl.conf<br/><br/>&nbsp;&nbsp; 6.1 net.ipv4.tcp_synack_retries=3（默认为5）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "3" > /proc/sys/net/ipv4/tcp_retries<br/><br/>&nbsp;&nbsp; 6.2 net.ipv4.tcp_max_syn_backlog=2046（默认为1024）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "2048" > /proc/sys/net/ipv4/tcp_max_tcp_backlog<br/><br/>&nbsp;&nbsp; 6.3 net.ipv4.tcp_syncookies=1（默认为0）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "1" > /proc/sys/net/ipv4/tcp_syncookies<br/><br/>&nbsp;&nbsp; 一个有效的防御脚本：<br/><div class="code"><br/>#!/bin/bash<br/><br/>IPT=&quot;/sbin/iptables -t filter&quot;<br/>&nbsp;&nbsp; <br/>modprobe ipt_recent ip_list_tot=16384<br/><br/>$IPT -F<br/>$IPT -X<br/>$IPT -Z<br/><br/>$IPT -N SYN_FLOOD<br/>$IPT -A SYN_FLOOD -p tcp --syn --dport 80 -m recent --name synflood_db --update --second 120 --hitcount 1 -j ACCEPT<br/>$IPT -A SYN_FLOOD -p tcp --syn --dport 80 -m recent --name synflood_db --set<br/>$IPT -A SYN_FLOOD -p tcp --syn --dport 80 -j DROP<br/><br/>$IPT -A INPUT -p tcp --syn --dport 80 -m limit --limit 1/m --limit-burst 300 -j ACCEPT<br/>$IPT -A INPUT -p tcp --syn --dport 80 -j SYN_FLOOD<br/></div><br/>Tags - <a href="http://www.dzhope.com/tags/iptables/" rel="tag">iptables</a> , <a href="http://www.dzhope.com/tags/%25E5%25BA%2594%25E7%2594%25A8/" rel="tag">应用</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] iptables应用汇总]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>