데몬이 어떤 인터페이스를 수신하고 있는지 확인하는 방법은 무엇입니까?

데몬이 어떤 인터페이스를 수신하고 있는지 확인하는 방법은 무엇입니까?

예: sshd는 wlan0에서만 수신하도록 구성되었습니다. 그래서. sshd_config를 확인하는 것 외에도 데몬이 수신 대기 중인 인터페이스를 어떻게 확인할 수 있나요? netstat로 가능합니까? 어떻게? (운영 체제: openwrt 또는 과학적인 Linux 또는 openbsd)

고쳐 쓰다:

sshd는 하나의 인터페이스로 제한될 수 있다고 생각했는데...아니요...(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 주소와 포트 조합을 보여주는 다섯 번째 열입니다.

  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이 작업을 루트로 수행하는 것도 가능합니다 :

# 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인터페이스에서만 수신 대기하도록 보장합니다.

당신도 그 말을 옳게 들었습니다. 두 개의 인터페이스(예: 192.0.2.1 eth0및 198.51.100.1 eth1)와 두 개의 서로 다른 IP 주소(예: 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.

답변4

netstat를 사용할 수도 있지만 특정 매개변수는 다음과 같습니다.

netstat -lp -i wlan0

관련 정보