这是我在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