Docker在啟動時設定自己的規則後如何新增iptables規則?

Docker在啟動時設定自己的規則後如何新增iptables規則?

我想限制與正在運行的 Docker 容器的連線。我有一套iptables規則可以有效地做到這一點。然而,規則集取決於在DOCKER鏈之前應用我自己的規則鏈。

基本上,我想要這個結果

Chain FORWARD (policy DROP)
target     prot opt source               destination
PRE_DOCKER  all  --  0.0.0.0/0            0.0.0.0/0            /* Insert before Docker's filtering to apply our own */
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

Chain PRE_DOCKER (policy DROP)
target     prot opt source               destination
//My own rules go here targeting the DOCKER chain

我在系統啟動時無法設定這些規則。我有一個systemd包含內容的文件

[Unit]
Description=Restore iptables firewall rules
Before=iptables-store.service
Requires=docker.service
After=docker.service
Conflicts=shutdown.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore --noflush /var/lib/iptables/rules-save

[Install]
WantedBy=basic.target

但在啟動時,我收到錯誤

iptables-restore v1.4.21: Couldn't load target `DOCKER':No such file or directory

我認為這意味著 Docker 服務尚未建立其規則。

建立我的單元文件或iptables規則的正確方法是什麼,以便我獲得所需的輸出。

/var/lib/iptables/rules-save為了完整起見,以下是我設定的內容。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:PRE_DOCKER - [0:0]

-I FORWARD -o docker0 -j PRE_DOCKER -m comment --comment "Insert before Docker's filtering to apply our own"
-A PRE_DOCKER ! -i eth0 -o docker0 -j DOCKER -m comment --comment "Anything coming from something other than the public interface send to DOCKER chain"
-A PRE_DOCKER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow connections from established connections"
-A PRE_DOCKER -j DROP -m comment --comment "Drop anything else"

-A INPUT ! -i eth0 -j ACCEPT -m comment --comment "Accept anything coming from something other than the public interface"
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow connections from established connections"
COMMIT

答案1

我實在想不通這個問題。我猜 docker.service 創建 iptables DOCKER 鏈與 systemd 將其視為已完成啟動時存在一些計時問題。

因此,我採用了輪詢方法,檢查該鍊是否存在,然後才嘗試恢復規則。

while ! iptables -n --list DOCKER >/dev/null 2>&1
do
    sleep 1;
done

/sbin/iptables-restore --noflush /var/lib/iptables/rules-save

相關內容