本文是
网安小白的端口关闭实践
的续篇。
海量报文,一手掌握,你值得拥有,让我们开始吧~
ufw 与 iptables的关系
理论介绍:
ufw(Uncomplicated Firewall)是一个基于iptables的前端工具,用于简化iptables的配置和管理。它提供了一组简单的命令和规则集,使用户能够更容易地配置和管理防火墙。
iptables是一个内核层的防火墙工具,用于过滤、重定向和修改网络数据包。它提供了非常强大的功能和灵活性,但其命令语法和配置较为复杂。
ufw实质上是对iptables进行了封装,提供了更简单易用的命令和配置接口。用户使用ufw命令时,ufw会自动转化为对iptables的操作命令,并在后台进行配置。因此,ufw在底层还是依赖iptables来实现防火墙规则的生效。
总而言之,ufw是一个基于iptables的简化工具,使用户更方便地配置和管理防火墙。
实践
- 查看ufw的配置文件
cat /etc/ufw/before.rules
cat /etc/ufw/user.rules
可看到如下文件:
river@star:/etc/ufw$ ls
after6.rules before6.rules ufw.conf
after6.rules.20241202_150252 before6.rules.20241202_150252 user6.rules
after.init before.init user6.rules.20241202_150252
after.rules before.rules user.rules
after.rules.20241202_150252 before.rules.20241202_150252 user.rules.20241202_150252
applications.d sysctl.conf
before.rules VS after.rules VS ufw.rules
在Ubuntu系统中,/etc/ufw/
目录下的不同文件有以下含义:
-
before.rules
:这是ufw防火墙服务在加载之前将要应用的规则文件。它包含了一些系统预定义的规则,可以在这里添加自定义的iptables规则,这些规则将在ufw规则之前被应用。 -
after.rules
:这是ufw防火墙服务在加载之后将要应用的规则文件。它也包含了一些系统预定义的规则,可以在这里添加自定义的iptables规则,这些规则将在ufw规则之后被应用。 -
user.rules
:这是ufw命令行工具自动生成的规则文件。当你使用ufw命令添加或修改防火墙规则时,这些规则会被写入到/etc/ufw/user.rules
文件中。这个文件包含了用户自定义的ufw规则,它会在ufw防火墙启动时被读取和加载到iptables规则链中。
需要注意的是,当你使用ufw命令修改防火墙规则时,实际上是修改了/etc/ufw/user.rules
文件,然后使用sudo ufw reload
命令来重新加载规则,使其生效。而before.rules
和after.rules
文件则通常用于添加更底层的iptables规则,以满足特定的需求或配置。
- 执行
sudo ufw deny from any to 127.0.0.1
后,/etc/ufw/user.rules
出现下述规则
### tuple ### deny any any 127.0.0.1 any 0.0.0.0/0 in
-A ufw-user-input -d 127.0.0.1 -j DROP
暂未找到下述规则的对应行:
sudo ufw default deny imcoming
规则制定范例
- /etc/ufw/before.rules
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
## Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT# quickly process packets for which we already have a connection
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT# drop INVALID packets (logs these in loglevel medium and higher)
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT# allow dhcp client to work
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT#
# ufw-not-local
#
-A ufw-before-input -j ufw-not-local# if LOCAL, RETURN
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN# if MULTICAST, RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN# if BROADCAST, RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN# all other non-local packets are dropped
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP# allow MULTICAST mDNS for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT# allow MULTICAST UPnP for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
端口关闭实践
规则说明
- 启用ufw后,修改/etc/iptales/rulesv4无效,执行iptables的命令也无效, 比如下面这个
sudo iptables -A OUTPUT -p tcp --dport 5556 -j DROP
- 要想执行iptables,必须关闭ufw
- 但理论上讲,所有iptables能执行的ufw也能执行
方法1:用ufw关闭,不用自己定义基础规则
上面的命令对应的ufw命令如下:
sudo ufw deny from 127.0.0.1 to any port 5556
- 注意,这代表,阻止从本机到任何机器的5556端口
以下才是阻止本机的5556到任何机器的报文
sudo ufw deny from 127.0.0.1 port 5556 to any
方法2:用iptables关闭
- 修改/etc/iptables/rules.v4如下
# Generated by iptables-save v1.8.10 (nf_tables) on Mon Dec 2 23:18:41 2024
*filter
:INPUT ACCEPT [67:23836]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [66:29316]
-A INPUT -p tcp -m tcp --dport 5556 -j DROP
-A OUTPUT -p tcp -m tcp --dport 5556 -j DROP
COMMIT
# Completed on Mon Dec 2 23:18:41 2024
仅允许特定端口流出实践
- 问题:ufw 如何禁止本机从80,443以外的端口 流出的流量?
sudo ufw default deny outgoing
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp
sudo ufw allow out 443/udp
sudo ufw allow out 546/udp
sudo ufw allow out 995/tcp
sudo ufw allow out 853/tcp #dns over tls
sudo ufw allow out 853/udp #dns over quic
sudo ufw default deny incoming # 顺便阻止传入,因为本机不是服务器
sudo ufw default deny forward # 顺便阻止转发
真实有效,原来ufw也能让浏览器不能接受报文!!
- 关闭时的防火墙状态;
- 作用效果:
警告
sudo ufw default deny outgoing
可能会导致部分软件无法工作,当然如果不使用某些奇奇怪怪的软件,以上配置大概是足够纯净和安全的!
安全解决方案II
- 当确保所有软件都是安全时,仅仅这样也是足够的
sudo ufw default deny incoming # 顺便阻止传入,因为本机不是服务器
sudo ufw default deny forward # 顺便阻止转发
sudo apt install firewall-config
# 接着在firewall中允许仅仅若干服务
Last Extension: DoH VS DoT
DOH(DNS over HTTPS)和DOT(DNS over TLS)是两种将DNS查询加密的传输协议。
DOH使用HTTPS将DNS查询和响应封装在HTTP请求和响应中,通过常用的端口443进行传输。这意味着DNS查询被加密在TLS隧道中,并且可以与现有的HTTPS流量混合在一起,难以被网络监控或阻止。DOH可以通过使用基于浏览器的解析器或专用的DOH代理来实现。
DOT直接将DNS查询和响应封装在TLS流中,通过指定的端口(默认为853)进行传输。与DOH不同,DOT在应用层提供密钥交换和加密,而不是在HTTP层。它需要专用的DOT代理来将DNS请求发送到加密的DNS服务器进行解析。
总的来说,DOH将DNS查询封装在HTTPS中,可以通过通用的HTTPS端口传输,并且易于与现有的HTTPS流量混合。而DOT直接在TLS流中进行加密,需要专用的DOT代理来处理DNS查询和响应。两者都提供了DNS查询的加密传输,以增强隐私和安全性。