将Docker端口仅暴露给内部网络

sdnqo3pr  于 2023-08-03  发布在  Docker
关注(0)|答案(3)|浏览(120)

现在在一个新的homelab服务器上运行许多dockers,并试图确保一切都被锁定和安全。我使用服务器做各种事情,既需要从外部世界(nextcloud)访问,也需要从内部网络(plex)访问。当然,服务器位于限制开放端口的路由器后面,但正在寻找额外的安全性-我想限制那些我只想通过内部网络访问的dockers,以192.168.0.0/24。这样,如果我的路由器上的端口以某种方式打开,它不会被暴露(我是偏执狂吗?).
目前docker-compose文件通过以下方式暴露端口:

....

 ports:
   - 8989:8989
....

字符串
这当然工作正常,但如果我打开路由器上的端口,世界就可以访问它。我知道我可以绑定到localhost通过

....
 ports:
   - 127.0.0.1:8989:8989
....


但当我试图从内部网络访问Docker时,这并没有帮助我。我读过很多关于docker网络和各种标志的文章,也读过关于iptables解决方案的可能性。
任何指导都是非常感激的。
谢谢你,

pgccezyw

pgccezyw1#

不要在docker-compose中声明任何端口,它们在容器之间自动可见。
我以这种方式使用了一个elasticsearch容器,一个单独的kibana可以通过yml上声明的服务器名称连接到它。
如果我的路由器上某个端口打开了,它不会暴露
使用此过程,端口在Docker环境之外永远不可见(即外部==在您的本地网络中)。
如果您担心的是端口在执行我告诉您的过程时在您的LAN中发布,那么它们不是。

kkbh8khc

kkbh8khc2#

你其实和

ports:
   - 127.0.0.1:8989:8989

字符串
与此同时,它可以在您的服务器上本地访问,足够有趣,您的绑定到localhost技巧正是我正在寻找自己的设置XD
从这一点上,实际上有几种方法来设置它,以便您可以在本地网络上访问它。

SSH隧道

第一个是我在自己的设置中使用的:ssh转发
你可以,如果你还没有,设置一个.ssh/config文件来转发localhost端口到你的计算机.考虑到您的示例,语法如下

Host some-hostname
   HostName 192.168.x.x
   User user-of-server
   LocalForward 8989 127.0.0.1:8989


some-hostname是您可以选择的短名称,user-of-server是您设置的实际登录用户,192.168.x.x是您服务器的实际本地IP地址,您还可以包括IdentityFile /path/to/ssh/key。这样你就可以在本地网络上的任何一台计算机上运行ssh some-hostname来ssh到你的服务器上,你的服务器将在该特定计算机上的localhost:8989上可用。

反向代理

第二个是反向代理,如nginx,这也可以在docker容器中运行,您可以将其绑定到任何端口,例如6443,您可以将其配置文件挂载到容器中

volumes:
 - 'config:/etc/nginx/conf.d'
ports:
 - 6443:443
volumes:
    config:
        driver: local
        driver_opts:
            type: none;
            o: bind
            device: "./config"


在./config/defaul.conf中,你可以设置一些类似的东西

server { 
   listen 443 ssl http2;
   server_name 192.168.x.x;
   ssl_certificate /etc/letsencrypt/signed_chain.crt;
   ssl_certificate_key /etc/letencrypt/domain.key
   include /etc/nginx/includes/ssl.conf
   location /{
         ### force timeouts if one of backend is died ##
         ### such died, many backend, very timeouts ##
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

         ### Set headers ####
         proxy_set_header        Accept-Encoding    "";
         proxy_set_header        Host               $host;
         proxy_set_header        X-Real-IP          $remote_addr;
         proxy_set_header        X-Forwarded-For    $proxy_add_x_forwarded_for;
         proxy_set_header        X-Forwarded-Host   $host:server_port;
         proxy_set_header        X-Forwarded-Server $host;

         proxy_set_header        X-Forwarded-Proto  $scheme;
         add_header              Front-End-Https    on;

         proxy_buffering off;

         proxy_pass http://127.0.0.1:8989
   }


则它应该仅在192.168.x.x:6443上可用

vc6uscn9

vc6uscn93#

这就是我的工作:

docker-compose.yaml:
    ports:
      - "192.168.0.2:8089:8089"

字符串
在netstat中,我可以看到它在192.168.0.2上打开,所以我的局域网可以连接到它。

相关问题