Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106761
  • 博文数量: 16
  • 博客积分: 1425
  • 博客等级: 上尉
  • 技术积分: 216
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 14:29
文章分类

全部博文(16)

文章存档

2014年(1)

2010年(7)

2009年(8)

我的朋友

分类: 网络与安全

2009-04-28 17:58:15

准备工作:
一、防火墙脚本开始的一个或几个知心动作的默认策略定为接受。
二、设置一个cron作业,使防火墙可以在不久之后的某个时间停止下来。
三、在定义规则时,从最特别到最一般的顺序设计规则。
 
设定规则脚本,脚本的名称定义为firewall-rule,这个脚本直接运行来启动iptables
一、对在规则建立中常用的参数或数值,用名称设定,从而方便阅读脚本代码。
 
 
#!/bin/sh IPT="/sbin/iptables" # Location of iptables on your system INTERNET="eth0" # Internet-connected interface
LOOPBACK_INTERFACE="lo" # however your system names it
IPADDR="192.168.200.156" # your IP address
MY_ISP="my.isp.address.range" # ISP server & NOC address range
SUBNET_BASE="255.255.255.0" # Your subnet's network address
SUBNET_BROADCAST="192.168.200.255" # Your subnet's broadcast address
LOOPBACK="127.0.0.0/8" # reserved loopback address range
CLASS_A="10.0.0.0/8" # class A private networks
CLASS_B="172.16.0.0/12" # class B private networks
CLASS_C="192.168.0.0/16" # class C private networks
CLASS_D_MULTICAST="224.0.0.0/4" # class D multicast addresses
CLASS_E_RESERVED_NET="240.0.0.0/5" # class E reserved addresses
BROADCAST_SRC="0.0.0.0" # broadcast source address
BROADCAST_DEST="255.255.255.255" # broadcast destination address
PRIVPORTS="0:1023" # well-known, privileged port range
UNPRIVPORTS="1024:65535" # unprivileged port range
 
 
二、删除所有已存在的规则
#删除所有规则链的规则
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
#删除所有用户自定义规则链
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
三、设定默认策略,完全开放为接受策略。
 
# Reset the default policy
$IPT --policy INPUT   ACCEPT
$IPT --policy OUTPUT  ACCEPT
$IPT --policy FORWARD ACCEPT
$IPT -t nat --policy PREROUTING  ACCEPT
$IPT -t nat --policy OUTPUT ACCEPT
$IPT -t nat --policy POSTROUTING ACCEPT
$IPT -t mangle --policy PREROUTING ACCEPT
$IPT -t mangle --policy OUTPUT ACCEPT
 
四、下面的规则在执行脚本是加入参数stop,则不再允许后面的脚本跳出脚本允许
if [ "$1" = "stop" ]
then
echo "Firewall completely stopped!  WARNING: THIS HOST HAS NO FIREWALL RUNNING."
exit 0
fi
五、启动回环接口,对localhost的封包不做任何限制
$IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT
 
六、定义默认策略
安全策略原则上,先紧后送。所以在基本默认策略原则上,将对所有进出数据包和转发数据包均要阻挡。
对filter,nat和mangle表中的规则链默认做数据包丢弃规则。
$IPT --policy INPUT DROP
$IPT --policy OUTPUT DROP
$IPT --policy FORWARD DROP
$IPT -t nat --policy PREROUTING DROP
$IPT -t nat --policy OUTPUT DROP
$IPT -t nat --policy POSTROUTING DROP
$IPT -t mangle --policy PREROUTING DROP
$IPT -t mangle --policy OUTPUT DROP
 
七、对所有TCP扫描封包进行丢弃
# Unclean
$IPT -A INPUT -m unclean -j DROP
# All of the bits are cleared
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
 
 
八、利用连接状态来绕过规则检测,降低检测数据包的数量,增强流量。
不过,需要考虑两个因素。1.系统资源,由于使用连接状态由于要维持连接表消耗大量内存资源。2.连接超时的问题。对于慢速连接和静止连接需要在连接表中清除记录。
 
下面的代码利用判断来启动状态模块
 
if [ "$CONNECTION_TRACKING" = "1" ]; then

    $IPT -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
   
    # Using the state module alone, INVALID will break protocols that use
    # bi-directional connections or multiple connections or exchanges,
    # unless an ALG is provided for the protocol. At this time, FTP and
    # IRC are the only protocols with ALG support.
    $IPT -A INPUT -m state --state INVALID -j LOG \
             --log-prefix "INVALID input: "
    $IPT -A INPUT -m state --state INVALID -j DROP
    $IPT -A OUTPUT -m state --state INVALID -j LOG \
             --log-prefix "INVALID output: "
    $IPT -A OUTPUT -m state --state INVALID -j DROP
fi
 
九、对源地址欺骗和不合法地址访问进行过滤
9.1 拒绝伪装自己接口IP的访问数据包
$IPT -A INPUT -i $INTERNET -s $IPADDR -j DROP
 
