提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

也算是最近配置VPS的笔记吧,系统是Debian 5.0。

1. 什么是iptables

摘自 百度百科 :iptables 是与最新的 2.4.x 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

准确的说iptables是IP信息包过滤系统,实际应用可以看作是防火墙,而且配置灵活,功能强大。如果我把Windows平台服务器迁移到Linux上面来的话,这个应该是取代ISA(Internet Security and Acceleration)或者ForeFront TMG的首选。

2. 如何获取iptables

可能有些Linux系统上已经安装了,如果没有安装,请使用下面的命令快速安装:

# Debian Ubuntu 系列使用apt-get
apt-get install iptables
# 或者CentOS Fedora 系列使用yum
yum install iptables

3. 如何使用iptables

3.1 查看规则和清理规则

使用iptables -L查看所有规则,正常情况下应该没有任何规则,如下:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

如果不是这样,建议使用下面的指令清空现有规则,以便于我们下一步操作:

iptables -F

3.2 配置并维护Linux/VPS服务器安全

nixCraft上的 《Top 20 Nginx WebServer Best Security Practices》 这篇文章很有借鉴意义,详细讲解了Linux服务器安全的方方面面,其中也提及到iptables的配置,这篇文章的中译版叫《20个Nginx Web服务器最佳安全实践》,大家可以搜索一下。在查阅这篇文章的同时还发现nixCraft的另外一篇文章 《Linux Iptables Firewall Shell Script For Standalone Server》 ,主要讲解的是iptables独立服务器的批量规则处理脚本,这下我们省事不少:-)下面我摘录并修改如下,供大家参考:

#!/bin/bash
# A Linux Shell Script with common rules for IPTABLES Firewall.
# By default this script only open port 80, 22, 53 (input)
# All outgoing traffic is allowed (default - output)
# -------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
 
IPT="/sbin/iptables"
SPAMLIST="blockedip"
SPAMDROPMSG="BLOCKED IP DROP"
 
echo "Starting IPv4 Wall..."
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
modprobe ip_conntrack
 
[ -f /root/scripts/blocked.ips.txt ] && BADIPS=$(egrep -v -E "^#|^$" /root/scripts/blocked.ips.txt)

# Xen VPS 网卡是eth0这种形式
# OpenVZ VPS 网卡是venet0这种形式
# 请自行使用ifconfig获取
PUB_IF="eth0"
 
#unlimited
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
 
# DROP all incomming traffic
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
 
if [ -f /root/scripts/blocked.ips.txt ];
then
# create a new iptables list
$IPT -N $SPAMLIST
 
for ipblock in $BADIPS
do
   $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
   $IPT -A $SPAMLIST -s $ipblock -j DROP
done
 
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
fi
 
# Block sync
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW  -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Drop Sync"
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW -j DROP
 
# Block Fragments
$IPT -A INPUT -i ${PUB_IF} -f  -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragments Packets"
$IPT -A INPUT -i ${PUB_IF} -f -j DROP
 
# Block bad stuff
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL ALL -j DROP
 
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -j DROP # NULL packets
 
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
 
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #XMAS
 
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -j DROP # FIN packet scans
 
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
 
# Allow full outgoing connection but no incomming stuff
$IPT -A INPUT -i ${PUB_IF} -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o ${PUB_IF} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
 
# Allow ssh
$IPT -A INPUT -p tcp --destination-port 22 -j ACCEPT
# 只允许同时10个SSH连接
$IPT -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 10 -j REJECT
# 限制ssh每隔15秒才能重连
$IPT -A INPUT -p tcp -i ${PUB_IF} -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
$IPT -A INPUT -p tcp -i ${PUB_IF} -m state --state NEW --dport 22 -m recent --set -j ACCEPT

# allow incomming ICMP ping pong stuff
# 去掉注释并允许ping等ICMP协议
#$IPT -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$IPT -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Allow port 53 tcp/udp (DNS Server)
$IPT -A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
 
$IPT -A INPUT -p tcp --destination-port 53 -m state --state NEW,ESTABLISHED,RELATED  -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Open port 80
$IPT -A INPUT -p tcp --destination-port 80 -j ACCEPT
# The following example will drop incoming connections
# if IP make more than 15 connection attempts to port 80 within 60 seconds:
# 60秒内80端口大于15个连接数则Drop
$IPT -A INPUT -p tcp --dport 80 -i ${PUB_IF} -m state --state NEW -m recent --set
$IPT -A INPUT -p tcp --dport 80 -i ${PUB_IF} -m state --state NEW -m recent --update --seconds 60  --hitcount 15 -j DROP

##### Add your rules below ######
 
##### END your rules ############
 
# Do not log smb/windows sharing packets - too much logging
$IPT -A INPUT -p tcp -i ${PUB_IF} --dport 137:139 -j REJECT
$IPT -A INPUT -p udp -i ${PUB_IF} --dport 137:139 -j REJECT
 
# log everything else and drop
$IPT -A INPUT -j LOG
$IPT -A FORWARD -j LOG
$IPT -A INPUT -j DROP
 
exit 0

为了便于大家应用,我已经打包放上来了,一共两个文件,分别是 start.zip stop.zip ,大家分别wget到/root/scripts目录下然后执行下面命令:

cd /root/scripts
unzip 3770912018.zip
unzip 1527571957.zip
mv start.sh start.fw
mv stop.sh stop.fw
chmod +x *.fw

修改start.fw为你所需要的内容:

vi /root/scripts/start.fw
# 或者使用nano编辑器
nano /root/scripts/start.fw

如果要安装到系统内,请使用下面的命令:

echo '/root/scripts/start.fw' >> /etc/rc.local

启动防火墙:

/root/scripts/start.fw

停止防火墙:

/root/scripts/stop.fw

好,基本上就这些,基于这个脚本,我们然后再逐步开放我们所需要的端口,是不是有点像ISA呢?