修正する:

修正する:

私はホスト名を自分のIPアドレスに関連付けることができることを知っています/etc/hosts

1.2.3.4   foo

たとえば、tcpdump出力にfoo私のIPアドレスの代わりに表示されます(-n使用されていない場合)。

IP -> hostname実際にファイルを編集せずにコマンドラインからこれらのマッピングを一時的に追加できますか?

Wi-Fiに接続してランダムなIPを取得したとしましょう。私はこのIPをtcpdumpの私のホスト名で解決したいと思います。今回のセッション(項目を永久に追加する必要はありません/etc/hosts

修正する:

私の質問とタイトルが明確でない場合は、修正せずにこれを行う方法を探しています/etc/hosts

hostname編集なしで現在のセッション(つまり、次の再起動まで)のホスト名を設定するコマンドを使用できるように、変更なしで現在のセッション(つまり次の再起動/etc/hostnameまで)のリバースルックアップを設定しようとしています/etc/hosts

答え1

Cライブラリのホスト名解決サービス(ホスト名解決が必要なほとんどすべてのソフトウェアで使用されます)は、hosts:主にファイルの行によって制御されます/etc/nsswitch.conf。この行の各キーワードはlibnss_*.soそのライブラリをロードし、最終的にアプリケーションのホスト名解決要求を処理します。

ディストリビューションにというパッケージ(またはライブラリを提供するnss-myhostname他のパッケージ)が含まれている場合は、そのパッケージをインストールして行に追加すると、ライブラリは自動的にローカルに設定されたシステムホスト名をすべてのIPアドレスに関連付けます。システムにネットワークインターフェイスを設定しました。この構成では、接続を更新するためにコマンドを実行する必要はありません。すべての操作が自動的に実行されます。システムにIPアドレスがまったく設定されていない場合、ローカルホスト名もIPアドレス127.0.0.2(およびIPv6アドレス::1)に関連付けられます。libnss_myhostname.so.*myhostnamehosts:nsswitch.conf

hosts:行にnsswitch.confキーワードが含まれている場合、または行に行がresolveある/etc/resolv.conf場合は、DNSリゾルバーをnameserver 127.0.0.53使用しています。systemd-resolvedこれは、ローカルホスト名とローカルに設定されたIPアドレスと同様の自動相関を提供しますlibnss_myhostname(上記参照)。これが発生した場合は、man systemd-resolvedセクションを参照してお読みくださいSYNTHETIC RECORDS。また、オプションのmDNS(以下を参照)およびLLMNR(Link Local Multicast Name Resolver / Responder)機能も含まれており、ロータリー方式でローカルホスト名解決を提供することもできます。

hosts:回線にnsswitch.confマルチキャストDNS(mDNS)を使用できるホスト名解決サービスが含まれている場合mdns4_minimal そしてシステムには、ローカルシステムのIPアドレスをavahi-daemon自動的に確認できるmDNSレスポンダ(例:)が含まれており、その逆も同様です。<hostname>.local

hosts:行にnsswitch.conf異なるオプションが含まれている場合、またはディストリビューションが異なるライブラリを提供している場合は、ディストリビューションを指定していないため、そのlibnss_*.soオプションが提供する機能を直接調査する必要があります。

hosts:行にnsswitch.confクラシックfilesdnsキーワードのみが含まれている場合または現在、ローカルネットワークインターフェイスに設定されていないIPアドレス(たとえば、他のホストのIPアドレス名)に名前を割り当てる必要があります。次に、次の方法を参照してください。マーカス・ミュラーの答え

これらの答えのどれも効果がなければ「いいえ、要求された機能はありません。しかし、プログラミング技術があれば直接実装するのに邪魔になることはありません」と答えることになりそうです。上記の可能なアプローチとMarcus Müllerの答えでは、このリストは自分のソリューションに接続するために使用できるインターフェイスのアイデアを提供する必要があります。

答え2

したがって、ここで tcpdump が実行する作業は、リバースルックアップを実行することです。通常は/etc/hostsエントリを尊重できるように見え、getnameinfoこれを行うためにlibcの機能を使用するという意味です。期待したように。

したがって、これはランタイム環境のかなり重要な部分の動作を変更する必要があることを意味します。 /etc/hosts は、実際にこれを行うのに最も邪魔になる方法ではありません。

今度は「会議専用」について真剣に考えてみてください。会議が意味するものを定義する必要があります。

  • 「セッション」が現在実行されている(またはシェルで開始された)すべてのプロセスを意味する場合は、関数を独自のバージョンに置き換え、実際にすべての引数を元の関数に渡す独自の小さなライブラリロードをtcpdump使用できます。名前を偽造するアドレスと要求されたアドレスを確認した後にのみ、ファイル、環境変数、またはアクティブな接続からそのアドレスを読み取るかどうかはあなた次第です。LD_PRELOADgetnameinfo
  • 「セッション」が「アクティブネットワーク接続」を意味する場合は、ネットワーク管理者にネットワーク自動設定(DHCP)によって提案されたリゾルバーを使用せず、ローカルで実行されている独自のリゾルバーを使用し、post-bringupおよび-bringdownを使用したsystemdユニットファイルをトリガーするように指示します。このパーサーに項目を追加/削除します。これはすべてのユーザーに影響を与えます。
  • 「セッション」が多いプログラムを実行する場合:スクリプトを使用して、元の/ etc / hostsを新しいファイルにコピーし、必要な行を追加します。次に、変更されたファイルを使用するインストール名前空間を作成します。それはまるで
#!/bin/bash
modified_hosts=$(mktemp XXXXXXX.etchosts)
cp /etc/hosts "${modified_hosts}"
echo "$1 ownhost" >> "${modified_hosts}"

method="unshare"
#method="container"

if [[ ${method} = "unshare" ]]
then
  unshare --mount --map-root-user \
     bash --rcfile \
        <(echo . ~/.bashrc; \
          mount --bind --make-private "${modified_hosts}" /etc/hosts; \
          echo "You're now in a mount space of your own, /etc/hosts has been modified."\
         )
else
  container_image="fedora:36"
  podman run -it --rm -v "${modified_hosts}:/etc/hosts:Z" "${container_image}"
fi

関連情報