패킷 소스로 사용되는 IP 주소를 가져와야 합니다.default
경로를 통해 보내기. (편집) 내가 언급한 경로는 default
레이블이 붙은 것입니다 default
( ip r
VPN 설정에서 패킷이 사용하게 될 실제 경로는 끝 부분을 참조하세요).
내 첫 번째 생각은 다음을 사용 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
.
출력의 최종 컷은 ip
lng 측면에서 유지될 수 없습니다(출력 변경, 릴리스 또는 버전 간 출력 변경 등...).
해당 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 배포판에서 더 나은 선택입니다.procfs
netstat
netstat
ip
답변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 }'