いくつかのネットワークインターフェイスを備えたサーバー(Dockerコンテナで Percona を使用)にMySQLデータベースがあります。
私のシステムはUbuntu 16.04.2 LTSです。
ifconfig
eth0 Link encap:...
inet addr:95.*.*.*
eth1 Link encap:...
inet addr:10.*.*.*
ufw
を使用したアクセスをeth0
インターフェイス上のデータベースに制限し、eth1
を許可することは可能ですか?
したがって、10.*.*.*:6603
でDBにアクセスできますが、95.*.*.*:6603
でアクセスすることはできません。
更新(2017年4月3日):
そのコマンドを使用してルールを追加しました。
Sudo ufw deny in on eth0 to any port 6603 from any proto tcp
状態:
$ Sudo ufw status
Status: active
To Action From
-- ------ ----
6603/tcp on eth0 DENY Anywhere
6603/tcp (v6) on eth0 DENY Anywhere (v6)
しかし、拒否ルールにもかかわらず、MySQL
クライアントを使用してDBに入力できます。
しかし、6603
ポートはまだ開いています:
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
問題は、Dockerがファイアウォールルールを改ざんすることでした。
これらの投稿によると(FW + Dockerの危険性、Docker1.12 +を干渉しないように設定する方法IPTABLES/FirewallDを使用):
次の内容のファイル/etc/docker/daemon.json
を作成しました。
{
"iptables": false
}
Ufwにルールを追加しました:
Sudo ufw allow in on eth1 to any port 6603
ufwからの接続のみを許可します。
dockerデーモンを再起動します
Sudo service docker stop
Sudo service docker start
注:この修正は、docker run...
で作成されたコンテナーに対してのみ機能します。 Docker Swarmで作成されたコンテナーの場合、この修正は機能しません。
ufw
を使用する代わりに、MySQLを単一のインターフェースにバインドできます。
Mysqld構成ファイル(通常は/etc/mysql/my.cnf
にあります)にはbind-address
というオプションがあり、単一のIPアドレス(たとえば10.0.4.25など)を設定して、MySQLがそのインターフェイスでのみリッスンするように強制できます。
ただし、弱いホストモデルを使用するホストでは(一部のLinuxディストリビューションのように)、防弾ソリューションではありません。あるインターフェースにバインドされたサービスに別のインターフェースから接続することが可能です。