컬에 인터페이스 이름을 전달하면 모든 것이 예상대로 작동합니다.
$ curl --interface eth1 http://example.com
<!doctype html>
<html>
<head>
<title>Example Domain</title>
...
인터페이스 주소를 전달하면 시간 초과됩니다.
$ curl --interface 192.168.26.100 http://example.com
curl: (28) Failed to connect to example.com port 80 after 130248 ms: Couldn't connect to server
제가 사용하고 있는 소프트웨어는 인터페이스 이름이 아닌 주소에 대한 바인딩만 지원하기 때문에 인터페이스 주소를 사용하여 바인딩할 수 없는 이유를 알아내려고 합니다.
무슨 일이 일어날 수 있나요? ip addr
합계의 출력 은 다음과 같습니다 ip route show
.
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d8:3a:dd:5c:9d:77 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
valid_lft 81459sec preferred_lft 81459sec
inet6 fe80::a62e:3721:980e:beeb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether ac:49:43:f8:eb:6e brd ff:ff:ff:ff:ff:ff
inet 192.168.26.100/24 brd 192.168.26.255 scope global dynamic noprefixroute eth1
valid_lft 81456sec preferred_lft 81456sec
inet6 2001:14bb:ae:e82:f00e:38ba:2b2e:6f7c/64 scope global dynamic noprefixroute
valid_lft 7192sec preferred_lft 3592sec
inet6 fe80::2b6f:a6fc:d642:10e3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
$ ip route show
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100
default via 192.168.26.1 dev eth1 proto dhcp src 192.168.26.100 metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
192.168.26.0/24 dev eth1 proto kernel scope link src 192.168.26.100 metric 100
편집하다:ip route get 192.168.26.100
관련 질문을 살펴본 결과 IP 주소를 사용할 때 잘못된 인터페이스(eth1이 아닌 eth0)가 반환되는 것 같습니다.
$ ip route get oif eth1 to 8.8.8.8
8.8.8.8 via 192.168.26.1 dev eth1 src 192.168.26.100 uid 1000
cache
$ ip route get 192.168.26.100 to 8.8.8.8
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.100 uid 1000
cache
이 문제를 어떻게 해결할 수 있나요?
답변1
두 개 이상의 인터페이스가 있는 경우 기본 동작은 기술적으로 호출됩니다.약한 호스트 모델: 나가는 패킷의 소스 IP 주소는 나가는 인터페이스 선택에 영향을 미치지 않습니다. 이로 인해 현대 라우터가 무시하는 경향이 있는 비대칭 라우팅이 발생합니다.
시스템이 귀하의 기대에 부응하려면 다음이 필요합니다.시스템 구성강력한 호스트 모델: 이를 위해서는 더 엄격한 ARP 필터링 및 고급 라우팅을 구성하여 각 네트워크 인터페이스에 자체 라우팅 테이블과 기본 게이트웨이를 제공해야 합니다. 연결된 질문에서는 필요한 구성에 대해 더 자세히 설명합니다.
이것약한 호스트 모델그리고강력한 호스트 모델두 가지 대안적인 IP 스택 설계 원칙이 있습니다. Linux는 기본적으로 약한 호스트 모델을 사용합니다. 그 이유는 주로 패킷당 작업이 더 적게 필요하고 따라서 일반적인 사용 사례에서 더 나은 성능을 발휘하기 때문입니다.