
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
이 포트는 왜 열려 있나요?
아마도 웹 컨테이너에 들어가서 nginx 서버 섹션에 명시적으로 127.0.0.1 IP 주소를 지정해야 할 것입니다. 내가 아는 한, mysql은 기본적으로 localhost(my.conf)에 대해서만 열려 있으므로 아래 목록에는 mysql 포트가 표시되지 않습니다. 그런데 왜 UFW는 도커 노출 포트를 차단하지 않습니까?
그것이 무엇인지 나에게 설명해 줄 수 있는 모든 분들께 미리 감사드립니다.
답변1
아마 ufw
ufw 구성만 표시하며 iptables
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-save
( iptables -L -v -n -t nat
흥미로운 도커 관련 작업은 대부분 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/