iptables应用汇总 不指定

jed , 2012-2-9 00:34 , 服务器技术 , 评论(0) , 阅读(4037) , Via 本站原创 | |
本文仅对iptables的使用做一些总结,如果您对原理感兴趣,请参阅其它文档,谢谢!

1. 匹配方式

   内建匹配方式:

   1.1 匹配网络接口 -i/-o,如 -i eth0 -o eth1
   1.2 匹配协议 -p,如 -p tcp、-p udp、-p icmp、-p all
   1.3 匹配地址 -s/-d,如 -s 192.168.1.188 -d 202.96.134.133、-s 192.168.1.0/24、-d www.google.cn (名称实际上会域名解析出地址)
   1.4 匹配端口 --sport/--dport,如 --sport 1024、--dport 21:25(最多匹配两个)

   内建匹配方式的高级应用:

   -p tcp --dport 21 --syn --m state --state NEW -j ACCEPT
   -p tcp --dport 21 --tcp-flags ALL SYN,FIN -j DROP
   -p tcp --dport 21 --tcp-flags SYN,FIN SYN,FIN -j DROP
   -p imcp --icmp-type 8 -j ACCEPT

   模块匹配方式:

   1.5 匹配MAC地址 -m mac --mac-source/--mac-dest,如 -m mac --mac-source 00-21-5D-A5-87-8C
   1.6 匹配IP地址范围 -m iprange --src-range/--dst-range,如 -m iprange --src-range 192.168.1.1-192.168.1.254
   1.7 匹配多个端口 -m multiport --sports/--dports/--ports,如 -m multiport --sports 21,25,80,110(最多匹配15个)
   1.8 匹配会话状态 -m state --state,如 -m state --state NEW/ESTABLISHED/RELATED/INVALID
   1.9 匹配TTL -m ttl --ttl-eq/--ttl-lt/--ttl-gt, 如 -m ttl --ttl-eq 64 (WINDOWS)
   1.10 匹配包类型 -m pkttype --pkt-type,如 -m pkttype --pkt-type unicast/multicast/boradcast
   1.11 匹配包长度 -m length --length,如 -m length --length 60[:80] -p imcp --icmp-type 8
   1.12 匹配字符串 -m string --algo bm --string "system32"
   1.13 匹配发包速率 -m limit --limit 6/m --limit-burst 10
   1.14 匹配最近记录 -m recent 参数比较多,举例中说明
        recent模块默认只能记录100个IP来源,且为每个来源记录20笔记录,可以使用下面的语句修改
        modprobe ipt_recent ip_list_tot=16384
        modprobe ipt_recent ip_pkt_list_tot=50
        或 modprobe ipt_recent ip_list_tot=16384 ip_pkt_list_tot=50

   综合应用举例:

   打开本机的SSH和WEB服务
   IPT="/sbin/iptables -t filter"
   $IPT -F
   $IPT -X (只有先清除所有规则,才能清用户链)
   $IPT -Z (重置计数器)
   $IPT -P OUTPUT ACCEPT
   $IPT -P INPUT DROP
   $IPT -A INPUT -p all -m state --state INVALID DROP
   $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
   $IPT -A INPUT -p tcp -m multiport --dports 22,80 [-m state --state NEW --syn] -j ACCEPT

   仅允许长度为168的imcp ping包进来
   $IPT -A INPUT -p icmp --icmp-type 8 -m length --length 140 -j ACCEPT (168-28=140)
   $IPT -A INPUT -p icmp -j DROP

   控制本机接收imcp ping包的频率,如果超过每分钟10个,则以后每分钟仅允许6个,
   如果发送端停止发包,则在10*6=60s后会完全解除这个限制
   $IPT -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit-burst 10 -j ACCEPT
   $IPT -A INPUT -p icmp -j DROP

   接下来,使用recent模块完成上面的功能
   $IPT -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --rcheck --second 60 --hitcount 6 -j DROP
   $IPT -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --set
   $IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT
   这样将在 /proc/net/xt_recent/目录下建立 icmp_db数据库,可以使用cat icmp_db查看内容
   如果只要来源不停止发包,就让他永远无法通法,可以使用--update

   锁定PortScan攻击者IP,使其在10分钟之内不得再访问本机任何服务;
   modprobe ipt_recent ip_list_tot=1024 ip_pkt_list_tot=50
   $IPT -A INPUT -p tcp --syn -m recent --name PortScan --update --second 600 --hitcount 10 -j DROP
   $IPT -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
   $IPT -A INPUT -p tcp --syn -m state --state NEW -m multiport --dports 22,25,110 -j ACCEPT
   $IPT -A INPUT -p tcp --syn -m recent --name PortScan --set
   也要以考虑改变规则的位置来影响防御效果;

   注意:规则的排列顺序也是很重要的,请将匹配频率最高的移动前面,可以iptables -L -n -v查看;


