Linux防火墙脚本(IPTables.sh\Port.txt)

这是我在Linux服务器上编写的一个脚本(IPTables.sh),包括一个用来开放端口的配置文件(Port.txt),功能是使用iptables命令来自动配置防火墙,加强Linux服务器的安全性。

  • 脚本文件路径:/Run/Bash/IPTables;
  • 配置文件解析:协议(tcp/udp) 端口号(80/443/3389) 系统标记(L代表这台Linux服务器、W代表内网中的Window客户机);
  • CentOS或Redhat服务器自动启动该脚本的方法是在文件(/etc/rc.d/rc.local)尾部添加一行(/Run/Bash/IPTables/IPTables.sh)即可。

1. 主脚本(IPTables.sh)代码

#!/bin/bash
##########################################
##                                      ##
##             防火墙及端口转发         ##
##                                      ##
##              版本号:1.0.6            ##
##                                      ##
##               程序:周杰              ##
##                                      ##
##             日期:2015年02月          ##
##                                      ##
##########################################

##################
## 定义环境变量 ##
##################

###########################################
WORK_PATH="/Run/Bash/IPTables/"
PORT_FILE=$WORK_PATH"Port.txt"
IPTABLES_CMD="/sbin/iptables"
OS_WIN_FLAG="W"
OS_LIN_FLAG="L"
##下面这里需要修改成你的Linux服务器的公网IP
ETH0_ADDR="111.111.111.111"
ETH1_ADDR="192.168.10.1"
WIN_ADDR="192.168.10.10"
NETWORK_ADDR="192.168.10.0"
NETMASK_ADDR="255.255.255.0"
LOCAL_ADDR="127.0.0.1"

#####################
## 打开NAT路由功能 ##
#####################

###########################################
#echo 1>/proc/sys/net/ipv4/ip_forward
#echo 0|sudo tee /proc/sys/net/ipv4/ip_forward
###########################################
echo "1">/proc/sys/net/ipv4/ip_forward
/sbin/modprobe ip_tables
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp 
/sbin/modprobe tun

##################
## 显示开始信息 ##
##################

###########################################
echo -n "Starting IPTables rules..."

##################
## 清除所有规则 ##
##################

###########################################
$IPTABLES_CMD -F
$IPTABLES_CMD -X
$IPTABLES_CMD -t nat -F
$IPTABLES_CMD -t nat -X
$IPTABLES_CMD -Z 

########################
## 重置所有链默认设置 ##
########################

###########################################
##设置INPUT、OUTPUT、FORWARD链路规则如下
##既不允许任何包到达本机,也不允许本机向外发包
###########################################
#$IPTABLES_CMD -P INPUT DROP
$IPTABLES_CMD -P INPUT ACCEPT
$IPTABLES_CMD -P OUTPUT ACCEPT
$IPTABLES_CMD -P FORWARD ACCEPT

$IPTABLES_CMD -t nat -P PREROUTING ACCEPT 
$IPTABLES_CMD -t nat -P POSTROUTING ACCEPT 
$IPTABLES_CMD -t nat -P OUTPUT ACCEPT 
$IPTABLES_CMD -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  

###########################################
#允许本机和本机联系,必须打开,否则listener无法正常启动
###########################################
$IPTABLES_CMD -A INPUT -p ALL -s $LOCAL_ADDR -d $LOCAL_ADDR -j ACCEPT
$IPTABLES_CMD -A OUTPUT -p ALL -s $LOCAL_ADDR -d $LOCAL_ADDR -j ACCEPT
$IPTABLES_CMD -A INPUT -p ALL -s $ETH0_ADDR -d $ETH0_ADDR -j ACCEPT
$IPTABLES_CMD -A OUTPUT -p ALL -s $ETH0_ADDR -d $ETH0_ADDR -j ACCEPT
$IPTABLES_CMD -A INPUT -p ALL -s $ETH1_ADDR -d $ETH1_ADDR -j ACCEPT
$IPTABLES_CMD -A OUTPUT -p ALL -s $ETH1_ADDR -d $ETH1_ADDR -j ACCEPT

$IPTABLES_CMD -A INPUT -i lo -j ACCEPT
$IPTABLES_CMD -A OUTPUT -o lo -j ACCEPT

$IPTABLES_CMD -A INPUT -i eth1 -j ACCEPT
$IPTABLES_CMD -A OUTPUT -o eth1 -j ACCEPT
$IPTABLES_CMD -A FORWARD -i eth1 -j ACCEPT
$IPTABLES_CMD -A FORWARD -o eth1 -j ACCEPT

#添加规则,允许入站的dns连接
$IPTABLES_CMD -A INPUT -p tcp --dport 53 -j ACCEPT
$IPTABLES_CMD -A OUTPUT -p tcp --sport 53 -j ACCEPT
#$IPTABLES_CMD -A INPUT -p udp --dport 53 -j ACCEPT
#$IPTABLES_CMD -A OUTPUT -p udp --sport 53 -j ACCEPT

