[Share Experiences] Gufw(软防)的配置方式解决。补充(2025,2,5)
Tofloor
poster avatar
LinuxhzxWuLiao@outlook.com
deepin
2024-04-22 01:27
Author

大家好,近期我在研究Gufw(软防)的配置方法时发现了一个普遍存在的问题。多数用户可能在配置时犯了错误。正确的做法是首先拒绝所有的传入和传出连接,这样做的目的是仅允许必要的连接通过。接下来,我将分步介绍如何配置443、80和53端口。

首先,我们来配置443和80端口,这一步非常重要。然后,我们将配置53端口,需要注意的是,这一步需要在deepin的网络接口设置中完成,下面以使用360dns为例进行说明。

实例443.png

实例53.png

对于那些追求更高安全性的人来说,我推荐使用nslookup和ping命令来解析需要访问的网站域名,并将得到的IP地址填入目的IP字段。此外,别忘了导出配置文件,以便在重新安装deepin系统后能够快速导入。下面以bing.com为例进行演示。

未命名03.jpeg

最后,我还想提一下deepin的MAC功能。巧妙利用这一功能,可以帮助我们在网络上保持匿名。请看下面的示例。

活用MAC.jpeg

请注意,44.44.45.3这个IP地址是我从路由器那里获得的。此外,术语“出来”应更正为“出站”,“进入”应更正为“进站”。所谓的“从”指的是源IP,“至”则是目的IP。在防火墙的基本原理中,只要源IP和目的IP之间建立了连接,目的IP也可以反过来连接源IP。

如果可能的话,您可以考虑与硬件防火墙一起使用这些设置,以获得更强大的保护。此外,MAC地址是追踪个人网络活动的重要信息。您可以尝试使用在线生成MAC地址的服务来创建虚拟的MAC地址。

以下是python的脚本。

import time
import socket
# 域名列表
domains = ['','','','','','','']
# 查询次数
queries = 5
# 等待时间(秒)
wait_time = 10
# 已经得到的IP地址集合
ip_addresses = set()
for _ in range(queries):
    for domain in domains:
        try:
            ip_address = socket.gethostbyname(domain)
            ip_addresses.add(ip_address)
        except socket.gaierror as e:
            print(f'无法解析 {domain}: {e}')
        print(f'已查询 {domain},当前IP地址是: {ip_address}')
    time.sleep(wait_time)
# 输出所有唯一的IP地址
print("\n所有不同的IP地址:")
for ip in ip_addresses:
    print(ip)

其中''单引号内是写域名的,可以写多个。会查询5次同一个域名,但是以上方法我已经试过,我朝着别的方向发展了,这个锁定ip的方式更适合单一、专精、需求面极小的操作。比如网页登录。我个人认为应该优先解决结合市面上的硬件防火墙使用gufw。

还有一个情报要提供,就是360的DNS,https://saas.360.cn/,这个360企业安全云的付费DNS我也试过了,但是他的用户更适合在国内网络极端不安全的情况,比如有需要保护设备的”去向“连接是否会接触到恶意的域名,甚至抵御一些基于https层面的攻击。这个不太贵,1000块一年可以按月支付。

还有就是我已经将gufw和deepin结合起来实现有gufw功能的硬件防火墙,可以用来保护无法安装gufw的系统,比如windows/fydeos等等,不过,会涉及到一些边缘的技术和代码,我觉得避免触犯雷池更重要。所以就没打算发。

我们不能抛弃没有硬件防火墙的用户,所以我查询和编写了这两个脚本,第一个是将一段时间内IP写进指定路径,超时将阻断网络。第二个是将IP库写进iptables以只允许ip库里的ip。

#!/bin/bash
# 初始化学习时间选项
initial_learning_options=("3" "10" "30" "60")
# 提示用户选择初始化学习时间
echo "请选择初始学习时间(分钟):"
select option in "${initial_learning_options[@]}"; do
    case $option in
        "3")
            initial_learning_time=180
            break
            ;;
        "10")
            initial_learning_time=600
            break
            ;;
        "30")
            initial_learning_time=1800
            break
            ;;
        "60")
            initial_learning_time=3600
            break
            ;;
        *)
            echo "无效选项,请重试。"
            ;;
    esac
done
# 提示用户是否需要创建新的 IP 库文件
while true; do
    read -p "是否需要创建新的 IP 库文件?(Y/N): " create_new
    if [[ "$create_new" =~ ^[Yy]$ ]]; then
        read -p "请输入新文件的完整路径和文件名(例如:/path/to/A.txt ): " known_ips_file
        touch "$known_ips_file"
        if [ $? -ne 0 ]; then
            echo "文件创建失败,请检查路径和权限。"
        else
            break
        fi
    elif [[ "$create_new" =~ ^[Nn]$ ]]; then
        read -p "请输入现有 IP 库文件的完整路径和文件名(例如:/path/to/A.txt ): " known_ips_file
        if [ ! -f "$known_ips_file" ]; then
            echo "文件不存在,请重新输入。"
        else
            break
        fi
    else
        echo "无效选项,请输入 Y 或 N。"
    fi
