如何正确使用UFW防火墙保护VPS?

如何正确使用UFW防火墙保护VPS?

我在 DO 上设置了一个新的 VPS,现在我正尝试使用 UFW 防火墙保护我的服务器。但是,我有点困惑。

因此,我的目标是仅允许 SSH、HTTP/HTTPS 相关端口。其余端口应关闭。我为此做了以下事情:

# ufw allow ssh
# ufw allow http
# ufw allow https

# ufw enable

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

如您所见,这里一切都很好:除 22、80、443 端口外,所有传入流量均被拒绝,正如预期的那样。

顺便说一句,我将 Docker 用于我的 PHP Laravel 应用程序。要启动容器,我使用以下命令:“docker-compose up -d”。

$ docker-compose ps
  Name                Command              State                 Ports
------------------------------------------------------------------------------------
app        docker-php-entrypoint php-fpm   Up      9000/tcp
database   docker-entrypoint.sh mysqld     Up      0.0.0.0:3307->3306/tcp, 33060/tcp
web        nginx -g daemon off;            Up      0.0.0.0:81->80/tcp

主机上有几个可用的端口:3307、81。

为了确保防火墙正常工作,我使用 nmap:

$ nmap -Pn [server ip]
Starting Nmap 7.70 ( https://nmap.org ) at 2018-09-13 12:17 EEST
Nmap scan report for [server host] ([server ip])
Host is up (0.054s latency).
Not shown: 995 filtered ports
PORT    STATE  SERVICE
22/tcp  open   ssh
25/tcp  closed smtp
80/tcp  open   http
81/tcp  open   hosts2-ns
443/tcp closed https

Nmap done: 1 IP address (1 host up) scanned in 5.59 seconds

这里我不能理解两件事:

25/tcp  closed smtp

这为何在这里?

81/tcp  open   hosts2-ns

为什么开放这个端口?

可能需要进入 Web 容器并在 nginx 服务器部分明确指定 127.0.0.1 IP 地址。据我所知,mysql 默认只对 localhost(my.conf)开放,因此我们在下面的列表中看不到 mysql 端口。但无论如何,为什么 UFW 不阻止 docker 暴露的端口?

提前感谢所有能向我解释这是怎么回事的人。

答案1

大概 ufw 仅显示 ufw 配置,并且不会显示任何直接插入防火墙配置(使用iptables或其他工具,如 docker)而未经过 ufw 的规则。

25/tcp  closed smtp

这为何在这里?

常见的原因是许多(消费者) ISP 和组织阻止传出 SMTP 流量。

81/tcp  open   hosts2-ns

为什么开放这个端口?

nmap 不仅端口 81 是开放的,而且在端口 1024 处停止了扫描,但我预计当您进一步检查时端口 3307 也是开放的。

它是由 docker 打开的,因为您的 docker 被指示发布端口 81 和 3307 并将它们映射到您的 docker 实例......

$ docker-compose ps
  Name                Command              State                 Ports
------------------------------------------------------------------------------------
app        docker-php-entrypoint php-fpm   Up      9000/tcp
database   docker-entrypoint.sh mysqld     Up      0.0.0.0:3307->3306/tcp, 33060/tcp
web        nginx -g daemon off;            Up      0.0.0.0:81->80/tcp

检查实际的活动防火墙配置iptables-save 例如,没有用户友好的 ufw 界面iptables -L -v -n -t nat(大多数有趣的 docker 内容发生在 NAT 和路由部分),也许iptables -L -v -n

相关条目如下:

# Generated by iptables-save v1.6.0 on Thu Sep 13 13:50:12 2018
*nat
:PREROUTING ACCEPT [21796:1434198]
:INPUT ACCEPT [9101:666864]
:OUTPUT ACCEPT [20943:1960461]
:POSTROUTING ACCEPT [118496:7063513]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 3307 -j DNAT --to-destination 172.17.0.3:33060
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 81   -j DNAT --to-destination 172.17.0.8:80

如果您不想将端口 81 和 3307 发布到整个互联网,您可能需要做的是更改在 docker 中发布它们的方式。 https://docs.docker.com/config/containers/container-networking/

相关内容