UFW-除了 apt-get 更新之外拒绝出站?

UFW-除了 apt-get 更新之外拒绝出站?

哪种 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,因此如果我们正在配置防火墙,那么这可能是一个有用的地址范围。

相关内容