데몬이 어떤 인터페이스에서 수신하고 있는지 확인하는 방법? -n -P COMMAND

예 : 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
#


답변

( ipopenwrt에 패키지를 설치해야 할 수도 있습니다 (v12 / 태도 조정)

ifconfig / netstat 등은 더 이상 사용되지 않는 것으로 간주 되므로 (루트로) 사용해야합니다

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, 전체 표기법, 로컬 호스트 / 루프백) 및 포트 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 주소 를 출력하고 검색하는 모습을 볼 수도 있습니다.

# 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

로 시작하는 라인 inetinet6이러한 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”교체)


답변

사용 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도 (루트로),이 작업을 수행 할 수 있습니다 :

# 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

답변

내가 아는 한, Finkregh의 솔루션이 잘 작동하는 BSD 시스템을 제외하고는 할 수 없습니다. 대부분의 응용 프로그램은 IP 주소에 바인딩 된 경우에도 모든 인터페이스에서 수신하기 때문에 가능할 수도 있지만 신경 쓰지 않아도됩니다.

Linux (및 openwrt)에서 응용 프로그램이 특정 인터페이스에서만 수신 할 수있는 유일한 방법은 SO_BINDTODEVICE소켓 옵션입니다. OS마다 다르기 때문에 실제로 이것을 지원하는 응용 프로그램은 거의 없습니다. 패킷 소켓을 사용하지만 DHCP 서버와 같은 저수준 프로토콜에 사용됩니다.

취약한 호스트 모델을 사용하는 Linux에서는 모든 응용 프로그램이 소켓을 IP 주소에 바인딩 할 때도 기본적으로 모든 인터페이스를 수신합니다. 127.0.0.1에 바인딩 할 때 유일한 예외는 응용 프로그램이 lo인터페이스 에서만 수신하도록합니다 .

잘 들었습니다 : 두 개의 다른 IP 주소 (예 : 192.0.2.1 및 198.51.100.1 )를 가진 두 개의 인터페이스 (예 : eth0eth1)가 있고 응용 프로그램이 192.0.2.1에서 바인딩하도록 지시하면 응용 프로그램은 여전히 ​​수신 대기합니다. 두 인터페이스를 모두 지원하지만 대상 IP가 192.0.2.1 인 경우에만 응답합니다. 따라서 라우팅 테이블이 적절하게 정의 된 경우 인터페이스의 누군가가 인터페이스의 192.0.2.1 주소 (198.51.100.1이 아닌)를 통해 애플리케이션에 액세스하여 애플리케이션에 액세스 할 수 있습니다.eth0eth1eth1eth1

Linux에서 IP 주소에 바인딩하는 것이 네트워크 인터페이스에 바인딩하는 것과 완전히 같다고 가정합니다. 방해가되는 경우 정책 라우팅 및 / 또는을 사용하십시오 iptables.