2. 处理方法

   2.1 RETURN
   只能用于用户链中,用于返回父链,如:

   $IPT -N ICMP
   $IPT -A ICMP -p icmp -j DROP
   $IPT -A ICMP -p all -j RETURN

   $IPT -A INPUT -p icmp -j ICMP
   $IPT -A INPUT -p all -j ACCEPT

   2.2 REJECT
   -j REJECT --reject-with icmp-net-unreachable/icmp-host-unreachable/icmp-port-unreachable

   2.3 LOG

   -j LOG 默认会保存到 /var/log/message

   在/etc/syslog.conf后加入一行
   kern.=alert /var/log/netfilter
   然后这样使用
   -j LOG --log-level alert [--log-prefix "ICMP-PREFIX"]

   2.4 REDIRECT
   可以将包转给自己的特定端口,下面的例子用于代理服务器

   iptables -t nat -A PREROUTING -d 10.1.1.201 -p tcp --dport 80 -j REDIREDT --to-port 3124


3. 路由功能
   系统默认是不打开路由功能的,下面提供两种方法:
  
   方法一:编辑/etc/sysctl.conf,修改 net.ipv4.ip_forward=1(默认是0)
   方法二:echo "1" > /proc/sys/net/ipv4/ip_forward

   $IPT -P FORWARD DROP
   $IPT -A FORWARD -s 192.168.1.0/24 -j ACCEPT
   $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

4. NAT功能

   IPT="iptables -t nat"
   $IPT -F
  
   4.1 一对多NAT(IP共享)
   $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201

   4.2 多对多NAT
   $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201-10.0.0.205

   4.3 一对一NAT
   $IPT -A POSTROUTING -o eth1 -s 192.168.1.201 -j SNAT --to 10.0.0.201
   $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -j DNAT --to 192.168.1.201

   4.4 NAPT
   $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -p tcp --dport 80 -j DNAT --to 192.168.1.201:80
   $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201

   4.5 负载均衡
   $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -j DNAT --to 192.168.1.201-192.168.1.205
  
  
5. “连接追踪”

   当我们使用-m state模块功能的时候,iptables除了装载xt_state.ko模块外,还装载ip_conntrack.ko,接着它会建立
   /proc/net/ip_conntrack数据库
   保存各种超时的文件在 /proc/sys/net/ipv4/netfilter/*
   如 ip_conntrack_tcp_timeout_syn_sent 120s
      ip_conntrack_tcp_timeout_syn_recv 60s
      ip_conntrack_tcp_timeout_syn_established 432000s
      ip_conntrack_udp_timeout 30s
      ip_conntrack_udp_timeout_stream 180s
      ip_conntrack_ICMP_timeout 30s

   追踪的最大连接数 /proc/sys/net/ipv4/ip_conntrack_max
   系统默认为 最大内存(K)/16K/(系统位数/32),若 512M内存,则默认的最大连接数为 32768
   要修改这个限制,必须以手动方式加载 ip_contrack模块,命令为:
   modprobe ip_conntrack hashsize=16384
   每个hashsize可容纳8条连接,那么修改后连接数为16384*8=131072

   每条连接消耗内存为228B,可以查看/var/log/message ip_conntrack加载日志
   131072*228/(1024*1024)=28.5M

   可以使用raw table功能来取消某些连接的追踪功能,如下
   iptables -t raw -A PREROUTING -i eth0 -o eth1 -p tcp --dport 25 -j NOTRACK
   iptables -t raw -A PREROUTING -i eth1 -o eth0 -p tcp --sport 25 -j NOTRACK
   这样将使包跳过NAT和ip_contrack模块,造成不能NAT功能;

   对于复杂的通讯协议,必须加载扩展模块,如ftp,必须加载
   modprobe ip_conntrack_ftp
   modprobe ip_nat_ftp


6. DDOS攻击防御

   调整系统核心参数 /etc/sysctl.conf

   6.1 net.ipv4.tcp_synack_retries=3(默认为5)
       echo "3" > /proc/sys/net/ipv4/tcp_retries

   6.2 net.ipv4.tcp_max_syn_backlog=2046(默认为1024)
       echo "2048" > /proc/sys/net/ipv4/tcp_max_tcp_backlog

   6.3 net.ipv4.tcp_syncookies=1(默认为0)
       echo "1" > /proc/sys/net/ipv4/tcp_syncookies

   一个有效的防御脚本:

#!/bin/bash

IPT="/sbin/iptables -t filter"
  
modprobe ipt_recent ip_list_tot=16384

$IPT -F
$IPT -X
$IPT -Z

$IPT -N SYN_FLOOD
$IPT -A SYN_FLOOD -p tcp --syn --dport 80 -m recent --name synflood_db --update --second 120 --hitcount 1 -j ACCEPT
$IPT -A SYN_FLOOD -p tcp --syn --dport 80 -m recent --name synflood_db --set
$IPT -A SYN_FLOOD -p tcp --syn --dport 80 -j DROP

$IPT -A INPUT -p tcp --syn --dport 80 -m limit --limit 1/m --limit-burst 300 -j ACCEPT
$IPT -A INPUT -p tcp --syn --dport 80 -j SYN_FLOOD
Tags: ,
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]