Dockerで2つのプロセスを実行するPythonプログラムがあります。
- 私のサーバーは8080を受信します。
- 8000を受信するアプリケーション
2番目のプロセスへのインターネットアクセスをブロックしようとしています。unshare
コマンドを使用してこれを達成できます。
ただし、私のサーバー(最初のプロセス)は2番目のプロセスを呼び出す必要があります。このコマンドはまた、localhost接続をブロックするようです。
最初のプロセスで127.0.0.1:8000を呼び出すと
HTTPConnectionPool(host='0.0.0.0', port=8000): url: /api/v1/upload 最大再試行回数を超えました(NewConnectionError接続): [Errno 111] 接続が拒否されました。 '))"
試してみてip link set dev lo up
127.0.0.1にpingを送信できましたが、127.0.0.1:8000に電話しようとすると、同じエラーが発生します。
答え1
usergroupを使用してこの問題を解決しました。
「no-external-internet」グループを追加し、ここにユーザーを追加します。
sudo addgroup no-external-internet sudo adduser $USER no-external-internet
{PORT}から{HOST}へのトラフィックを許可し、他のすべてのアウトバウンド接続を拒否するiptablesルールを追加します。
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;
ユーザーグループを使用して子プロセスを実行します。
sg no-external-internet "your command to run child process"