기본 경로 소스 주소를 얻는 이식 가능한 방법은 무엇입니까?

기본 경로 소스 주소를 얻는 이식 가능한 방법은 무엇입니까?

패킷 소스로 사용되는 IP 주소를 가져와야 합니다.default경로를 통해 보내기. (편집) 내가 언급한 경로는 default레이블이 붙은 것입니다 default( ip rVPN 설정에서 패킷이 사용하게 될 실제 경로는 끝 부분을 참조하세요).

내 첫 번째 생각은 다음을 사용 ip r하고 추정하는 것이 었습니다.

# ip r
0.0.0.0/1 via 10.0.2.1 dev tun0
default via 10.237.76.1 dev enxb827eb4297a4 src 10.237.77.206 metric 202
10.0.2.0/24 dev tun0 proto kernel scope link src 10.0.2.100
10.81.102.133 via 10.237.76.1 dev enxb827eb4297a4
10.237.76.0/22 dev enxb827eb4297a4 proto kernel scope link src 10.237.77.206 metric 202
128.0.0.0/1 via 10.0.2.1 dev tun0

보기에도 좋고 ip r | grep default | cut -d" " -f7원하는 효과도 줍니다 10.237.77.206.

그런 다음 다른 시스템(두 데비안 파생 제품 모두)에서 나는 다음과 같은 결과를 얻었습니다.

# ip r
0.0.0.0/1 via 10.0.2.1 dev tun0
default via 10.237.76.1 dev eth0  metric 202
10.0.2.0/24 dev tun0  proto kernel  scope link  src 10.0.2.5
10.81.102.133 via 10.237.76.1 dev eth0
10.237.76.0/22 dev eth0  proto kernel  scope link  src 10.237.76.56  metric 202
128.0.0.0/1 via 10.0.2.1 dev tun0

10.237.76.1여기서 해결 방법은 그리 간단하지 않습니다. 기본 경로 IP( )를 10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202추출 하고 이를 src.

출력의 최종 컷은 iplng 측면에서 유지될 수 없습니다(출력 변경, 릴리스 또는 버전 간 출력 변경 등...).

해당 IP를 얻는 더 이식 가능한 방법이 있습니까?

"휴대용"이란 다음을 의미합니다.

  • 이상적으로는 "모든 Linux에서 작동"합니다.
  • 이상적이지는 않지만 여전히 좋음 "Debian 및 그 파생 제품에서 작동"

장치는 독점 VPN에 있으므로 VPN이 작동 중일 때(즉, 대부분의 경우) 패킷이 사용하는 실제 경로를 직접 분석할 수는 없습니다. 이 default경로는 전체 IP를 효과적으로 포괄하는 두 개의 다른 경로에 의해 차단됩니다. 범위. 내가 틀렸다면 정정해주세요.

답변1

Google DNS와 같이 기본 경로를 통해 항상 액세스할 수 있다고 생각되는 임의의 주소를 선택한 다음 소스 주소를 인쇄할 수 있습니다.저것노선:

ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'

답변2

기본 경로 소스 주소를 표시합니다.

ip route get 8.8.8.8  | awk ' /^[0-9]/ { print $7 }'  
  • { print $7 }7번째 출력 필드를 선택합니다 ip....
  • ^[0-9]숫자로 시작하는 줄을 선택하면 ip올바른 줄을 선택하기 위한 두 줄이 생성됩니다.

참고: 저는 첫 번째 솔루션을 선호하지만 대안을 보여주기 위해 다른 솔루션도 표시됩니다.

또는:

ip route get 8.8.8.8 |  cut -f7 -d" " | grep '^[0-9]'

다시:

  • cut필드 7을 선택하십시오 .

또는:

 ip route get 8.8.8.8 | grep ^[0-9] |  cut -f7 -d" " 

또는:

ip route get 8.8.8.8 | fgrep src |  cut -f7 -d" "

또는:

 ip route get 8.8.8.8 | awk ' /src/ { print $7 }' 

좀 더 명확히 하기 위해 출력은 다음과 같습니다 ip.

$  ip route get 8.8.8.8 
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.249 
   cache  

Linux에서 기본 경로를 얻는 방법 ip에는 . 더 이상 사용되지 않으며 제 생각에는 최근 Linux 배포판에서 더 나은 선택입니다.procfsnetstatnetstatip

답변3

실제 의도(원래 출력 IP 찾기)와 답변을 바탕으로 트릭을 수행해야 하는 (다소 긴) 한 줄은 다음과 같습니다.

ip route get 8.8.8.8 oif $(ip route | sed -n '/^default/s/^.* dev \([^ ][^ ]*\) *.*$/\1/p')  | sed -n 's/^.* src \([^ ][^ ]*\) *.*$/\1/p'

1단계 $(): 기본 경로를 가져오고 키워드 다음에 인터페이스만 검색합니다.개발자(배포에 따라 달라질 수도 있고 그렇지 않을 수도 있는 조건에 따라 이 단계에서 경로가 소스 IP를 표시하거나 표시하지 않기 때문입니다)

2단계: 특별한 라우팅 설정을 조작해서는 안 되지만 이전에 검색된 인터페이스를 사용해야 하는 "잘 알려진" 공용 IP 주소에 대한 경로를 얻습니다. 따라서 커널이 아래에 묻혀 있는 실제 원래 기본값을 사용하도록 효과적으로 요구 0.0.0.0/1합니다 128.0.0.0/1. 계획된. 키워드로 IP 검색소스 코드

답변4

내 시나리오(호스트의 IP를 올바르게 가져오기 위해 도커 컨테이너 설정)에서는 다음과 같이 결정했습니다.

ip route|awk '/src/ { print $7 }'

관련 정보