Skip to content

防火墙 ​

警告

每次编辑或更新防火墙后,Hestia 都会清除当前的 iptables,除非通过 Hestia 和 自定义脚本 添加规则。

如何打开或阻止端口或 IP? ​

  1. 进入Hestia web 控制面版单击右上角的 服务器 图标导航至服务器设置。
  2. 单击 防火墙 按钮。
  3. 单击 添加规则 按钮。
  4. 选择所需的操作。
  5. 选择所需的协议。
  6. 输入您希望应用此规则的端口(“0”表示所有端口)。
  7. 设置此规则适用的 IP(所有 IP 为“0.0.0.0/0”)或选择一个 IP 地址。
  8. (可选)描述规则的功能。
  9. 单击右上角的 保存 按钮。

您还可以使用 v-add-firewall-rule 命令。

如何设置 IPSet 黑名单或白名单? ​

IPSet是一个用于管理IP地址集合的工具。它允许创建、修改和删除包含IP地址、网络子网和端口号的集合。IPSet提供了高效的数据结构和算法,能够快速进行IP地址的匹配和查找。IPSet经常与防火墙软件(如iptables)一起使用,用于实现更高级的网络规则和过滤策略,提高iptables的灵活性并简化其规则。IPSet使用索引数据结构存储集合,这使得它在查询大型集合时效率非常高。

  1. 单击右上角的 服务器 图标导航至服务器设置。
  2. 单击 防火墙 按钮。
  3. 单击 管理 IP 列表 按钮。
  4. 单击 添加 IP 列表 按钮。
  5. 为您的 IP 列表命名。
  6. 通过输入以下内容之一来选择数据源:
    • URL:http://ipverse.net/ipblocks/data/countries/nl.zone
    • 脚本(使用 chmod 755为脚本赋予权限):/usr/local/hestia/install/deb/firewall/ipset/blacklist.sh
    • 文件:file:/location/of/file
    • 您还可以使用 Hestia 包含的来源之一。
  7. 选择所需的 IP 版本(v4 或 v6)。
  8. 选择是否自动更新列表。
  9. 单击右上角的 保存 按钮。

如何自定义iptables规则? ​

警告!

这是一个高级且危险的功能,请确保您知道自己在做什么。

Hestia支持使用脚本来设置自定义规则、链或标志等。

脚本必须放在这里:/usr/local/hestia/data/firewall/custom.sh

  1. 创建custom.sh:touch /usr/local/hestia/data/firewall/custom.sh
  2. 使其可执行:chmod +x /usr/local/hestia/data/firewall/custom.sh
  3. 使用您喜欢的编辑器编辑它。
  4. 测试并确保它工作正常。
  5. 要使自定义规则持久化,请运行:v-update-firewall

防火墙保护: 在使规则持久化之前,如果您犯了错误或锁定了自己无法访问服务器,只需重启即可。

custom.sh示例:

bash
#!/bin/bash

# 获取iptables命令的路径
IPTABLES="$(command -v iptables)"

# 创建一个名为YOURCHAIN的新链
$IPTABLES -N YOURCHAIN

# 清空YOURCHAIN链中的所有规则
$IPTABLES -F YOURCHAIN

# 在YOURCHAIN链中添加一条规则,允许来自任何地址(0.0.0.0/0)的流量返回(即不做任何处理)
$IPTABLES -I YOURCHAIN -s 0.0.0.0/0 -j RETURN

# 在INPUT链的开头插入一条规则,将所有TCP流量(端口1到65535)重定向到YOURCHAIN链
$IPTABLES -I INPUT -p TCP -m multiport --dports 1:65535 -j YOURCHAIN

我的 IP 集群不起作用 ​

IP集群必须包含至少 10 个 IP 或 IP 范围。

我可以将多个源合并为一个吗? ​

如果您想将多个 IP 源组合在一起,可以使用以下脚本来实现: 如需查看更多请访问rir-ip

bash
#!/bin/bash

BEL=(
	# 国家:比利时
	"https://raw.githubusercontent.com/ipverse/rir-ip/master/country/be/ipv4-aggregated.txt"
	# 国家:荷兰
	"https://raw.githubusercontent.com/ipverse/rir-ip/master/country/nl/ipv4-aggregated.txt"
	# 国家:卢森堡
	"https://raw.githubusercontent.com/ipverse/rir-ip/master/country/lu/ipv4-aggregated.txt"
	# 国家:中国 
	"https://raw.githubusercontent.com/ipverse/rir-ip/master/country/ch/aggregated.json"
    "https://raw.githubusercontent.com/ipverse/rir-ip/master/country/ch/ipv4-aggregated.txt"
    "https://raw.githubusercontent.com/ipverse/rir-ip/master/country/ch/ipv6-aggregated.txt"
)

IP_BEL_TMP=$(mktemp)
for i in "${BEL[@]}"; do
	IP_TMP=$(mktemp)
	((HTTP_RC = $(curl -L --connect-timeout 10 --max-time 10 -o "$IP_TMP" -s -w "%{http_code}" "$i")))
	if ((HTTP_RC == 200 || HTTP_RC == 302 || HTTP_RC == 0)); then # "0" because file:/// returns 000
		command grep -Po '^(?:\d{1,3}\.){3}\d{1,3}(?:/\d{1,2})?' "$IP_TMP" | sed -r 's/^0*([0-9]+)\.0*([0-9]+)\.0*([0-9]+)\.0*([0-9]+)$/\1.\2.\3.\4/' >> "$IP_BEL_TMP"
	elif ((HTTP_RC == 503)); then
		echo >&2 -e "\\nUnavailable (${HTTP_RC}): $i"
	else
		echo >&2 -e "\\nWarning: curl returned HTTP response code $HTTP_RC for URL $i"
	fi
	rm -f "$IP_TMP"
done

sed -r -e '/^(0\.0\.0\.0|10\.|127\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.|192\.168\.|22[4-9]\.|23[0-9]\.)/d' "$IP_BEL_TMP" | sort -n | sort -mu
rm -f "$IP_BEL_TMP"

根据http3 协议发布 | http3