9.2 拒绝任何私有IP段访问我的公网接口
# Refuse packets claiming to be from a Class A private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_A -j DROP
# Refuse packets claiming to be from a Class B private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_B -j DROP
# Refuse packets claiming to be from a Class C private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_C -j DROP
 
9.3 拒绝127.0.0.1访问
$IPT -A INPUT -i $INTERNET -s $LOOPBACK -j DROP
 
9.4 拒绝广播地址
a.拒绝广播地址(255.255.255.255)通过防火墙访问,拒绝任何数据包通过防火墙访问广播地址(0.0.0.0)并做LOG记录
# Refuse malformed broadcast packets
$IPT -A INPUT  -i $INTERNET -s $BROADCAST_DEST -j LOG
$IPT -A INPUT  -i $INTERNET -s $BROADCAST_DEST -j DROP
$IPT -A INPUT  -i $INTERNET -d $BROADCAST_SRC  -j LOG
$IPT -A INPUT  -i $INTERNET -d $BROADCAST_SRC  -j DROP
 
b.拒绝访问内网子网掩码地址(255.255.255.0)和网段广播地址(192.168.200.255)
$IPT -A INPUT -i $INTERNET -d $SUBNET_BASE -j DROP
$IPT -A INPUT -i $INTERNET -d $SUBNET_BROADCAST -j DROP
 
c.这个规则会对DHCP的客户端有影响。所以对DHCP需要设置一些例外规则
$IPT -A INPUT -i $INTERNET -d $BROADCAST_DEST -j DROP 
 
d.D类IP的广播地址通常用于UDP广播(视频/音频或者DHCP/路由)而且不会作为发送地址。
$IPT -A INPUT -i $INTERNET -s $CLASS_D_MULTICAST -j DROP 
$IPT -A INPUT -i $INTERNET -p !udp -d $CLASS_D_MULTICAST -j DROP 
$IPT -A INPUT -i $INTERNET -p udp -d $CLASS_D_MULTICAST -j ACCEPT
 
e.E类IP,原本属于保留地址,所以可以使用以下规则来拒绝访问。但是,由于目前这个保留块也被使用,所以在建立这个规则时需要考虑一下。
$IPT -A INPUT -i $INTERNET -s $CLASS_E_RESERVED_NET -j DROP 
 
f.阻挡以下地址的访问,
$IPT -A INPUT -i $INTERNET -s 0.0.0.0/8 -j DROP
$IPT -A INPUT -i $INTERNET -s 169.254.0.0/16 -j DROP
$IPT -A INPUT -i $INTERNET -s 192.0.2.0/24 -j DROP
 
 
十、对Unprivileged端口允许的服务进行保护
Unprivileged port service是指一些网络服务运行在大于1024端口的服务,或者是一些在数据传输时采用不固定端口连接。例如FTP服务,虽然访问端口在21,但是在数据传输的时候,会用一个随机端口和对方建立连接,进行数据传递。在遇到端口扫描的时候,也会被侦测到,从而成为攻击可能。
a. 对分配在非特权端口的常用本地TCP服务
如果linux开启Xwindow服务,由于Xwindow的对外访问端口是6000~6063,则可以用以下规则来阻挡。
XWINDOW_PORTS="6000:6063"
$IPT -A OUTPUT -o $INTERNET -p tcp --syn --destination-port $XWINDOW_PORTS -j REJECT
$IPT -A INPUT -i $INTERNET -p tcp --syn --destination-port $XWINDOW_PORTS -j DROP
 
对于NFS/SOCKS/SQUID等端口的TCP服务阻挡
NFS_PORT="2049"
SOCKS_PORT="1080"
SQUID_PORT="3128"
$IPT -A OUTPUT -o $INTERNET -p tcp -m multiport --destination-port $NFS_PORT,$SOCKS_PORT,$SQUID_PORT --syn -j REJECT
$IPT -A INPUT -i $INTERNET -p tcp -m multiport --destination-port $NFS_PORT,$SOCKS_PORT,$SQUID_PORT --syn -j DROP
 
b.对分配在非特权端口的常用本地UDP服务
下面是针对NFS采用UDP服务所设定的阻挡规则,利用状态模组来设定规则
NFS_PORT="2049"                           # NFS
LOCKD_PORT="4045"                         # RPC lockd for NFS
# NFS and lockd
if [ "$CONNECTION_TRACKING" = "1" ]; then
    $IPT -A OUTPUT -o $INTERNET -p udp \
             -m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
             -m state --state NEW -j REJECT
    $IPT -A INPUT -i $INTERNET -p udp \
             -m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
             -m state --state NEW -j DROP
else
    $IPT -A OUTPUT -o $INTERNET -p udp \
             -m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
             -j REJECT
    $IPT -A INPUT -i $INTERNET -p udp \
             -m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
             -j DROP
fi
 
以上是所有防火墙初始规则,这些规则完全阻挡了所有外部访问和攻击。
 
下一篇,将针对不同的服务开放对应的端口
 
 
阅读(1447) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~