done
# 函数:学习新的 IP 地址
learn_ip() {
    ip=$1
    if ! is_known_ip "$ip"; then
        echo "$ip" >> "$known_ips_file"
    fi
}
# 函数:检查 IP 是否已学习
is_known_ip() {
    ip=$1
    grep -q "^$ip$" "$known_ips_file"
    return $?
}
# 函数:阻断所有出站连接
block_outgoing() {
    sudo iptables -I OUTPUT 1 -j DROP
    trap clear_ufw_rules EXIT INT TERM
}
# 函数:允许所有出站连接
allow_outgoing() {
    sudo iptables -D OUTPUT 1
    trap - EXIT INT TERM
}
# 函数:清除 UFW 规则
clear_ufw_rules() {
    sudo iptables -D OUTPUT 1
}
# 获取当前连接的 IP 地址
get_current_ips() {
    netstat -ntu | awk 'NR>2 {print $5}' | cut -d: -f1 | sort | uniq
}
# 初始学习阶段
echo "初始学习阶段为 $((initial_learning_time / 60)) 分钟..."
start_time=$(date +%s)
end_time=$((start_time + initial_learning_time))
while [ $(date +%s) -lt $end_time ]; do
    current_ips=$(get_current_ips)
    for ip in $current_ips; do
        if ! is_known_ip "$ip"; then
            learn_ip "$ip"
        fi
    done
    sleep 5  # 调整轮询间隔
done
# 检查是否有新的IP地址被学习
new_ips_learned=false
while read -r ip; do
    if ! is_known_ip "$ip"; then
        new_ips_learned=true
        break
    fi
done < <(get_current_ips)
if [ "$new_ips_learned" = false ]; then
    echo "学习时间已过,还未检测到新的IP,可以关闭脚本,文档已经保存。"
else
    echo "初始学习阶段结束,已检测到新的IP。"
fi
# 主监控循环
while true; do
    current_ips=$(get_current_ips)
    for ip in $current_ips; do
        if ! is_known_ip "$ip"; then
            echo "检测到未知 IP: $ip"
            block_outgoing
            # 询问用户是否继续学习
            while true; do
                read -p "是否允许学习此 IP?(Y/N): " choice
                if [[ "$choice" =~ ^[Yy]$ ]]; then
                    # 提示用户选择后续学习时间
                    subsequent_learning_options=("1" "5" "10")
                    echo "请选择后续学习时间(分钟):"
                    select option in "${subsequent_learning_options[@]}"; do
                        case $option in
                            "1")
                                subsequent_learning_time=60
                                break
                                ;;
                            "5")
                                subsequent_learning_time=300
                                break
                                ;;
                            "10")
                                subsequent_learning_time=600
                                break
                                ;;
                            *)
                                echo "无效选项,请重试。"
                                ;;
                        esac
                    done
                    allow_outgoing
                    # 在后续学习阶段记录指定时间内的所有IP地址
                    learning_start_time=$(date +%s)
                    learning_end_time=$((learning_start_time + subsequent_learning_time))
                    while [ $(date +%s) -lt $learning_end_time ]; do
                        current_ips=$(get_current_ips)
                        for ip in $current_ips; do
                            if ! is_known_ip "$ip"; then
                                learn_ip "$ip"
                            fi
                        done
                        sleep 5  # 调整轮询间隔
                    done
                    break
                elif [[ "$choice" =~ ^[Nn]$ ]]; then
                    echo "网络连接已放行,文档已存,执行第二部分。"
                    exit 1
                else
                    echo "无效选项,请输入 Y 或 N。"
                fi
            done
        fi
    done
    sleep 5  # 调整轮询间隔
done

#!/bin/bash
# 提示用户输入文件路径
read -p "请输入包含IP地址的文件路径: " IP_FILE

# 检查用户是否提供了有效的文件路径
if [ -z "$IP_FILE" ]; then
    echo "错误: 必须提供有效的文件路径。"
    exit 1
fi

# 检查文件是否存在
if [ ! -f "$IP_FILE" ]; then
    echo "错误: 文件 $IP_FILE 不存在。"
    exit 1
fi

# 提示信息
echo "警告: 添加后只能重置ufw配置文件才可以恢复。"
read -p "按 Enter 键继续..."

# 读取文件中的IP地址并设置iptables规则
while IFS= read -r ip; do
    if [ -z "$ip" ]; then
        echo "跳过空行"
        continue
    fi
    rule="sudo iptables -A ufw-user-output -s 192.168.3.22 -d $ip -j ACCEPT"
    echo "正在添加规则: $rule"
    eval "$rule"