###########################################
# 开放 ping功能 (设置Icmp 包过滤)
###########################################
#Icmp包通常用于网络测试等,故允许所有的Icmp 包通过。
#黑客常常采用Icmp 进行攻击,如Ping of Death 等,所以我们采用Limit 匹配扩展加以限制。
#$IPTABLES_CMD -A INPUT -p icmp --icmp-type any -j ACCEPT
#$IPTABLES_CMD -A OUTPUT -p icmp --icmp-type any -j ACCEPT
#$IPTABLES_CMD -A FORWARD -p icmp --icmp-type any -j ACCEPT
#$IPTABLES_CMD -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 
#$IPTABLES_CMD -A OUTPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 
#$IPTABLES_CMD -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 

###########################################
# 处理IP 碎片
###########################################
#接受所有的IP碎片,但需要采用Limit匹配扩展
#其单位时间可以通过的IP碎片数量进行限制
#$IPTABLES_CMD -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT 

###########################################
# 开放 DNS 53  功能
###########################################
# 第一次会用UDP封包来查询
#$IPTABLES_CMD -A OUTPUT -o eth0 -p udp -s $ETH0_ADDR --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
#$IPTABLES_CMD -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $ETH0_ADDR --dport 1024:65535 -j ACCEPT
# 若有错误,会改用TCP封包来查询
#$IPTABLES_CMD -A OUTPUT -o eth0 -p tcp -s $ETH0_ADDR --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
#$IPTABLES_CMD -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $ETH0_ADDR --dport 1024:65535 -j ACCEPT

# 添加规则,允许入站的ssh连接
$IPTABLES_CMD -A INPUT -p tcp --dport 22 -j ACCEPT
$IPTABLES_CMD -A OUTPUT -p tcp --sport 22 -j ACCEPT

######################
## 实现端口映射功能 ##
######################

TmpStr=""
while read TmpStr
do
        unset TmpArray
        declare -a TmpArray=(`echo $TmpStr`)
        TmpProtocol=${TmpArray[0]}
        TmpPort=${TmpArray[1]}
        TmpOS=${TmpArray[2]}
        TmpWinIP=${TmpArray[3]}
        TmpWinPort=${TmpArray[4]}

        ############################
        ## 添加规则,允许入站连接 ##
        ############################
        $IPTABLES_CMD -A INPUT -p $TmpProtocol --dport $TmpPort -j ACCEPT
        $IPTABLES_CMD -A OUTPUT -p $TmpProtocol --sport $TmpPort -j ACCEPT

        if [ "$TmpOS" = "W" ]
        then
                ############################
                ## 添加规则,允许端口转发 ##
                ############################
                # 用DNAT作端口映射
        $IPTABLES_CMD -t nat -A PREROUTING -i eth0 -p $TmpProtocol -m $TmpProtocol --dport $TmpPort -j DNAT --to-destination $TmpWinIP:$TmpWinPort
        #$IPTABLES_CMD -t nat -A PREROUTING -d $ETH0_ADDR -p $TmpProtocol -m $TmpProtocol --dport $TmpPort -j DNAT --to-destination $TmpWinIP:$TmpWinPort
                # 用SNAT作源地址转换(关键),以使回应包能正确返回
                $IPTABLES_CMD -t nat -A POSTROUTING -s $NETWORK_ADDR/$NETMASK_ADDR -d $TmpWinIP -p $TmpProtocol -m $TmpProtocol --dport $TmpWinPort -j SNAT --to-source $ETH1_ADDR:$TmpPort

                # 一些人经常忘了打开FORWARD链的相关端口,特此增加
                $IPTABLES_CMD -A FORWARD -o eth1 -d $TmpWinIP -p $TmpProtocol --dport $TmpWinPort -j ACCEPT
                $IPTABLES_CMD -A FORWARD -i eth1 -s $TmpWinIP -p $TmpProtocol --sport $TmpWinPort -m state --state ESTABLISHED -j ACCEPT


        fi

done < "$PORT_FILE"


###########################################
# 打开 IP伪装 让Win服务器能访问外面
###########################################
#$IPTABLES_CMD -t nat -A POSTROUTING -o eth0 -j MASQUERADE

##iptables -A INPUT -i eth0 -p TCP -s 192.168.10.0/24 --dport 111 -j ACCEPT
##iptables -A INPUT -i eth0 -p UDP -s 192.168.10.0/24 --dport 111 -j ACCEPT

#/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 202.103.25.137

######## 显示结束信息
echo " [ OK ] "

exit 0

2. 配置文件(Port.txt)代码


tcp  21  L
tcp  23  L
tcp  80  L
tcp  3389  W
tcp  12345  W
udp  12345  W

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.安全技术 (1)入侵检测与管理系统(Intrusion Detection Systems): 特点是不阻断任...
    尛尛大尹阅读 7,237评论 0 2
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,333评论 0 5
  • 防火墙的概念iptables的简介iptables命令网络防火墙NATfirewalld服务 一、防火墙的概念 (...
    哈喽别样阅读 5,818评论 0 1
  • 2017年7月9日,亲爱的天父爸爸,今天是主日,是敬拜你的日子,我心所愿的,好多年前,我有一个愿望,信徒都自由自在...
    陈小兰阅读 1,807评论 0 0
  • 之前就听过太多的婆媳不和的事,女性朋友聚在一起聊得最多也是婆媳相处,对婆婆的不满,和婆婆这样那样的矛盾。很多时候我...
    Queenie77阅读 1,612评论 0 0