配置iptables防火墙维护Linux/VPS服务器安全
提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!
也算是最近配置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呢?