如何在进程中阻止互联网访问但允许本地主机连接

如何在进程中阻止互联网访问但允许本地主机连接

我有一个在docker中运行2个进程的python程序:

  1. 我自己的服务器在 8080 监听
  2. 一个以 8000 监听的应用程序

我正在尝试阻止第二个进程的互联网访问。我能够使用unshare命令来实现这一点。

但是,我自己的服务器(第一个进程)需要调用第二个进程。该命令似乎也会阻止本地主机连接。

当我从第一个进程调用 127.0.0.1:8000 时,我会得到

HTTPConnectionPool(host='0.0.0.0', port=8000): url: /api/v1/upload 超出最大重试次数(由 NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7ffb48c59b20>: 无法建立新连接引起) : [Errno 111] 连接被拒绝'))"

我尝试过ip link set dev lo up,能够 ping 通 127.0.0.1,但当我尝试调用 127.0.0.1:8000 时仍然遇到相同的错误

答案1

我使用用户组解决了这个问题

  1. 添加一个组“no-external-internet”并将您的用户添加到其中

    sudo addgroup no-external-internet
    sudo adduser $USER no-external-internet
    
  2. 添加 iptables 规则以接受来自 {PORT} 的 {HOST} 传出流量并拒绝所有其他出站连接

    sudo iptables -A OUTPUT -m owner --gid-owner no-external-internet -s {HOST} -p 
    tcp --sport {PORT} -j ACCEPT; 
    sudo iptables  -A OUTPUT -m owner --gid-owner no-external-internet -j REJECT; 
    sudo ip6tables -A OUTPUT -m owner --gid-owner no-external-internet -j REJECT; 
    
  3. 使用用户组运行您的子进程:

    sg no-external-internet "your command to run child process"

相关内容