デーモンがどのインタフェースを受信して​​いるかを確認する方法は?

デーモンがどのインタフェースを受信して​​いるかを確認する方法は?

例:sshdはwlan0でのみ受信するように設定されています。だから。 sshd_configをチェックするだけでなく、デーモンがリッスンしているインターフェイスをどのように確認できますか? netstatで可能ですか?どのように? (オペレーティングシステム:openwrtまたは科学的なLinuxまたはopenbsd)

修正する:

sshdは1つのインターフェースに制限できると思いました...いいえ...(wlan0の192.168.1.5...)

# grep ^ListenAddress /etc/ssh/sshd_config 
ListenAddress 192.168.1.5:22
# 
# lsof -i -n -P
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd      23952 root    3u  IPv4 1718551      0t0  TCP 192.168.1.5:22 (LISTEN)
#
# ss -lp | grep -i ssh
0      128              192.168.1.5:ssh                           *:*        users:(("sshd",23952,3))
# 
# netstat -lp | grep -i ssh
tcp        0      0 a.lan:ssh                   *:*                         LISTEN      23952/sshd          
#

答え1

ip(openwrt(v12 / posture-adjustment)にこのパッケージをインストールする必要があるかもしれません。

ifconfig/netstat などを考慮してください。廃止そのため、(ルートとして)を使用する必要があります。

ss -nlput | grep sshd

実行中のプログラムがリッスンしている文字列を含むsshdTCP / UDPソケットを表示します。

  • -n
    ポート名解決なし
  • -l
    ソケットでのみ待機
  • -p
    リスニングプロセスの表示
  • -u
    UDPソケットの表示
  • -t
    TCPソケットの表示

これにより、次のリストが表示されます。

tcp    LISTEN     0      128                    *:22                    *:*      users:(("sshd",3907,4))
tcp    LISTEN     0      128                   :::22                   :::*      users:(("sshd",3907,3))
tcp    LISTEN     0      128            127.0.0.1:6010                  *:*      users:(("sshd",4818,9))
tcp    LISTEN     0      128                  ::1:6010                 :::*      users:(("sshd",4818,8))

興味深い点は、IPアドレスとポートの組み合わせを示す5番目の列です。

  1. *:22
    利用可能なすべてのIPv4アドレスからポート22をリッスンします。
  2. :::22
    使用可能なすべてのIPアドレスに対してポート22でリッスンする(IPがIPv6なのでIPv6を書きません)RFC 6540)
  3. 127.0.0.1:6010
    IPv4 アドレス 127.0.0.1 (localhost/loopback) およびポート 6010 でリッスンします。
  4. ::1:6010
    受信 IP アドレス::1 (完全表記は 0:0:0:0:0:0:0:1, localhost/loopback でもあります) およびポート 6010

次に、どのインターフェイスにIPv4アドレスがあるかを知りたいです(1.適用)。

ip -4 a
# or "ip -4 address"
# or "ip -4 address show"

またはIPアドレス(2番参照)

ip -6 a
# or "ip -6 address
# or "ip -6 address show

-6(IP()またはIPv4()オプションを追加しないと、両方が-4表示されます。)

出力を表示して、たとえば127.0.0.1別のIP / IPv4アドレスを検索することもできます。

# here a demo where i show all addresses of the device "lo" (loopback)
ip a show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

inetこのインターフェイスにバインドされたIPで始まり、表示する行には、inet6インターフェイスごとに次のような行がたくさんあります。

he-ipv6: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
    link/sit 192.0.2.1 peer 192.0.2.3
    inet6 2001:db8:12::1/64 scope global
       valid_lft forever preferred_lft forever
    inet6 2001:db8::2/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::1111:1111/128 scope link
       valid_lft forever preferred_lft forever

そしてスクリプトから:

address="127.0.0.1"
for i in $(grep ':' /proc/net/dev | cut -d ':' -f 1 | tr -d ' ') ; do
        if $(ip address show dev $i | grep -q "${address}") ; then
                echo "${address} found on interface ${i}"
        fi
done

(「127.0.0.1」の交換)

答え2

使用lsof(ルートとして):

# lsof -i -n -P
COMMAND    PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      3028        root    3u  IPv4   7072      0t0  TCP *:22 (LISTEN)
sshd      3028        root    4u  IPv6   7074      0t0  TCP *:22 (LISTEN)

iproute2ssこれをrootとして実行することも可能です:

# ss -lp
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port   
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",3028,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",3028,3))

...そして最後にnetstat(ルートとして):

# netstat -lp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:ssh                   *:*                     LISTEN      3028/sshd  

答え3

私が知っている限り、それはできません(Finkreghのソリューションがうまく機能するBSDシステムを除く)。おそらく可能性がありますが、ほとんどのアプリケーションはIPアドレスにバインドされていてもすべてのインターフェイスを受信するので、問題ありません。

Linux(およびopenwrt)でアプリケーションが特定のインターフェイスのみを受信できる唯一の方法は、SO_BINDTODEVICEソケットオプションです。オペレーティングシステムによって異なるため、実際にこれをサポートするアプリケーションはほとんどありません。または、パケットソケットを使用しますが、これは低レベルのプロトコル(dhcpサーバーなど)用です。

弱いホストモデルを使用するLinuxでは、ソケットがIPアドレスにバインドされていても、すべてのアプリケーションがデフォルトですべてのインターフェイスを受信します。唯一の例外は、127.0.0.1にバインドする場合です。これにより、アプリケーションがそのloインターフェイスでのみリッスンすることが保証されます。

あなたもその言葉を正しく聞きました。 2つのインターフェイス(例:192.0.2.1eth0と198.51.100.1 eth1)と2つの異なるIPアドレス(例:192.0.2.1eth0と198.51.100.1 eth1)があり、アプリケーションに192.0.2.1にバインドするように指示する場合、アプリケーションは両方のインターフェイスでリッスンし続けますが、宛先IPが192.0.2.1の場合にのみ応答します。したがって、インターフェイスのルーティングテーブルが正しく定義されている場合、そのインターフェイスの誰かがeth1インターフェイスの192.0.2.1アドレスを介してアプリケーションにアクセスできます(198.51.100.1では不可能)eth1

Linuxでは、IPアドレスバインディングがネットワークインターフェイスバインディングと同じであると仮定するのは完全に間違っています。これが面倒な場合は、ポリシールーティングおよび/またはを使用してくださいiptables

答え4

netstatを使用することもできますが、特定のパラメータは次のとおりです。

netstat -lp -i wlan0

関連情報