2016-02-29 73 views
3

我有一個主機有一個接口eth0,IP 10.0.10.10/24。我啓動docker,添加一個容器,沒有網絡。然後我在eth0上創建一個macvlan設備,給它IP 10.0.10.20/24,並將其放入容器中。iptables不能在容器中的macvlan流量上工作

主機和容器現在都有完整的網絡訪問權限。

然後,我在主機上創建一個iptables規則,以刪除所有來自容器IP 10.0.10.20的流量。規則不起作用,並且流量通過。

當然,如果我從容器內(ip netns exec $PID iptables ...或通過給容器NET_ADMIN的能力)做到這一點,它就可以工作。

底層主機的iptables規則是否應該過濾流量?

+0

你找到了這個解決方案嗎? – relet

+0

不直接。我會在這裏寫一個答案。 – deitch

回答

2

答案是:你不能這樣做。當使用網橋時,流量會流入主機並流出,因此它會衝擊主機的IP堆棧。當你使用macvlan時,唯一的ip棧是容器中的ip棧,所以主機上的iptables規則永遠不會被調用。

要做到這一點的唯一方法是更改​​容器中的裏的iptables規則

如果您不想提供容器訪問權限,例如如果你想控制容器,那麼從主機本身使用ip netns exec ...,它將控制容器中的iptables規則而不給容器本身控制。

我寫了一個腳本來做到這一點。它可在https://github.com/deitch/ctables和許可MIT。

+0

謝謝。這也是我得出的結論 - 我遇到的問題是我不想使用網橋(它們會影響網絡測量結果,而不是macvlan),但對容器內使用的流量進行帳戶/設置配額*和*給出容器NET_ADMIN權限。所以我唯一的選擇是定期檢查容器內的iptables規則是否仍然正常工作。 – relet

+0

@relet爲什麼給容器NET_ADMIN?爲什麼不使用上面概述的'ctables'解決方案,在哪裏從主機控制它? – deitch

+0

而且,是的,橋樑性能的影響。對於大多數部署來說並不重要,但對於一些部署來說,這是非常重要的。我首先與一家金融機構流通價格做了macvlan。每微秒都很重要。我在吞吐量和延遲方面做了詳細的分析,比較了碼頭橋,裸機,SR-IOV,macvlan以及其他一些其他設備。今年,我提議將它作爲dockercon和containercon的一次演講,我們將看到他們的看法。我也想用Calico重做。 – deitch