done < "$IP_FILE"

echo "规则已设置完成。"
echo "如果不需要了输入Y以重置ufw。"

# 等待用户输入
read -p "输入 Y 以重置ufw: " choice
if [ "$choice" == "Y" ] || [ "$choice" == "y" ]; then
    # 重置ufw配置
    sudo ufw reset
    # 启用ufw并设置默认策略
    sudo ufw default reject incoming
    sudo ufw default allow outgoing
    sudo ufw enable
    echo "ufw已重置并启用。"
else
    echo "规则保持不变。"
fi

这个写入iptables的脚本里有局域网192.168.3.22,那是我个人的局域网ip,使用的时候更换成自己的。

目前测试过网页,没有问题,迅雷不行,以后我再想办法迅雷怎么防止。

还有就是最好提前设置成下面这样,将gufw传出设置为禁止,只留下DNS或者网关地址因为传出不设置为禁止,第二个脚本就没用了。还有,使用这个脚本最好禁用IPV6,不支持录入IPV6。

截图_gufw.py_20250204142928.png

Reply Favorite View the author
All Replies
dgmenghuan
deepin
2024-04-22 08:22
#1

mac不是硬卡的序列号吗,能够屏蔽吗?难道gufw可以伪装

Reply View the author
乾豫恒益
deepin
2024-04-22 08:40
#2

学习了。。。yeah

Reply View the author
安洛
deepin
2024-04-22 10:22
#3

不建议普通用户轻易尝试将传出设置为拒绝。这不是gufw推荐的做法,可能会导致访问服务异常!

在现代网络环境中,因为cdn和任播等技术的广泛应用,常用网站的ip地址往往会频繁变更,将所有出站ip添加到防火墙工作量会非常大,几乎不现实。楼主提到的用nslookup查询得到的ip地址肯定是不够的。而如果不限制ip仅限制端口,对安全性几乎没有任何提升,因为攻击者往往可以自由变换攻击方的端口。

另外,如果是在本机上设置gufw,在设置出站规则时,设置“从”ip地址是没有必要的。除非是在路由器或者网关上设置防火墙,才需要考虑设置“从”ip。

大多数设备现在都允许随机mac地址。这个保护的安全性比设置一个固定的假mac更好。除非有需要固定mac地址的需求,否则没有必要特地设置固定的假mac地址。

楼主的图片和文字似乎有些不匹配。不考虑检查一下排版吗?

Reply View the author
LinuxhzxWuLiao@outlook.com
deepin
2024-04-24 01:13
#4
安洛

不建议普通用户轻易尝试将传出设置为拒绝。这不是gufw推荐的做法,可能会导致访问服务异常!

在现代网络环境中,因为cdn和任播等技术的广泛应用,常用网站的ip地址往往会频繁变更,将所有出站ip添加到防火墙工作量会非常大,几乎不现实。楼主提到的用nslookup查询得到的ip地址肯定是不够的。而如果不限制ip仅限制端口,对安全性几乎没有任何提升,因为攻击者往往可以自由变换攻击方的端口。

另外,如果是在本机上设置gufw,在设置出站规则时,设置“从”ip地址是没有必要的。除非是在路由器或者网关上设置防火墙,才需要考虑设置“从”ip。

大多数设备现在都允许随机mac地址。这个保护的安全性比设置一个固定的假mac更好。除非有需要固定mac地址的需求,否则没有必要特地设置固定的假mac地址。

楼主的图片和文字似乎有些不匹配。不考虑检查一下排版吗?

之后的余生如果有一刻你没得选,你可以放心的依靠这个和我,有时候天塌了不用你一个人顶。应该是太忙,没时间理排版,这不重要,量产的盾牌拿在你手上会反光,这才是我想看到的。非常理解你的想法,因为你告诉我说你和火鸡不一样,但是我很高兴,因为你的某些,随机数,正在变化。

Reply View the author
LinuxhzxWuLiao@outlook.com
deepin
2024-10-19 22:28
#5
It has been deleted!
LinuxhzxWuLiao@outlook.com
deepin
2025-02-04 14:32
#6
It has been deleted!
LinuxhzxWuLiao@outlook.com
deepin
2025-02-04 14:38
#7
dgmenghuan

mac不是硬卡的序列号吗,能够屏蔽吗?难道gufw可以伪装

不是的,硬件大多都有无法及时发现的漏洞,不像软件那样可以及时修补,所以一旦有人可以利用MAC追踪什么人或者查询登陆记录,那将会给对方机会,修改MAC只是为了不给窥探甚至入侵的机会。

Reply View the author
LinuxhzxWuLiao@outlook.com
deepin
2025-02-05 19:51
#8

补充(2025,2,5)

Reply View the author