Linux - 用Iptables构建主机防火墙安全

2024-05-26 13:57:07 浏览数 (2)

概述

设置主机防火墙在网络安全中具有重要意义。主机防火墙是一种软件或硬件系统,可以监控和控制进出主机的网络流量。它的作用包括:

  1. 保护主机免受未经授权的访问: 主机防火墙可以限制网络流量,防止未经授权的访问进入主机。这有助于防止恶意攻击者通过网络攻击入侵系统或窃取敏感信息。
  2. 减少攻击面: 通过仅允许特定的网络流量通过,主机防火墙可以减少系统的攻击面,从而降低系统受到攻击的可能性。它可以阻止许多常见的网络攻击,如端口扫描、拒绝服务攻击等。
  3. 监控和记录网络流量: 主机防火墙可以监控主机上的网络流量,并记录网络活动。这有助于发现潜在的安全问题,以及跟踪和调查安全事件。
  4. 加强安全策略: 通过配置主机防火墙,可以实施细粒度的安全策略,根据特定的安全要求和网络环境来限制网络流量。这使得管理员能够根据实际需求来保护主机,确保符合公司的安全标准和合规要求。

通常涉及以下步骤:

  • 选择合适的防火墙软件或硬件: 根据需求选择适合的主机防火墙产品,可以是商业产品或开源产品。
  • 配置防火墙规则: 确定哪些网络流量允许通过,哪些需要被阻止,并配置相应的防火墙规则。这通常涉及定义允许或拒绝特定端口、协议和IP地址的规则。
  • 更新和维护: 定期更新主机防火墙软件和规则,以确保及时响应新的安全威胁和漏洞。
  • 监控和审计: 对主机防火墙进行监控和审计,以确保它有效地保护系统并符合安全标准和合规要求。

通过设置主机防火墙,可以提高系统的安全性,降低受到网络攻击的风险,并保护敏感数据免受未经授权的访问。


Shell脚本实现

代码语言:javascript复制
#!/bin/bash


# 检查iptables服务是否存在
iptables_exists=$(sudo systemctl --type=service list-unit-files | grep -i "iptables")
# 检查firewalld服务是否存在
firewalld_exists=$(sudo systemctl --type=service list-unit-files | grep -i "firewalld")
# 初始化变量
iptables_status=$(sudo service iptables status &>/dev/null; echo $?)
if [ "$iptables_exists" != "" ] && [ "$firewalld_exists" != "" ]; then
	echo "同时存在iptables和firewalld服务,未避免冲突将停用firewalld服务,请确认是否停用?(y/n)"
	read -p "请输入 'y' or 'n': " user_input
	if [ "$user_input" == "y" ]; then
		# 执行停止服务器的命令
		echo "firewalld服务正在停止..."
		sudo systemctl stop firewalld
		sudo systemctl disable firewalld
		sudo systemctl enable iptables
		sudo systemctl start iptables
		echo "firewalld服务已停用,并启用iptables"
	else
		echo "已取消操作"
		echo "请按任意键退出程序..."
		read -n 1 -s
		exit
	fi
else
	if [ "$iptables_exists" != "" ]; then
		sudo systemctl enable iptables
		sudo systemctl start iptables
	else
		echo "iptables服务不存在"
	fi
	if [ "$firewalld_exists" != "" ]; then
		echo "存在firewalld服务,当前脚本不支持firewalld防火墙配置"
	else
		echo "firewalld服务不存在"
	fi
