単一のプロセスに対して(発信)ネットワークアクセスをブロックできますか?
答え1
Linux 2.6.24+(2.6.29より前は実験的なものと見なされていました)では、これにはネットワークネームスペースを使用できます。CONFIG_NET_NS=y
kernel() と util-linux で「Network Namespace」を有効にして、次のものを使用する必要があります。unshare
ツール。
その後、ネットワークアクセスなしでプロセスを開始するのは簡単です。
unshare -n program ...
これにより、プロセスの空のネットワーク名前空間が作成されます。つまり、次のようなネットワークインターフェイスなしで実行されます。ループバックなし。次の例では、現在の有効なユーザーとグループIDがスーパーユーザーIDにマップされている場合にのみ、プログラムを実行するために-rを追加します(sudoを除く)。
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
アプリケーションにネットワークインターフェイスが必要な場合は、新しいネットワークインターフェイスを設定できます。
$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms
これにより、新しい地元のループバック。つまり、生成されたプロセスはホストの開いているポートにアクセスできません127.0.0.1
。
ネームスペース内の元のネットワークにアクセスする必要がある場合は、次のものを使用できます。nsenter
別の名前空間を入力してください。
次の例は、ping
PID 1で使用されるネットワーク名前空間を使用して実行されます(指定-t 1
)。
$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms
--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms
答え2
Linuxには次の機能があります。ネットワークネームスペース既定では、同じコンピュータに複数のネットワークスタックを持ち、プログラムを実行するときにプログラムに割り当てることができます。これは通常コンテナで使用される機能ですが、目的のタスクを実行するためにも使用できます。
これip netns
サブコマンドはそれを管理します。何もアクセスできない新しいネットワーク名前空間を作成するのは簡単です。これは新しい名前空間のデフォルト状態です。
root@host:~# ip netns add jail
これで、その名前空間に切り替えると、かなり簡単に構成できます。 loに言及したいかもしれないので、ここにあります。
root@host:~# ip netns exec jail /bin/bash
root@host:~# ip addr add 127.0.0.1/8 dev lo
root@host:~# ip link set dev lo up
root@host:~# exit
ネットワークなしでコマンドを実行するには、刑務所で実行してください。
root@host:~# ip netns exec jail su user -c 'ping 8.8.8.8'
connect: Network is unreachable
要求時にネットワークにアクセスできません。 (別のネットワークスタックにiptables
ルールなどが含まれているので、あらゆる種類の興味深い作業を実行できます。)
答え3
解決策1:共有をキャンセル
共有をキャンセルutil-linuxパッケージでは、ネットワークなしで他の名前空間からアプリケーションを起動できますが、これにはrootが必要です。 firejailのソリューションはほとんど同じことを行いますが、ルートは必要ありません。
unshare -r -n app-command
解決策2:防火刑務所:
地獄火アプリケーションへのネットワークアクセスをブロックするために使用することができ、ルートは必要なく、すべてのユーザーがこの特典を享受できます。
firejail --noprofile --net=none app-command
解決策3:システム化
~からシステム v235別の非常に簡単なオプションがあります。
systemd-run --scope -p IPAddressDeny=any -p IPAddressAllow=localhost app-command
解決策4:ファイアウォール:
たとえば、ファイアウォールを使用できます。デュエインまたは公開内部告発者しかし、これらのアプリは100%効率的ではないか、開発の初期段階ではありません(2019年現在のバグなどが多い)。
解決策 5: カーネル MAC:
カーネルMACはファイアウォールとして使用できます。ともよ、セルリンクそしてアパモア このソリューションは、安定性と効率性(ファイアウォールソリューション)の点で最も優れていますが、ほとんどの設定はやや複雑です。
解決策 6: プロキシ:
1つの解決策は、アプリケーションを次にプロキシすることです。空/偽代理人。私達は利用できます靴下またはプロキシバインディング。ここにいくつかあります設定に関する詳細
解決策 7: iptables:
もう1つの簡単なソリューションは、アプリケーションをブロックするように設定できるiptablesです。
- 作成、確認新しいグループ;必要なユーザーをグループに追加します。
- 作る:
groupadd no-internet
- 確認済み:
grep no-internet /etc/group
- ユーザーを追加:
useradd -g no-internet username
注:既存のユーザーを変更するには、usermod -a -G no-internet userName
以下を実行する必要があります。sudo groups userName
- 作る:
- 作るスクリプトパスに追加して実行可能にします。
- 作る:
nano /home/username/.local/bin/no-internet
- 実行可能ファイル:
chmod 755 /home/username/.local/bin/no-internet
- コンテンツ:
#!/bin/bash
sg no-internet "$@"
- 次へ追加iptables ルールグループを削除するためのネットワーク活動インターネットなし:
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
注:変更を永久に適用することを忘れないでください。再起動後の自動適用。これを行うかどうかは、Linuxディストリビューションによって異なります。
4. たとえば、Firefox で以下を実行して確認します。 * `no-internet "firefox"`
5. 例外を設定してプログラムへのアクセスを許可する場合地域ネットワーク:
iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP
6. 永久に作る
起動時にiptablesルールを適用する1つの方法は、systemdを使用してルールをサービスとして追加することです。
cat /usr/lib/systemd/system/nonet.service
[Unit]
Description=Nonet group iptable update
After=network.target
After=xsession.target
After=iptables.service
After=shorewall.service
[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/bin/bash /home/user/Scripts/Nonet.iptables.sh
答え4
はい、カスタマイズされた服のプロフィールを使用してください。
/usr/bin/curl {
...
# block ipv4 acces
deny network inet,
# ipv6
deny network inet6,
# raw socket
deny network raw,
}
ただし、この方法では、アクセスが許可されているファイルのリストも作成する必要があり、プロセス全体が少し複雑になる可能性があります。そしてここでヘルプ記事をご覧ください。