Kann die Verbindung zur Datenbank im Docker-Container an einer bestimmten Schnittstelle unter Ubuntu 16 eingeschränkt werden?

826
Roman Cherepanov

Ich habe eine MySQL-Datenbank auf einem Server (ich verwende Percona im Docker- Container) mit mehreren Netzwerkschnittstellen.

Mein System ist Ubuntu 16.04.2 LTS .

ifconfig  eth0 Link encap:... inet addr:95.*.*.*  eth1 Link encap:... inet addr:10.*.*.* 

Ist es möglich, den Zugriff ufwauf eine Datenbank auf der eth0Schnittstelle einzuschränken, aber eine zulassen eth1?

Also wird es möglich sein, mit DB zuzugreifen 10.*.*.*:6603und nicht mit 95.*.*.*:6603.

Update (04.03.2017):

Ich habe diesen Befehl verwendet, um eine Regel hinzuzufügen:

sudo ufw deny in on eth0 to any port 6603 from any proto tcp 

Status:

$ sudo ufw status Status: active  To Action From -- ------ ---- 6603/tcp on eth0 DENY Anywhere 6603/tcp (v6) on eth0 DENY Anywhere (v6) 

Trotz der Ablehnung der Regel kann ich meine Datenbank mit dem MySQLClient eingeben .

Aber der 6603Hafen ist noch offen:

nmap -p 6603 95.85.54.75  Starting Nmap 7.01 ( https://nmap.org ) at 2017-03-04 16:14 UTC Nmap scan report for 95.85.54.75 Host is up (0.0012s latency). PORT STATE SERVICE 6603/tcp open unknown  Nmap done: 1 IP address (1 host up) scanned in 0.65 seconds 
2
Funktioniert [this] (http://serverfault.com/questions/270715/ubuntu-ufw-set-a-rule-on-per-interface-basis) für Sie? Kevin vor 7 Jahren 3
@Kevin, ich würde dies als Antwort posten und die relevanten Informationen zitieren und auch die Informationen bearbeiten, damit sie zu seinem Szenario passen asmith vor 7 Jahren 1
@Kevin Ich habe deinen Rat ausprobiert, aber der Port ist noch geöffnet. Können Sie mir helfen, Fehler in meiner Regel zu finden, oder mir Ratschläge geben, um mein Problem zu lösen (siehe Fragen-Updates für Details)? Roman Cherepanov vor 7 Jahren 0

2 Antworten auf die Frage

1
jcbermu

Anstatt zu verwenden ufw, können Sie MySQL an eine einzige Schnittstelle binden.

Die mysqld-Konfigurationsdatei (normalerweise at /etc/mysql/my.cnf) verfügt über eine Option bind-address, mit der Sie eine einzelne IP-Adresse festlegen können (z. B. 10.0.4.25), um zu erzwingen, dass MySQL nur diese Schnittstelle überwacht.

Es ist jedoch keine kugelsichere Lösung, da es in Hosts, die das schwache Hostmodell verwenden (wie einige Linux-Distributionen), möglich ist, eine Verbindung zu Diensten herzustellen, die an eine Schnittstelle von einer anderen gebunden sind.

Das ist nicht unbedingt besser. Linux betrachtet IPv4-Adressen als Hosts und nicht für Schnittstellen, sodass die Bindung an eine Adresse _do not_ nicht automatisch an die Schnittstelle gebunden wird. (Letzteres ist möglich, benötigt jedoch ein separates sockopt.) Wenn sich also jemand auf derselben Verbindung befindet, z. B. ein anderer 146.xxx-Server, kann er sich sogar leicht mit Diensten verbinden, die an die Adresse einer anderen Schnittstelle gebunden sind. Eine Firewall-Regel wird in der Zwischenzeit immer funktionieren. grawity vor 7 Jahren 1
@ grawity Es ist sehr schwer, dir zu glauben. jcbermu vor 7 Jahren 0
Wäre nicht die erste Person, die das gesagt hat, und trotzdem habe ich dieses Missverständnis in der Vergangenheit erfolgreich * hust * verwendet ... Schauen Sie sich das "starke Hostmodell" (bevorzugt für IPv6) vs. "schwaches Hostmodell" an ( für IPv4) weitere Informationen. (Standardmäßig beantwortet Linux sogar ARP-Abfragen über die 'falsche' Schnittstelle; dies kann mit arp_filter / arp_ignore eingestellt werden, aber selbst dann erlaubt eine manuell hinzugefügte Route oder ein ARP-Eintrag immer noch Verbindungen.) grawity vor 7 Jahren 1
@grawity Du hast recht. Ich wusste es nicht. Es stimmt wirklich, dass * Sie jeden Tag etwas Neues lernen *. Ich habe meine Antwort dahingehend modifiziert. jcbermu vor 7 Jahren 0
1
Roman Cherepanov

Das Problem war, dass Docker sich an die Firewall-Regeln hält.

Entsprechend diesen Beiträgen ( Die Gefahren von UFW + Docker, So legen Sie Docker 1.12+ so fest, dass es NICHT mit IPTABLES / FirewallD interferiert ):

  • Ich habe eine Datei /etc/docker/daemon.jsonmit Inhalt erstellt:

    { "iptables": false } 
  • Ich habe ufw eine Regel hinzugefügt:

    sudo ufw allow in on eth1 to any port 6603 

    nur Verbindungen von ufw zulassen.

  • Starten Sie den Docker-Daemon neu

    sudo service docker stop sudo service docker start 

Hinweis: Dieser Fix funktioniert nur für Container, die mit erstellt wurden docker run.... Für Container, die mit Docker Swarm erstellt wurden, funktioniert dieses Update nicht.