web-dev-qa-db-ja.com

デーモンがどのインターフェースでリッスンしていることを確認するには?

例:sshdはwlan0でのみリッスンするように構成されています。そう。 sshd_configをチェックする以外に、デーモンがどのインターフェースをリッスンしていることをどのようにチェックできますか? netstatはそれを行うことができますか?どうやって? (OS:openwrtまたはscience linuxまたはopenbsd)

更新:

Sshdはインターフェースに制限される可能性があると思いました...しかし、そうではありません...(192.168.1.5はwlan0にあります...)

# 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          
#
33
gasko peter

(openwrtにパッケージipをインストールする必要がある場合があります(v12 /姿勢調整)

ifconfig/netstatなどが考慮されます 非推奨 なので、(rootとして)使用する必要があります

ss -nlput | grep sshd

文字列sshdを含む実行中のプログラムがリッスンしているTCP/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である RFC 654 であるため、IPv6は記述しません)
  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をリッスンします

次に、(1をカバーするために)どのインターフェースにIPv4アドレスがあるかを知りたいと思います。

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

(IP(-6)またはIPv4(-4)の両方のオプションが表示されていない場合)

また、出力を表示して検索することもできます。 127.0.0.1またはその他のIP/IPv4-address

# 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およびinet6で始まる行は、これらのIPがこのインターフェイスにバインドされていることを示しています。インターフェイスごとにこれらの行の多くがある場合があります。

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」を置き換えます)

42
Oluf Lorenzen

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  
21
sr_

私の知る限りではできません(Finkreghのソリューションが正常に機能するBSDシステムを除く)。ほとんどのアプリケーションはIPアドレスにバインドされている場合でも、すべてのインターフェイスでリッスンするため、それは可能かもしれませんが、気にしないでください。

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

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

2つの異なるIPアドレス(eth0には192.0.2.1、eth1には198.51.100.1など)の2つのインターフェース(eth0eth1など)があり、アプリケーションに192.0.2.1にバインドするようにアプリケーションに指示した場合、アプリケーションは引き続き両方のインターフェースで待機しますが、宛先IPが192.0.2.1の場合にのみ応答します。したがって、eth1インターフェース上の誰かが、そのルーティングテーブルが適切に定義されている場合、eth1インターフェース上の192.0.2.1アドレス(ただし198.51.100.1ではない)を介してアプリケーションにアクセスできます。

Linuxでは、IPアドレスへのバインドがネットワークインターフェイスへのバインドと同じであると仮定すると、まったく誤りになります。それが気になる場合は、ポリシールーティングやiptablesを使用してください。

10
BatchyX

また、netstatを使用しますが、特定の引数は次のとおりです。

netstat -lp -i wlan0
0
frogstarr78