有一段时间木有回来写博客了,最近比较忙又或者是本人不是太习惯写作,这次趁着空闲特上来写一次博客,这次回来主要是这段时间要弄一些基本的防御,能抵御轻量级的***,所以特写个iptables的脚本,如有不好的地方,见谅,不废话了,直接上代码:

#!/bin/bash
#
# 适用于Web等服务的Linux iptables防火墙脚本。
# 根据网上的一些脚本整理而来
#
#
# 注意1:该脚本需要根据实际情况修改后才能使用。
# 注意2:如果需要开发ftp服务,仅仅开放TCP20,21端口是不够的,必须加载ip_conntrack_ftp以及ip_nat_ftp。
#     方法是修改/etc/sysconfig/iptables-config, 增加/修改为以下一行内容:
# 	  IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"
#

##############
# 可信任的主机或者网段
##############
TRUSTHOSTS=( "10.0.0.0/8" "xxx.xxx.xxx.xxx" )

##############
# 只开放给可信任主机的管理用端口
##############
ADMIN_TCP_PORTS="22,3306"

##############
# 对公网开放的服务端口
##############
SERVICE_TCP_PORTS="22,20,21,25,80,443"
SERVICE_UDP_PORTS="53"

##############
# 清空原来的iptables设置
##############
iptables -F
iptables -X

##############
# 设置默认规则
# 通常INPUT及FORWARD设为DROP,OUTPUT设置为ACCEPT就足够了
# 极端情况下,可以将OUTPUT也设置成默认DROP。然后针对OUTPUT逐条增加过滤规则
##############
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

##############
# 允许lo, PING, 以及所有内部发起的访问
##############
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

##############
# 允许可信任主机访问管理端口
##############
for TRUSTHOST in ${TRUSTHOSTS[@]}
do
iptables -A INPUT  -p tcp -j ACCEPT -m multiport --dport $ADMIN_TCP_PORTS -s $TRUSTHOST
done

##############
# 放开TCP及UDP服务端口
##############
iptables -A INPUT  -p tcp -j ACCEPT -m multiport --dport $SERVICE_TCP_PORTS
iptables -A INPUT  -p udp -j ACCEPT -m multiport --dport $SERVICE_UDP_PORTS

#######################
# 防止DDOS***:Ping of Death
#######################
iptables -N PING_OF_DEATH
iptables -A PING_OF_DEATH -p icmp --icmp-type echo-request \
         -m hashlimit \
         --hashlimit 1/s \
         --hashlimit-burst 10 \
         --hashlimit-htable-expire 300000 \
         --hashlimit-mode srcip \
         --hashlimit-name t_PING_OF_DEATH \
         -j RETURN
iptables -A PING_OF_DEATH -j LOG --log-prefix "ping_of_death_attack: "
iptables -A PING_OF_DEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j PING_OF_DEATH
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables -A INPUT -s 192.186.0.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: "
iptables -A INPUT -p icmp -j DROP

#######################################################################
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
#打开转发
#######################################################################
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
#打开 syncookie (轻量级预防 DOS ***)
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null
#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)
sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)

#######################
# 防止DDOS***:SYN FLOOD
#######################
iptables -N SYN_FLOOD
iptables -A SYN_FLOOD -p tcp --syn \
         -m hashlimit \
         --hashlimit 200/s \
         --hashlimit-burst 3 \
         --hashlimit-htable-expire 300000 \
         --hashlimit-mode srcip \
         --hashlimit-name t_SYN_FLOOD \
         -j RETURN
iptables -A SYN_FLOOD -j LOG --log-prefix "syn_flood_attack: "
iptables -A SYN_FLOOD -j DROP
iptables -A INPUT -p tcp --syn -j SYN_FLOOD

#######################
# 防止DDOS***:stealth scan
#######################
iptables -N STEALTH_SCAN
iptables -A STEALTH_SCAN -j LOG --log-prefix "stealth_scan_attack: "
iptables -A STEALTH_SCAN -j DROP

iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j STEALTH_SCAN
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j STEALTH_SCAN

iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN         -j STEALTH_SCAN
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST         -j STEALTH_SCAN
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j STEALTH_SCAN

iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j STEALTH_SCAN
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN     -j STEALTH_SCAN
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH     -j STEALTH_SCAN
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG     -j STEALTH_SCAN

service iptables save