哪种 UFW 规则组合会拒绝除安装 Ubuntu 安全更新所需的连接之外的所有出站连接?
答案1
我的回答是针对更普遍的情况,不仅适用于apt-get
。
拒绝除一个 IP 之外的所有传出 IP
sudo ufw default deny outgoing
sudo ufw allow out to 11.22.33.44
要快速恢复,请再次允许所有传出 IP
sudo ufw default allow outgoing
拒绝一个 IP 上除 HTTP 和 HTTPS 之外的所有传出
你可以更加严格:
sudo ufw default deny outgoing
sudo ufw allow out to 11.22.33.44 port http # TCP 80
sudo ufw allow out to 11.22.33.44 port https # TCP 443
以上两个规则仅允许 TCP,但您需要指定协议(tcp 或 udp)。您甚至可以更严格地指定接口为 eth0,例如以避免使用 WiFi...但我认为这没什么用...
检查/清理您的 UFW 规则
如果另一个 IP 仍可访问,则原因可能是一些残留规则。检查当前的 UFW 规则是一种很好的做法:
sudo ufw status numbered
您可能需要删除一些污染规则:
sudo ufw delete 3 # Attention:
sudo ufw delete 2 # 2 and 3 are examples
也允许 DNS
您的软件可能使用域名而不是数字 IP 地址。
由于 UFW 使用数字 IP 地址,因此应编写以下手动示例脚本,以便在 IP 发生变化时轻松再次执行。
检索您的 DNS IP$ resolvectl status | grep -2 'DNS Server'
DNSSEC setting: no
DNSSEC supported: no Current DNS Server: 22.22.22.20
DNS Servers: 22.22.22.20
22.22.22.21
2b01:a00::2
仅允许 DNS(TCP 和 UDP)用于您的 DNS 服务器
$ sudo ufw allow out to 22.22.22.20 port 53
Rule added
$ sudo ufw allow out to 22.22.22.21 port 53
Rule added
仅允许 DNS(TCP 和 UDP)用于您的 DNS 服务器
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 11.22.33.44 443/tcp ALLOW OUT Anywhere (log, out)
[ 3] 22.22.22.20 53 ALLOW OUT Anywhere (out)
[ 4] 22.22.22.21 53 ALLOW OUT Anywhere (out)
答案2
我一般不使用ufw,直接用iptables。
Ubuntu 通常使用 http 协议获取更新。因此,您需要打开出站 HTTP 端口。如果您想将规则限制在特定主机上,则需要找出 Ubuntu 存储库 IP /etc/apt/sources.list
。
更好的解决方案是将 HTTP 流量重定向到 Web 代理并仅允许特定域/URL。这比将名称解析为 IP 以使用防火墙阻止它们更准确。
答案3
用一个简短的例子来扩展 Khaled 的回答:......
Python 程序列出与软件更新相关的 IP 地址:
#!/usr/bin/env python
import re, subprocess
re1 = re.compile("deb http://(.+?)/")
re2 = re.compile("Address:\s*(\d+\.\d+\.\d+\.\d+)")
IPv4 = {}
with open("/etc/apt/sources.list") as f:
for line1 in f:
m1 = re1.match(line1)
if(m1):
url = m1.group(1)
p = subprocess.Popen(["nslookup", url], stdout=subprocess.PIPE)
out,err = p.communicate()
# Parse the output of nslookup:
next_line_is_address = False
for line2 in out.split("\n"):
if(line2.startswith("Name:")):
next_line_is_address = True
elif(next_line_is_address):
m2 = re2.match(line2)
if(m2):
IPv4[m2.group(1)] = True
next_line_is_address = False
print "\n".join(sorted(IPv4.keys()))
# or call "ufw allow..." to allow port 80 outbound to these addresses
示例输出(截至 2014 年 1 月):
user@pc:~$ ./ubuntu_servers.py
194.169.254.10
91.189.91.13
91.189.91.14
91.189.91.15
91.189.92.156
91.189.92.190
91.189.92.200
91.189.92.201
whois 91.189.92.201
表示 91.189.91.0/24 属于 Canonical,因此如果我们正在配置防火墙,那么这可能是一个有用的地址范围。