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 連接埠外,所有傳入流量均被拒絕。

順便說一下,我的 PHP Laravel 應用程式使用 Docker。要啟動容器,我使用指令:「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 配置,不顯示直接插入防火牆配置(使用iptablesdocker 或其他工具,如 docker)的任何規則,而不顯示 ufw。

25/tcp  closed smtp

為什麼會在這裡?

一個常見的原因是許多(消費者)ISP 和組織阻止傳出 SMTP 流量。

81/tcp  open   hosts2-ns

為什麼要開放這個連接埠?

不僅連接埠 81 打開,nmap 還停止在連接埠 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

檢查實際活動防火牆配置沒有用戶友好的 ufw 介面,例如iptables-saveiptables -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/

相關內容