防火墙
警告
每次编辑或更新防火墙后,Hestia 都会清除当前的 iptables,除非通过 Hestia 和 [自定义脚本](# 如何自定义 iptables 规则?) 添加规则。
如何打开或阻止端口或 IP?
- 进入Hestia web 控制面版单击右上角的 服务器 图标导航至服务器设置。
- 单击 防火墙 按钮。
- 单击**添加规则**按钮。
- 选择所需的操作。
- 选择所需的协议。
- 输入您希望应用此规则的端口(“0”表示所有端口)。
- 设置此规则适用的 IP(所有 IP 为“0.0.0.0/0”)或选择一个 IP 地址。
- (可选)描述规则的功能。
- 单击右上角的 保存 按钮。
您还可以使用 v-add-firewall-rule 命令。
如何设置 IPSet 黑名单或白名单?
IPSet是一个用于管理IP地址集合的工具。它允许创建、修改和删除包含IP地址、网络子网和端口号的集合。IPSet提供了高效的数据结构和算法,能够快速进行IP地址的匹配和查找。IPSet经常与防火墙软件(如iptables)一起使用,用于实现更高级的网络规则和过滤策略,提高iptables的灵活性并简化其规则。IPSet使用索引数据结构存储集合,这使得它在查询大型集合时效率非常高。
- 单击右上角的 服务器 图标导航至服务器设置。
- 单击 防火墙 按钮。
- 单击**管理 IP 列表**按钮。
- 单击 添加 IP 列表 按钮。
- 为您的 IP 列表命名。
- 通过输入以下内容之一来选择数据源:
- 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 包含的来源之一。
- URL:
- 选择所需的 IP 版本(v4 或 v6)。
- 选择是否自动更新列表。
- 单击右上角的 保存 按钮。
如何自定义 iptables 规则?
警告
这是危险的高级功能,请确保您了解自己在做什么。
Hestia 支持使用脚本设置自定义规则、链或标志等。
脚本必须位于:/usr/local/hestia/data/firewall/custom.sh
- 创建custom.sh:
touch /usr/local/hestia/data/firewall/custom.sh
- 使其可执行:
chmod +x /usr/local/hestia/data/firewall/custom.sh
- 使用您最喜欢的编辑器对其进行编辑。
- 测试并确保其有效。
- 要使自定义规则持久化,请运行:
v-update-firewall
隐式保护: 在使规则生效之前,如果您搞砸了或将自己锁定在服务器之外,只需重新启动即可。
自定义.sh 示例:
bash
#!/bin/bash
IPTABLES="$(command -v iptables)"
$IPTABLES -N YOURCHAIN
$IPTABLES -F YOURCHAIN
$IPTABLES -I YOURCHAIN -s 0.0.0.0/0 -j RETURN
$IPTABLES -I INPUT -p TCP -m multiport --dports 1:65535 -j YOURCHAIN
我的 IP 集群不起作用
IP集群必须包含至少 10 个 IP 或 IP 范围。
我可以将多个源合并为一个吗?
如果您想将多个 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"
)
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"