[root@linux ~]# vi iptables.sh ← 编辑设定文件 #!/bin/bash #---------------------------------------# # 定义 LAN=eth0 #---------------------------------------# # 取得内部Mask LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`
# 取得内部IP LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK
# 追加 sed -i '/IPTABLES_MODULES/d' /etc/sysconfig/iptables-config echo "IPTABLES_MODULES=\"ip_conntrack_ftp\"" >> /etc/sysconfig/iptables-config
# 停止所有规则 /etc/rc.d/init.d/iptables stop
# 设定 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP
# 设置SYN Cookies有效 # ※防止TCP SYN Flood攻击 sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
# ping应答设定 # ※防止Smurf攻击 sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
# 拒绝ICMP Redirect包 sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf for dev in `ls /proc/sys/net/ipv4/conf/` do sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf done
# 拒绝Source Routed包 sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf for dev in `ls /proc/sys/net/ipv4/conf/` do sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf done
# 丢弃分段储存化的包并且记录 iptables -N LOG_FRAGMENT iptables -A LOG_FRAGMENT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FRAGMENT] : ' iptables -A LOG_FRAGMENT -j DROP iptables -A INPUT -f -j LOG_FRAGMENT
# NetBIOS相关的访问不记录直接丢弃 iptables -A INPUT -s ! $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A INPUT -s ! $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A OUTPUT -d ! $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A OUTPUT -d ! $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP
# 1秒4回以上的ping不记录直接丢弃 # ※防止Ping of Death攻击 iptables -N LOG_PINGDEATH iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT iptables -A LOG_PINGDEATH -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES PINGDEATH] : ' iptables -A LOG_PINGDEATH -j DROP iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
# 本机访问许可 iptables -A INPUT -i lo -j ACCEPT
# 内部访问许可 iptables -A INPUT -s $LOCALNET -j ACCEPT
# 相对内部的外部的应答许可 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ※丢弃没用的记录 iptables -A INPUT -d 255.255.255.255 -j DROP iptables -A INPUT -d 224.0.0.1 -j DROP
# 拒绝113端口(IDENT)访问 # ※防止邮件等主机反应衰弱 iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
#----------------------------------------------------------# # 下面是各公开件组的设定 # #----------------------------------------------------------#
# ※开放SSH 件组 iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# ※开放DNS 件组 iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT
# ※开放HTTP 件组 iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# ※开放HTTPS 件组 iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ※开放FTP 件组 iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# ※开放PASV 用端口 iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT
# ※开放SMTP 件组 iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# ※开放SMTPS 件组 iptables -A INPUT -p tcp --dport 465 -j ACCEPT
# ※开放POP3 件组 iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# ※开放POP3S 件组 iptables -A INPUT -p tcp --dport 995 -j ACCEPT
# ※开放IMAP 件组 iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# ※开放IMAPS 件组 iptables -A INPUT -p tcp --dport 993 -j ACCEPT
#----------------------------------------------------------# # 各开放件组设定结束 # #----------------------------------------------------------#
# 设置访问限制 # ※拒绝访问的IP地址记录在/root/deny_ip每一行一个IP,该访问不记录 if [ -s /root/deny_ip ]; then for ip in `cat /root/deny_ip` do iptables -I INPUT -s $ip -j DROP done fi
# 拒绝指定国家的访问 # ※各国IP分配情报APNIC() # ※国家和Country Code的对应 例:台湾=TW %20codes COUNTRYLIST='TW' wget -q iptables -N OTHERFILTER iptables -A OTHERFILTER -j DROP for country in $COUNTRYLIST do for ip in `cat delegated-apnic-latest | grep "apnic|$country|ipv4|"` do FILTER_ADDR=`echo $ip |cut -d "|" -f 4` TEMP_CIDR=`echo $ip |cut -d "|" -f 5` FILTER_CIDR=32 while [ $TEMP_CIDR -ne 1 ]; do TEMP_CIDR=$((TEMP_CIDR/2)) FILTER_CIDR=$((FILTER_CIDR-1)) done iptables -I INPUT -s $FILTER_ADDR/$FILTER_CIDR -j OTHERFILTER done done rm -f delegated-apnic-latest
# 上面以外的访问记录后丢弃 iptables -A INPUT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INPUT] : ' iptables -A INPUT -j DROP iptables -A FORWARD -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FORWARD] : ' iptables -A FORWARD -j DROP
# 为了再启动后上记规则有效保存 /etc/rc.d/init.d/iptables save
# 防火墙启动 /etc/rc.d/init.d/iptables start
[root@linux ~]# chmod 700 iptables.sh ← 权限变更
|