只需设置一个 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 规则几十次,但无济于事。
我很感激任何建议和帮助来实现这一点,因为我没有这个问题的想法和搜索结果。
提前致谢!