Networking
使用 iptables 規則不適用於 Docker 容器
只需設置一個 ElasticSearch 容器即可與公司的 Laravel 應用程序一起使用。創建 docker-compose.yml 並執行它是完美而直接的,但是當我想為這個東西設置防火牆以便它只能從提到的 Laravel 應用程序的一個特定 IP 訪問時,就會出現問題。
在研究過程中,我注意到很多人都遇到了這些問題,即 Docker 轉發的埠流量完全暴露給公眾,並且他們無法正確設置防火牆。
我在過去 6 小時內找到了幾個解決方案,但沒有一個有效。我認為這與 Docker 處理/轉發入站流量的方式有關,而且我的 iptables 知識並不豐富,因此我可以自己理解正在發生的事情。
這是我的 docker-compose.yml (物有所值):
version: '3.4' services: elasticsearch: image: khezen/elasticsearch:6.1.1 container_name: elasticsearch environment: NETWORK_HOST: 0.0.0.0 HOSTS: 127.0.0.1 CLUSTER_NAME: fd-es NODE_NAME: node-1 HEAP_SIZE: 31g HTTP_SSL: "true" ELASTIC_PWD: "somepasswd" HTTP_CORS_ENABLE: "true" HTTP_CORS_ALLOW_ORIGIN: /https?:\/\/localhost(:[0-9]+)?/ ulimits: memlock: soft: -1 hard: -1 volumes: - ./config/elasticsearch.yml:/elasticsearch/config/elasticsearch.yml - ./data:/elasticsearch/data - ./logs:/elasticsearch/logs ports: - 9200:9200 networks: - es-network restart: always networks: es-network: driver: bridge
這些是我目前使用的 iptables 規則,這在某種程度上是我想要的,但仍然允許從任何客戶端到埠 9200 的所有流量通過,而不是只能從我的應用程序訪問:
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [779:162776] :DOCKER - [0:0] -A DOCKER -s xxx.xxx.xxx.xxx -p tcp -m tcp --dport 9200 -j ACCEPT -A DOCKER -o docker0 -p tcp -m tcp --dport 9200 -j ACCEPT -A DOCKER -p tcp --dport 9200 -j DROP -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -m conntrack --ctstate INVALID -j DROP -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT -A INPUT -p udp -m conntrack --ctstate NEW -j ACCEPT -A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT -A INPUT -p tcp -m tcp --dport 44344 -j ACCEPT -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable -A INPUT -j DROP
我嘗試禁用 Docker 的 iptables 支持並禁用橋接網路並調整 iptables 規則幾十次,但無濟於事。
我很感激任何建議和幫助來實現這一點,因為我沒有這個問題的想法和搜尋結果。
提前致謝!
對於每個尋求解決這個問題的人來說,答案是這樣的:
*filter :INPUT ACCEPT [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :FILTERS - [0:0] :DOCKER-USER - [0:0] -F INPUT -F DOCKER-USER -F FILTERS -A INPUT -i lo -j ACCEPT -A INPUT -p icmp --icmp-type any -j ACCEPT -A INPUT -j FILTERS -A DOCKER-USER -i ens33 -j FILTERS -A FILTERS -m state --state ESTABLISHED,RELATED -j ACCEPT -A FILTERS -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A FILTERS -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A FILTERS -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A FILTERS -j REJECT --reject-with icmp-host-prohibited COMMIT
在這裡找到它:https ://unrouted.io/2017/08/15/docker-firewall/
完美執行。