五、启动回环接口,对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
以上是所有防火墙初始规则,这些规则完全阻挡了所有外部访问和攻击。
下一篇,将针对不同的服务开放对应的端口