配置iptables防火墙维护Linux/VPS服务器安全

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

也算是最近配置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系统上已经安装了,如果没有安装,请使用下面的命令快速安装:

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

3. 如何使用iptables

3.1 查看规则和清理规则

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

1
2
3
4
5
6
7
8
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

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

1
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独立服务器的批量规则处理脚本,这下我们省事不少:-)下面我摘录并修改如下,供大家参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/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.zipstop.zip,大家分别wget到/root/scripts目录下然后执行下面命令:

1
2
3
4
5
6
cd /root/scripts
unzip 3770912018.zip
unzip 1527571957.zip
mv start.sh start.fw
mv stop.sh stop.fw
chmod +x *.fw

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

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

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

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

启动防火墙:

1
/root/scripts/start.fw

停止防火墙:

1
/root/scripts/stop.fw

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

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!
请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注