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

ここで私は2つのことを理解できません:

25/tcp  closed smtp

なぜこれがここにあるのか?

81/tcp  open   hosts2-ns

このポートはなぜ開いているのでしょうか?

おそらく、Web コンテナーに入り、nginx サーバー セクションで 127.0.0.1 IP アドレスを明示的に指定する必要があります。私の知る限り、mysql はデフォルトでローカルホスト (my.conf) に対してのみ開かれているため、結果として以下のリストに mysql ポートが表示されません。しかし、いずれにしても、UFW が docker 公開ポートをブロックしないのはなぜでしょうか?

それが何なのかを私に説明して頂ける皆様には、事前に感謝致します。

答え1

おそらく ufwiptablesufw 構成のみが表示され、 ufw を経由せずに ファイアウォール構成に直接挿入されたルール (または docker などの別のツールを使用) は表示されません。

25/tcp  closed smtp

なぜこれがここにあるのか?

よくある理由としては、多くの(消費者向け)ISP や組織が送信 SMTP トラフィックをブロックしていることが挙げられます。

81/tcp  open   hosts2-ns

このポートはなぜ開いているのでしょうか?

ポート 81 が開いているだけでなく、nmap はポート 1024 でスキャンを停止しましたが、さらに確認するとポート 3307 も開いていることが予想されます。

これは、Docker がポート 81 と 3307 を公開し、それらを Docker インスタンスにマップするように指示されているため、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 でポートを公開する方法を変更する必要があるでしょう。 コンテナネットワーク

関連情報