私はホスト名を自分の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.*
myhostname
hosts:
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
クラシックfiles
とdns
キーワードのみが含まれている場合または現在、ローカルネットワークインターフェイスに設定されていないIPアドレス(たとえば、他のホストのIPアドレス名)に名前を割り当てる必要があります。次に、次の方法を参照してください。マーカス・ミュラーの答え。
これらの答えのどれも効果がなければ「いいえ、要求された機能はありません。しかし、プログラミング技術があれば直接実装するのに邪魔になることはありません」と答えることになりそうです。上記の可能なアプローチとMarcus Müllerの答えでは、このリストは自分のソリューションに接続するために使用できるインターフェイスのアイデアを提供する必要があります。
答え2
したがって、ここで tcpdump が実行する作業は、リバースルックアップを実行することです。通常は/etc/hostsエントリを尊重できるように見え、getnameinfo
これを行うためにlibcの機能を使用するという意味です。期待したように。
したがって、これはランタイム環境のかなり重要な部分の動作を変更する必要があることを意味します。 /etc/hosts は、実際にこれを行うのに最も邪魔になる方法ではありません。
今度は「会議専用」について真剣に考えてみてください。会議が意味するものを定義する必要があります。
- 「セッション」が現在実行されている(またはシェルで開始された)すべてのプロセスを意味する場合は、関数を独自のバージョンに置き換え、実際にすべての引数を元の関数に渡す独自の小さなライブラリロードを
tcpdump
使用できます。名前を偽造するアドレスと要求されたアドレスを確認した後にのみ、ファイル、環境変数、またはアクティブな接続からそのアドレスを読み取るかどうかはあなた次第です。LD_PRELOAD
getnameinfo
- 「セッション」が「アクティブネットワーク接続」を意味する場合は、ネットワーク管理者にネットワーク自動設定(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