로컬 주소에 바인딩된 애플리케이션에서 패킷을 보낼 때 TCP는 UDP와 다른 소스 주소를 사용합니다. 예를 들어, 10.10.0.51(별칭 IP)에 바인딩하면 UDP의 src 주소는 10.10.0.51이지만 TCP의 src 주소는 10.10.0.2(머신의 기본 IP 주소)입니다. 이는 tcpdump 패킷 캡처를 사용하여 관찰됩니다.
"ip Route show"의 출력에는 "10.10.0.0/22 dev eth1 proto kernelscope link src 10.10.0.2" 줄이 포함됩니다.
내 질문: TCP는 라우팅 테이블의 소스 주소를 사용하지만 UDP는 애플리케이션이 바인딩하는 소스 주소를 사용하는 이유는 무엇입니까?
이것은 CentOS 6에 있습니다.
[user@host ~]$ ip route show
10.10.0.0/22 dev eth1 proto kernel scope link src 10.10.0.2
10.20.0.0/22 via 10.10.0.1 dev eth1
10.145.192.0/18 dev eth0 proto kernel scope link src 10.145.194.226
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
169.254.0.0/16 dev eth2 scope link metric 1004
default via 10.145.255.254 dev eth0
[user@host ~]$ uname -a
Linux machinename 2.6.32-358.6.1.el6.x86_64 #1 SMP Tue Apr 23 19:29:00 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[user@host ~]$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:01:c3:96 brd ff:ff:ff:ff:ff:ff
inet 10.145.194.226/18 brd 10.145.255.255 scope global eth0
inet6 fe80::250:56ff:fe01:c396/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:01:c3:97 brd ff:ff:ff:ff:ff:ff
inet 10.10.0.2/22 brd 10.10.3.255 scope global eth1
inet 10.10.0.51/22 scope global secondary eth1:1
inet 10.10.0.52/22 scope global secondary eth1:2
inet 10.10.0.53/22 scope global secondary eth1:3
inet 10.10.0.54/22 scope global secondary eth1:4
inet 10.10.0.55/22 scope global secondary eth1:5
inet6 2002::10:10:0:55/96 scope global
valid_lft forever preferred_lft forever
inet6 2002::10:10:0:54/96 scope global
valid_lft forever preferred_lft forever
inet6 2002::10:10:0:53/96 scope global
valid_lft forever preferred_lft forever
inet6 2002::10:10:0:52/96 scope global
valid_lft forever preferred_lft forever
inet6 2002::10:10:0:51/96 scope global
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe01:c397/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:01:c3:98 brd ff:ff:ff:ff:ff:ff
5: ip6tnl0: <NOARP> mtu 1460 qdisc noop
link/tunnel6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
편집: 문제의 애플리케이션은 SIPp입니다.
sipp -sn uac -i 10.10.0.51 -t tn -p 5060 -m 1 -r 1 10.10.0.1
sipp -sn uac -i 10.10.0.51 -t un -p 5060 -m 1 -r 1 10.10.0.1
편집 2:
[user@host ~]$ ss -tplan | grep 5060
LISTEN 0 100 10.10.0.51:5060 *:* users:(("sipp",14837,3))
SYN-SENT 0 1 10.10.0.2:50903 10.10.0.1:5060 users:(("sipp",14837,7))
[user@host ~]$ ss -uplan | grep 5060
UNCONN 0 0 10.10.0.51:5060 *:* users:(("sipp",14850,3))
답변1
문제가 SIPp에 있고 일반적으로 Linux에 있지 않다는 것을 (어느 정도) 확인할 수 있었습니다.
SIPp를 사용하여 티켓을 만들었습니다.https://sourceforge.net/p/sipp/bugs/147/
내 문제 해결 방법은 다음과 같습니다.
"서버" 측에서 netcat을 엽니다.
nc -v -l 10.10.0.55 5060
"클라이언트 측에서 netcat을 엽니다.
nc -v -s 10.10.0.5 10.10.0.55 5060
"서버" 측 출력:
Connection from 10.10.0.5 port 5060 [tcp/*] accepted
"클라이언트" 측 출력:
Connection to 10.10.0.55 5060 port [tcp/sip] succeeded!
"클라이언트" 측에서 특정 IP를 지정하지 않은 경우:
nc -v 10.10.0.55 5060
그러면 "서버" 측의 출력은 다음과 같습니다.
Connection from 10.10.0.4 port 5060 [tcp/*] accepted
이는 특정 IP 주소를 지정하면 작동하지만 -i 플래그를 사용할 때 그런 식으로 작동하지 않는 것은 SIPp임을 의미합니다.