如何利用花生壳建立云服务器(VPS)防火墙

firewall

前言

随着云服务器(VPS)的流行,很多小伙伴都建立起自己的博客或梯子服务器。但安全问题是一个不容忽视的问题,要不然就很容易成为黑客们的“肉鸡”。一般的安全处理方法:设置强密码、更改默认服务端口号、使用密钥登陆……

今天介绍的是基于iptables防火墙。利用系统iptables建立起防火墙规则,普通用户只允许网站(80、443端口)的访问,iptables根据IP来识别管理员,对管理员则是全部端口开放。

但国内的运营商绝大部分分配的都是动态公网IP,如何保证我们在公网IP发生变化后,iptables依旧能把我们最新的公网IP进行更新呢?
这时候我们可以利用花生壳动态域名解析实现。
脚本通过crond定时刷新管理员的花生壳域名,从而更新iptables规则中管理员的白名单IP。
可以先看看拓扑图:
ddns-firewall-topology

一键部署脚本

开始部署

1、花生壳:注册 -> 下载 -> 安装 -> 启用客户端。传送门:www.oray.com
1、下载、解压,得到init_firewall.sh脚本
2、使用root权限执行

sh ./init_firewall.sh

3、输入你的花生壳域名(千万不要输错),然后一切就完成了。服务器只会开放80和443端口,其他所有端口只针对花生壳域名当前的IP开放。
下面我们解释一下脚本做了些什么事情。

脚本详解

1、脚本存放目录

[root@localhost ~]# mkdir /root/iptables/

2、防火墙脚本

#!/bin/bash
IPT="/sbin/iptables"
DOMAIN="yourDomain"
DIGFILE="/tmp/.digfile"
RECORD=`dig +short $DOMAIN`

[[ "$RECORD" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || exit 1
IPT_REFRESH() {
    echo $RECORD >$DIGFILE
    $IPT -F
    $IPT -X
    $IPT -Z
    $IPT -P INPUT DROP
    $IPT -P FORWARD DROP
    $IPT -P OUTPUT ACCEPT
    $IPT -A INPUT -i lo -j ACCEPT
    $IPT -A FORWARD -i lo -j ACCEPT
    $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
    $IPT -A INPUT -s $RECORD -j ACCEPT
}
MAIN() {
    if [[ -f $DIGFILE ]]
    then
        [[ "$RECORD" ==  "`cat $DIGFILE`" ]] && exit 1 || IPT_REFRESH
    else
        IPT_REFRESH
    fi
}
MAIN

3、增加计划任务(每分钟刷新一次)

[root@localhost ~]# crontab -l |grep hsk_iptables  
*/1 * * * * sh /root/iptables/hsk_iptables.sh > /tmp/hsk_iptables.log 2>&1

iptables相关命令

清空所有链表规则

iptables -F
iptables -X
iptables -Z

设置默认策略

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

允许本地环回接口

iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT

允许已经建立或者相关联的数据包

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

允许目的端口为80和443的指定数据包(开放本机的WEB服务端口)

iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

允许指定IP的所有流入数据包

iptables -A INPUT -s $RECORD -j ACCEPT