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


28

例:sshdはwlan0でのみリッスンするように構成されています。そう。sshd_configを確認する以外に、どのインターフェイスでデーモンがリッスンしていることを確認できますか?netstatでできますか?どうやって?(OS:openwrtまたはScientific 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          
#

回答:


37

ipopenwrtにパッケージをインストールする必要がある場合があります(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はRFC 6540によるIPv6であるため、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

次に、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

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


デーモンがどのインターフェイスでリッスンしているのかを正確に判断する方法はないということです。IPアドレスによってのみ判断できるからです。
ガスコピーター

うん、正しい。あなた(またはI)、私はそれが前のステップを実行することを掲示するスクリプトを拡張することができ...
Oluf Lorenzenの

1
SO_BINDTODEVICEはどうですか?
パベルシメルダ16

20

使用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)

iproute2さんは、ssあまりにも(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
具体的には、*:sshまたは0.0.0.0:22ワイルドカードインターフェイス(つまり、すべて)でリッスンしていることを意味します。その特定のインターフェイスでリッスンしているような、host-eth1:sshまたは何かを10.0.0.4:22意味する
役に立たない

ちょっと待ってください。これは良い答えだと思いました:D、いいえ、そこにはインターフェースがありません。またはこの質問の解決策はありませんか?:O
ガスコピーター

@gaskopeter表示されている(192.168.1.5またはa.lan質問内の)IPアドレスからインターフェイスを確認できます。*この場所にが存在する場合、すべてのインターフェイスでリッスンします(*:sshsr_の回答)。
フィリップウェンドラー

@Useless:これは、BSDシステムでのみ当てはまります。
BatchyX

@BatchyXどうして?少なくともArch LinuxとDebianでUselessの言うことを見ることができます。
x-yuri

9

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

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

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

あなたはそれを正しく聞きました:2つの異なるIPアドレスを持つ2つのインターフェース(eth0eth1)があり(例えば192.0.2.1 eth0と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


-1

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

netstat -lp -i wlan0

1
このコマンドの出力についてもう少し詳しく説明していただけますか?:D
ガスコピーター

正直なところ、私は知りません。私がする必要があると思いますman netstat。私が提案している違いは、実行している「クエリ」を変更して、チェックしたいインターフェイスを明示的に指定することです。
frogstarr78

「netstat -lp -i wlan0」と「netstat -i」は、Ubuntuシステムで同じ応答を行います
ブルースバーネット

1
netstat -iリスニングポートではなくインターフェースをリストし、現実を反映していない応答に対して-1を表示します
Mikko Rantalainen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.