2개의 네트워크 카드에 2개의 IP 주소가 있는 Oracle Linux 8.4를 실행하는 서버가 있습니다.
link/ether 34:48:ed:f6:d3:5c brd ff:ff:ff:ff:ff:ff
inet 10.154.224.252/24 brd 10.154.224.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet6 fe80::3648:edff:fef6:d35c/64 scope link
valid_lft forever preferred_lft forever
3: ens2f0np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether bc:97:e1:7a:41:e0 brd ff:ff:ff:ff:ff:ff
inet 10.154.226.252/24 brd 10.154.226.255 scope global noprefixroute ens2f0np0
valid_lft forever preferred_lft forever
inet6 fe80::be97:e1ff:fe7a:41e0/64 scope link
valid_lft forever preferred_lft forever
/etc/iproute2/rt_tables
db and app
그래서 스크립트에 2개의 테이블 경로를 만들었습니다.
#!/bin/sh
ip route add 10.154.226.0/24 dev ens2f0np0 src 10.154.226.252 table db
ip route add default via 10.154.226.1 dev ens2f0np0 table db
ip rule add from 10.154.226.252/24 table db
ip rule add to 10.154.226.252/24 table db
ip route add 10.154.224.0/24 dev eno1 src 10.154.224.252 table app
ip route add default via 10.154.224.1 dev eno1 table app
ip rule add from 10.154.224.252/24 table app
ip rule add to 10.154.224.252/24 table app
ip r command show:
10.154.224.0/24 dev eno1 proto kernel scope link src 10.154.224.252 metric 100
10.154.226.0/24 dev ens2f0np0 proto kernel scope link src 10.154.226.252 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
모든 인터페이스에서 시스템에 SSH로 연결할 수 있지만 서버에서 인터넷이나 다른 서브넷에 연결할 수 없습니다.
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.154.224.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1
10.154.226.0 0.0.0.0 255.255.255.0 U 100 0 0 ens2f0np0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
뭔가 빠졌나요? 이 문제를 어떻게 해결할 수 있나요?
답변1
인터넷 접속이 안되는 이유는 다음과 같습니다.기본라우팅 테이블에는 기본 경로가 없습니다.
따라서 예를 들어 바인딩되지 않은 TCP 소켓이 생성되고 연결되면(예: INADDR_ANY에 바인딩) connect(2)
경로 조회를 사용하여 소켓에 할당할 로컬 IP 주소를 결정합니다. 결과가 무엇인지 결정하기 위해 소켓이 바인딩되지 않았기 때문에 이 경로는 INADDR_ANY 로컬 주소를 사용합니다. 따라서 비교된 값이 0.0.0.0이므로 일치하지 않으므로 정책 규칙을 특정 소스 주소와 일치시키지 않습니다.기본라우팅 테이블.
다음을 사용하여 확인할 수 있습니다 ip route get
.
# ip route get 8.8.8.8
RTNETLINK answers: Network is unreachable
그러나 클라이언트 응용 프로그램이 주소를 바인딩하는 경우(예: curl --interface=10.154.226.252 ifconfig.co
그러나 DNS도 영향을 받으므로 이 예에 추가해야 할 수도 있습니다. --dns-interface=10.154.226.252
DNS 서버가 연결 가능한 LAN에 없는 경우) 정책 규칙이 일치하고 대체 경로는 다음과 같습니다. Apply 를 사용하면 연결이 가능해집니다.
# ip route get from 10.154.226.252 104.21.25.86
104.21.25.86 from 10.154.226.252 via 10.154.226.1 dev ens2f0np0 table db uid 0
cache
# ip route get from 10.154.224.252 104.21.25.86
104.21.25.86 from 10.154.224.252 via 10.154.224.1 dev eno1 table app uid 0
cache
따라서 "기본" 기본 경로가 여전히 필요합니다.기본클라이언트 애플리케이션이 호스트에 속한 IP 주소에 명시적으로 바인딩되지 않는 경우 선택해야 합니다. 우리 넣어 보자앱모서리 선택:
ip route add default via 10.154.224.1
그래서 지금:
# ip route
default via 10.154.224.1 dev eno1
10.154.224.0/24 dev eno1 proto kernel scope link src 10.154.224.252
10.154.226.0/24 dev ens2f0np0 proto kernel scope link src 10.154.226.252
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
# ip route get 8.8.8.8
8.8.8.8 via 10.154.224.1 dev eno1 src 10.154.224.252 uid 0
cache
만약진짜기본 경로를 추가하는 대신 ip rule
INADDR_ANY에서 성공적인 경로 조회를 허용하도록 제작된 명령으로 바꿀 수 있습니다.
ip route del default
ip rule add from 0.0.0.0/32 lookup app
사용하는 것을 제외하면 동일한 결과앱대신에 테이블기본테이블:
# ip route get 8.8.8.8
8.8.8.8 via 10.154.224.1 dev eno1 table app src 10.154.224.252 uid 0
cache
어떤 인터페이스가 중요하지 않고 로드 밸런싱을 원하는 경우 위의 기본 경로를 대신 사용할 수 있습니다.다중 경로노선:
ip route del default # was already done
ip rule del from 0.0.0.0/32 lookup app
ip route add default nexthop via 10.154.224.1 dev eno1 nexthop via 10.154.226.1 dev ens2f0np0
나가는 주소를 "무작위로" 선택하고(실제로 안정적인 경로를 얻기 위해 소스와 대상을 기반으로 일부 해싱 알고리즘을 따름) 선택한 인터페이스에서 바인딩할 암시적 소스 주소를 선택하고 추가로 나가는 패킷은 정책 라우팅을 사용합니다. (그러나 정책 라우팅이 없더라도 해시는 이를 동일한 인터페이스에 유지하며 루프가 아닙니다.)
예(다른 시스템에 따라 다를 수 있습니다. 최소 4개의 연속 IP 주소를 시도하십시오):
# ip route get 8.8.8.9
8.8.8.9 via 10.154.224.1 dev eno1 src 10.154.224.252 uid 0
cache
# ip route get 8.8.8.10
8.8.8.10 via 10.154.226.1 dev ens2f0np0 src 10.154.226.252 uid 0
cache
다중 경로를 있는 그대로 사용하는 데는 다양한 주의 사항이 있을 수 있습니다. 일부 위치에서는 적절한 SNAT/MASQUERADE가 여전히 필요하지만(그러나 제대로 작동해야 함), 인터페이스에 대한 라우팅이 실패하면 클라이언트 측 바인딩 해제 연결 시도 중 절반이 실패합니다. 복구 메커니즘이 필요하지 않지만 이전에는 100% 또는 0%였습니다.
답변2
Linux 컴퓨터에는 기본 게이트웨이가 두 개 있을 수 없습니다. 인터넷에 접속하려는 인터페이스에만 기본 게이트웨이를 설정하세요.