我对 Ubuntu 和 ufw 完全是新手。我想关闭除修改后的 ssh 端口之外的所有内容。因此我像这样设置 ufw:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp
和 ...
sudo ufw status verbose
得出:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
2222/tcp ALLOW IN Anywhere
2222/tcp (v6) ALLOW IN Anywhere (v6)
令我惊讶的是,我仍然可以使用随机端口号访问 Docker 容器?!我是不是漏掉了什么?据我了解,“传入”流量是指从外部访问 Web 服务器端口?
设置 ufw 后系统也已重新启动。
再检查一下……
nmap -p8888 example.com
给出输出:
Starting Nmap 7.91 ( https://nmap.org ) at 2021-01-05 20:48 CET
Nmap scan report for example.com (XXX.XXX.XXX.XXX)
Host is up (0.10s latency).
PORT STATE SERVICE
8888/tcp filtered hosts2-ns
Nmap done: 1 IP address (1 host up) scanned in 1.20 seconds
感谢您的帮助。
答案1
这是设计使然。
当您从本地机器进行测试时,系统将直接在“接口”上发送网络流量。
例如,这是我的系统,其中 LXD 容器位于名为“InternalDHCP”的子网上:
2: wlp59s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 172.18.1.0/16 brd 172.18.255.255 scope global dynamic noprefixroute wlp59s0
5: InternalDHCP: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 10.73.252.1/24 scope global InternalDHCP
valid_lft forever preferred_lft forever
如果我将任何流量发送到此处的 LXD 子网 10.73.252.1,并且我在 INPUT 链中没有任何 DROP 规则来阻止到该子网的流量,那么路由就会被遵守。这两个接口的路由表如下所示:
default via 172.18.0.1 dev wlp59s0 proto dhcp metric 600
10.73.252.0/24 dev InternalDHCP proto kernel scope link src 10.73.252.1
172.18.0.0/16 dev wlp59s0 proto kernel scope link src 172.18.1.0 metric 600
基本上,用通俗的话来说,这意味着:
- 如果 INPUT 和 OUTPUT 链没有任何丢弃到目标 IP 地址的流量的规则,则遵守路由规则。
- 如果目的地位于 172.18.0.0/16 子网中:直接通过
wlp59s0
设备链路发送 - 如果目的地是 10.73.252.0/24 子网:通过
InternalDHCP
设备链接直接发送 - 对于所有其他流量,通过 172.18.0.1(路由器)将流量路由到目的地。
因此,如果我 ping 10.73.252.25(这是我的系统上运行 Debian 系统映像的容器),那么因为我在 iptables 中的 OUTPUT 和 INPUT 规则集中没有拒绝从该子网传输或接收的规则,所以它会接收 ping 数据包并将其直接丢弃在我计算机上的 InternalDHCP 设备/网桥上,并绕过所有其他行为。
这类似于我 ping 127.0.0.1(localhost),因为它永远不会离开系统,并且在默认ufw
设置下,您将不会被禁止访问本地子网(无论它们实际上是在您的网络/wifi 上还是虚拟的并且仅存在于您的计算机中)并且因此永远不会被阻止。
UFW DENY INCOMING 规则适用于来自来自设备未添加允许规则的直接网络连接之外- 但 Docker 所做的是添加 UFW 规则以允许您的设备与容器通信而不会影响您的流量(透明!),这就是为什么您仍然可以访问您的内部设备(以及为什么当您向其他设备发送 PING 时您会收到回复消息 - RELATED、ESTABLISHED 流量在后台是允许的)。(LXD 也有类似的行为,允许与我电脑上的网桥进行通信)