unshareを使用してネットワーク名前空間を作成しています。
unshare -rn bash
このガイドで説明されているように、vethインターフェースのジョブ設定はすでにあります。
https://josephmuia.ca/2018-05-16-net-namespaces-veth-nat/
またはこのスクリプトでは:https://gist.github.com/dpino/6c0dca1742093346461e11aa8f608a99
インターネット接続のため。また、vethデバイスでIPv6を無効にしました。私はnftablesを使って出てくるすべてのDNSトラフィックを私のdns-proxyに送ります。
/usr/sbin/nft add table nat
/usr/sbin/nft add chain nat output "{ type nat hook output priority filter; policy accept;}"
/usr/sbin/nft add rule nat output udp dport 53 dnat 10.200.1.1:53
試してみると、dig example.com
必要に応じてDNSプロキシに送信され、pingが正しく機能します。
次に、ユーザーとPID名前空間を作成します。
unshare -pf --mount-proc --map-user=1000 --map-group=1000
ネットワークネームスペース内でも、ip a
まだネットワークネームスペースにあることを確認し、dig example.com
以前と同じように戻ってきました。 vs codeなどのアプリケーションを実行すると、DNSトラフィックがホストethデバイスには表示されますが、vethデバイスには表示されません。そして私のDNSプロキシに渡されません。なぜこれが起こるのかわかりません。これは、DNS 関連のトラフィックだけが veth デバイスを通過しないためです。また、ネットワークネームスペースの内部を変更してみましたが、/etc/resolv.conf
何も変更されませんでした。 resolv.confがNetworkManagerによって生成されることに言及したいと思います。