Iptables

使用 iptables 限制與 docker 容器的外部連接的步驟?

  • March 9, 2022

我的目標是將對 docker 容器的訪問限制為僅幾個公共 IP 地址。是否有一個簡單、可重複的過程來實現我的目標?在使用 Docker 的預設選項時僅了解 iptables 的基礎知識,我發現它非常困難。

我想執行一個容器,使其對公共 Internet 可見,但只允許來自選定主機的連接。我希望設置一個預設的 REJECT 輸入策略,然後只允許來自我的主機的連接。但是 Docker 的 NAT 規則和鏈妨礙了我的 INPUT 規則。

鑑於以下假設,有人可以提供一個如何實現我的目標的例子嗎?

  • 在 eth0 上託管公共 IP 80.80.80.80
  • 在 eth1 上託管私有 IP 192.168.1.10
  • docker run -d -p 3306:3306 mysql
  • 阻止與主機/容器 3306 的所有連接,但主機 4.4.4.4 和 8.8.8.8 除外

我很高興將容器僅綁定到本地 IP 地址,但需要有關如何正確設置 iptables 轉發規則的說明,這些規則在 docker 程序和主機重新啟動後仍然存在。

謝謝!

使用 docker 的防火牆規則時要記住兩件事:

  1. 為避免您的規則被 docker 破壞,請使用DOCKER-USER
  2. Docker 在PREROUTING錶鍊中進行埠映射nat。這發生在filter規則之前,因此--dest--dport看到容器的內部 IP 和埠。要訪問原始目的地,您可以使用-m conntrack --ctorigdstport.

例如:

iptables -A DOCKER-USER -i eth0 -s 8.8.8.8 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPT
iptables -A DOCKER-USER -i eth0 -s 4.4.4.4 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPT
iptables -A DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j DROP

注意:如果沒有--ctdir ORIGINAL,這也將匹配從容器連接到其他伺服器上的埠 3306 的回複數據包,這幾乎肯定不是您想要的!如果像我一樣,您的第一條規則是 ,則您並不嚴格需要它-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT,因為它將處理所有回複數據包,但--ctdir ORIGINAL無論如何仍然使用它會更安全。

引用自:https://serverfault.com/questions/704643