SSH 서버의 방화벽이 내 클라이언트의 연결을 거부합니다(방화벽을 활성화하지 않아도 정상적으로 작동함).

SSH 서버의 방화벽이 내 클라이언트의 연결을 거부합니다(방화벽을 활성화하지 않아도 정상적으로 작동함).

내 Android에서 연결하고 싶은 SSH 서버가 있습니다.

SSH 키를 만들었고 모든 것이 잘 작동합니다. 내 휴대폰은 SSH를 통해 내 서버에 연결됩니다. 문제 없습니다.

방화벽 을 활성화하면 문제가 시작됩니다 iptables. 이 시점에서 방화벽은 Android에서 들어오는 연결을 거부하고 있습니다.

내 Android에서는 Termux를 사용하고 있습니다. Termux에 있을 때 다음을 사용하여 공용 IP 주소를 찾을 수 있습니다.

curl -4 icanhazip.com

내 Android의 공개 IP는 입니다 x.x.121.3. 여기서는 주소를 난독화했지만 실제 iptables구성에서는 정확합니다. 구성은 다음과 같습니다.

Chain INPUT (policy DROP 7530 packets, 338K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   180 ACCEPT     tcp  --  *      *       x.x.161.85           0.0.0.0/0            tcp dpt:22 state NEW
    1    60 ACCEPT     tcp  --  *      *       x.x.134.54           0.0.0.0/0            tcp dpt:22 state NEW
    0     0 ACCEPT     tcp  --  *      *       x.x.121.3            0.0.0.0/0            tcp dpt:22 state NEW
    0     0 ACCEPT     tcp  --  *      *       x.x.136.182          0.0.0.0/0            tcp dpt:22 state NEW
  857 4470K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
   12   986 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  650 81372 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0

내가 도대체 ​​뭘 잘못하고있는 겁니까? 내 휴대폰에서 SSH 연결을 허용하는 방법은 무엇입니까?

답변1

curl -4 icanhazip.com데이터를 검색하기 위해 HTTP 및 포트 80을 사용합니다. 를 실행하여 이를 확인할 수 있습니다 curl -v -4 icanhazip.com.

귀하의 ISP가 트래픽을 조작할 수 있으므로 포트 80에 대한 모든 연결은 다른 통신(포트 22에 대한 SSH 포함)과 다른 IP 주소에서 인터넷에 들어갑니다.

예를 들어 캐시를 활용하고 프록시 이후의 링크를 통한 데이터 전송을 줄이기 위해 단일 프록시 서버를 통해 많은 클라이언트의 HTTP를 라우팅할 수 있습니다. 프록시는 거의 투명합니다. 사용자 측에서 구성이 필요하지 않으며 마치 프록시가 없는 것처럼 "느껴집니다". 하지만 별도의 IP 주소를 사용하여 많은 클라이언트를 대신하여 HTTP 요청을 수행합니다. 실제로 모든 클라이언트는 이 단일 IP 주소에서 오는 것으로 HTTP 서버에 나타납니다.

실제로 무슨 일이 일어나든, 아마도 귀하에게 제공한 주소는 curlSSH 연결이 사용하는 소스 주소가 아닐 것입니다. 방화벽에서 허용한 주소가 올바른 주소가 아닙니다.

다행스럽게도 방화벽을 비활성화하고 성공적으로 연결할 수 있습니다. 이 사실을 사용하여 올바른 IP 주소를 찾으세요.

  1. 방화벽을 일시적으로 비활성화합니다.
  2. 휴대폰에서 연결하세요.
  3. 결과 쉘 세션에서 echo "$SSH_CONNECTION".
  4. 첫 번째 IP 주소는 서버가 사용자가 연결한다고 "생각"하는 주소입니다.
  5. 아무것도 인쇄 되지 echo …않으면 서버의 로그에서 클라이언트의 실제 IP를 확인하세요. 내 데비안에서 유용한 명령은 다음과 같습니다:

    sudo tail /var/log/auth.log
    journalctl _SYSTEMD_UNIT=ssh.service | tail
    

    또는 일부 도구( lsof, ss, …)를 사용하여 설정된 연결 및 관련 주소를 확인합니다. 사용 중인 SSH 연결이 거기에 있어야 합니다. 여기서는 목록의 범위를 좁히고 실제로 이 단일 연결을 찾는 방법에 대해 자세히 설명하지 않겠습니다.

올바른 주소를 찾은 후 해당 주소에서 발생하는 SSH 트래픽을 허용하도록 방화벽을 재구성하십시오.

관련 정보