fi
# 判断iptables是否在运行
if [ $iptables_status -eq 0 ]; then
	echo "iptables已启用"
	echo "执行此脚本前请先确认脚本中的端口是否与现场配置情况一致,不一致请根据现场情况调整!"
	echo ""
	read -p "请按任意键继续,或按Ctrl C退出:"
	echo "请选择部署方式:"
	echo "1. 单机部署"
	echo "2. 集群部署"
	read choice

	case $choice in
		1)
			echo "执行单机部署模式下防火墙配置脚本"
			echo "服务器默认1个,若不满足可根据现场实际情况修改脚本"
			echo ""
			read -p "请按任意键继续,或按Ctrl C退出:"
			echo "请输入服务器ip1:"
			read trusted_ip1
			
			# 允许所有流量通过
			sudo iptables -t filter -P INPUT ACCEPT
			# 清空所有规则
			sudo iptables -F
			# 允许本地回环地址和特定IP地址的流量通过
			sudo iptables -t filter -A INPUT -i lo -j ACCEPT
			# 拒绝特定端口的流量  端口最多支持13个,如果多余13个请分两行 
			sudo iptables -A INPUT -p tcp -m multiport --dport 8889,9000,9765 -j REJECT
			sudo iptables -A INPUT -p tcp -m multiport --dport 8888,9098,9765 -j REJECT
			# 允许来自特定IP地址的TCP流量
			sudo iptables -I INPUT -p TCP -m multiport --dport 8443,12345 -j DROP
			sudo iptables -I INPUT -s 127.0.0.1,$trusted_ip1 -p TCP -m multiport --dport 8443,12345 -j ACCEPT
			# 保存iptables规则
			sudo mkdir -p /etc/artisaniptables
			sudo iptables-save > /etc/artisaniptables/rules.v4

			# 开启自动重新加载,请根据自身系统,选择合适的加载时机
			sudo echo "iptables-restore < /etc/artisaniptables/rules.v4" | sudo tee -a /etc/rc.local
			;;
		2)
			echo "执行集群部署模式下防火墙配置脚本"
			echo "服务器默认1个,若不满足可根据现场实际情况修改脚本"
			echo ""
			read -p "请按任意键继续,或按Ctrl C退出:"
			echo "请输入服务器ip1:"
			read trusted_ip1
			echo "集群服务器默认3台,若不满足请根据现场实际情况修改脚本"
			echo ""
			read -p "请按任意键继续,或按Ctrl C退出:"
			echo "请输入本机ip地址:"
			read local_ip
			echo "请输入集群ip1:"
			read cluster_ip1
			echo "请输入集群ip2:"
			read cluster_ip2

			# 允许所有流量通过
			sudo iptables -t filter -P INPUT ACCEPT
			# 清空所有规则
			sudo iptables -F
			# 允许本地回环地址和特定IP地址的流量通过
			sudo iptables -t filter -A INPUT -i lo -j ACCEPT
			# 允许特定端口的流量通过  端口最多支持13个,如果多余13个请分两行 
			sudo iptables -I INPUT 1 -p tcp -s 127.0.0.1,$local_ip,$cluster_ip1,$cluster_ip2 -m multiport --dport 8889,9876 -j ACCEPT
			sudo iptables -I INPUT 1 -p tcp -s 127.0.0.1,$local_ip,$cluster_ip1,$cluster_ip2 -m multiport --dport 8888,9098,8897 -j ACCEPT
			sudo iptables -A INPUT -p tcp -m multiport --dport 8889,9400,9001 -j REJECT
			sudo iptables -A INPUT -p tcp -m multiport --dport 18888,13776 -j REJECT
			# 允许来自特定IP地址的TCP流量
			sudo iptables -I INPUT -p TCP -m multiport --dport 2122,9123,10123 -j DROP
			sudo iptables -I INPUT -s 127.0.0.1,$trusted_ip1 -p TCP -m multiport --dport 2122,9123,10123 -j ACCEPT
			# 保存iptables规则
			sudo mkdir -p /etc/artisaniptables
			sudo iptables-save > /etc/artisaniptables/rules.v4

			# 开启自动重新加载,请根据自身系统,选择合适的加载时机
			echo "iptables-restore < /etc/artisaniptables/rules.v4" | sudo tee -a /etc/rc.local
			;;
		*)
			echo "输入错误,请输入1或2"
			;;
	esac
	echo "防火墙已配置完成,请根据【端口外漏检测】检查配置是否生效"
else
	echo "当前系统不支持iptables或iptables未启用"
fi
echo "请按任意键退出程序..."
read -n 1 -s
exit

这个脚本是用来配置防火墙的,主要是针对iptables服务和firewalld服务的检测与配置。

  1. 检查服务存在性:通过systemctl命令检查iptables和firewalld服务是否存在。
  2. 停用firewalld服务:如果同时存在iptables和firewalld服务,给用户一个选项来停用firewalld服务以避免冲突。
  3. 防火墙规则配置:根据用户选择的部署方式(单机或集群),配置相应的iptables规则。
  4. 保存配置:将配置保存到/etc/artisaniptables/rules.v4文件中,以便系统重启后规则能够自动加载。
  5. 启用自动重新加载:根据系统选择合适的加载时机,添加iptables规则重新加载命令到/etc/rc.local文件中。

0 人点赞