IP 앨리어싱시 OS는 아웃 바운드 TCP / IP 연결의 소스로 사용할 IP 주소를 어떻게 결정합니까?


15

단일 NIC에서 별명을 가진 4 개의 IP 주소를 가진 Ubuntu Server를 실행하는 서버가 있습니다.

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(예를 들어 192.168.xx를 사용하는 경우 공용 IP 주소 범위에 NAT로 연결되어 있다고 가정)

클라이언트 중 하나가 FTP를 통해 인벤토리를 게시하므로 야간에 로그인하여 서버에서 큰 파일을 다운로드합니다. 그들의 방화벽은 (패시브) FTP 연결이 192.168.1.100에서 이루어질 것으로 예상합니다.

내 서버에 단일 어댑터에 4 개의 IP 주소가 논리적으로 있다고 가정하면 운영 체제는 아웃 바운드 TCP / IP 연결의 소스로 사용되는 IP 주소를 어떻게 결정합니까?

192.168.1.101에서 서버로 ssh하고 대화식으로 FTP를 실행한다고 가정 해 봅시다. OS가 셸이 연결된 인터페이스임을 알고 있기 때문에 아웃 바운드 TCP / IP 연결에서 192.168.1.101을 사용합니까?

FTP 작업이 쉘이없는 cron 작업을 통해 비 대화식으로 실행되면 어떻게됩니까?

당신이 아마 알 수 있듯이, 이것은 꽤 혼란 스러웠으므로 내 질문이 적어도 이해되기를 바랍니다.

편집하다

내가 묻는 이유를 분명히하기 위해-라우팅 테이블을 변경하지 않았으며 실제로 0.0.0.0 경로의 IFace로 'eth0'이 나열됩니다. 그러나 모든 표시는 실제로 소스로 eth0 : 0을 사용하고 있다는 것입니다.

Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0        192.168.1.1     0.0.0.0         UG    100    0        0 eth0

라우팅 테이블로 바이올린을 피우거나 클라이언트가 방화벽 규칙을 변경하여 필요한 동작을 얻을 수 있지만 OS에 버그가 있는지 또는 순진한 이해가 있는지 알 수 있도록 약간의 통찰력을 얻으려고합니다. 모든 조각들이 어떻게 어울리는 지

감사

답변:


12

기본적으로 Linux에서 인터페이스에 서로 다른 서브넷에있는 여러 개의 주소가있는 경우 각 서브넷으로 향하는 트래픽에는 적절한 소스 IP가 있습니다. 즉, eth0에 두 개의 주소 192.168.1.1/24 및 10.1.1.1/8이있는 경우 10.0.0.0 서브넷의 모든 트래픽은 소스 10.1.1.1이되고 192.168.1.0 서브넷의 모든 트래픽은 소스가됩니다. 192.168.1.1. 이 경우 "src 1.2.3.4"옵션을 사용하여 "ip route"에 소스 주소를 명시 적으로 할당 할 수도 있습니다.

그러나 귀하의 경우 모든 주소가 동일한 서브넷에 있으므로 "1 차"주소 ( "ip addr list dev eth0"로 표시됨)는 해당 인터페이스에서 트래픽이 나가는 소스 IP로 사용됩니다. 이 경우 "ip route"를 사용하여 소스 IP를 제어 할 수 있다고 생각하지만 iptables를 사용하여 관심있는 트래픽의 소스 주소를 다시 작성하는 것이 더 쉽다는 것을 알았습니다.

특정 소스 주소를 특정 대상에 사용하도록하려면 SNAT 규칙을 사용하여 수행 할 수 있습니다.

iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP

따라서 "기본"eth0 IP가 192.168.100.1이지만 1.2.3.4로가는 트래픽이 192.168.100.2의 소스를 가지려면 다음을 수행하십시오.

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

"-s 192.168.100.1"은 중요합니다. 이 규칙은 전달 된 트래픽의 소스 주소를 다시 쓰지 못하게 합니다.

Linux에서 복잡한 네트워크 구성을 구현하려는 경우 Linux Advanced Routing and Traffic Control 문서 ( http://lartc.org)를 읽어야합니다.


샘플에서 "-d 1.2.3.4/0"을 "-d 1.2.3.4/332"또는 "-d 1.2.3.4"로 대체
Christian

5

귀하의 예에서 모든 IP가 동일한 네트워크에 있지 않기에는 너무 가깝습니다.

실제로 멀티 호밍 중이고 단순히 4 개의 IP 별칭이없는 것이 확실합니까?

후자의 경우 다음과 비슷한 경로로 소스 IP를 설정할 수 있습니다

/ sbin / ip route show 192.168.222.0/24 dev eth0 프로토 커널 범위 링크 src 192.168.222.178 169.254.0.0/16 dev eth0 범위 링크 기본값은 192.168.222.1 dev eth0

sudo / sbin / ip 경로는 192.168.222.1 src 192.168.222.178을 통해 기본값을 바꿉니다.

/ sbin / ip route show
192.168.222.0/24 dev eth0 프로토 커널 범위 링크 src 192.168.222.178 169.254.0.0/16 dev eth0 범위 링크 기본값은 192.168.222.1 dev eth0 src 192.168.222.178

재부팅 사이에 인터페이스를 유지하는 방법에 대해서는 man 인터페이스를 참조하십시오.


당신이 올바른지. 아마도 멀티 호밍이라는 용어를 잘못 사용하고있을 것입니다. 데이터 센터는 모두 동일한 서브넷에 4 개의 IP 주소를 제공합니다.
Joe Holloway

질문을 편집 할 수 있다는 것을 알고 있습니까?
hayalci

5

특정 라우팅이 다른 라우팅을 사용하도록 지시하지 않는 한 라우팅 테이블에있는 기본 게이트웨이를 사용합니다. route -n

편집 : 나는 당신의 질문을 너무 빨리 읽은 것 같습니다 ...

수동 모드를 사용하고 클라이언트가 항상 연결을 시작하므로 IP 헤더의 src ip 필드는 항상 클라이언트가 연결된 IP로 나타납니다. 서버가 활성 모드 인 경우 연결을 시작하는 경우 항상 '기본'IP라고 생각합니다. 주소가 동일한 서브넷에있는 경우, Linux는 첫 번째 주소를 '기본'으로 추가하고 다른 주소는 보조로 만듭니다.

나는 완전히 확신하지 못합니다 .tcpdump -n을 실행하고 그것이 src IP로 보이는 것을 볼 것입니다.

EDIT2 : 좋아, 나는 서버를 실행하고 있다는 관점에서 위의 내용을 썼다. 그래서 당신은 클라이언트이고 연결을 시작하기 때문에 항상 기본 IP 주소에서 오는 것처럼 보일 것이라고 생각하지만 다시 시도하고보십시오. tcpdump로.


라우팅 테이블은 기본값이며 서브넷은 하나뿐입니다. 또 다른 포스터는 멀티 호밍이라는 용어를 잘못 사용했다고 지적했습니다. 그러나 여전히 eth0 별칭을 사용할 것으로 기대합니다. wget을 사용하여 whatsmyip.net 을 다운로드 했으며 대신 eth0 : 0을 사용하고 있음을 보여줍니다.
Joe Holloway

whatsmyip.net은 공개 IP를 보여 주어야합니다.
Kyle Brandt

나는 그것이 eth0를와 연관된 개인 IP에 NAT-에드 공용 IP 주소를 보여 기대하는 반면, 0 : 더 명확하게하기 위해, NAT-에드 eth0를와 연관된 개인 IP에있는 공용 IP 주소를 표시합니다
Joe Holloway

1
이 답변은 너무 많이 찬성되었으며 많은 수정 사항을 포함하고 많은 것을 혼동하고 도움이되지 않습니다. tbman과 jknapka의 답변은 훌륭하고 나에게 많은 도움이되었습니다.
Christian

4

FTP 작업에 연결에 사용할 인터페이스를 지정하는 방법이 없다면 기본적으로 관련 서브넷의 첫 번째 물리적 인터페이스 (이 경우 eth0)로 설정됩니다. 서로 다른 서브넷에 두 개의 NIC가있는 서버가있는 경우 라우팅 테이블을 기반으로 사용할 인터페이스를 파악합니다.

동일한 서브넷에 시스템에 하나의 물리적 인터페이스 (eth0)와 4 개의 가상 / 별칭 (eth0 : 0 ~ eth0 : 2) 만 있으므로 아웃 바운드 트래픽은 응용 프로그램이 충분히 똑똑하지 않은 한 소스로 eth0 IP 주소를 사용합니다. 아웃 바운드 인터페이스를 선언합니다.


2
이것은 내 가정이지만 모든 테스트에서 소스로 eth0 : 0을 사용하고 있음을 나타냅니다.
Joe Holloway

그런 다음 기본 경로가 eth0 : 0 인터페이스를 사용하도록 구성되었을 수 있습니다. 이더넷 브리지를 사용하는 설치가 있으며 기본 경로에 가상 브리지 인터페이스를 사용하도록 구성되었습니다.
sysadmin1138

다른 컴퓨터에 간단한 프로그램을 설정하여 연결을받은 IP를 인쇄했습니다. nc -s <ip of eth0:2>netcat이 bind(2)전에 수행 했음에도 불구하고 소스 주소 또는 항상 표시되는 모든 것에 연결하면 실제로는 eth0 : 0의 ip입니다 connect(2). 따라서 컴퓨터에 여러 소스 주소에서 연결하는 기능을 제공하는 데 별칭이 작동하지 않는 것 같습니다.
Peter Cordes

4

다음과 같이 ip route get 명령이 사용할 장치 및 src ip 주소를 확인할 수 있습니다.

$ /sbin/ip route get 1.1.1.1
1.1.1.1 via 2.2.2.2 dev eth0  src 2.2.2.2 
    cache  mtu 1500 advmss 1460 hoplimit 64

별칭 환경에서 이것을 시도하지 않았지만 이것이 도움이되기를 바랍니다.


1

아웃 바운드 연결을 설정할 때 서버는 라우팅 테이블에서 네 가지 인터페이스 중 사용할 인터페이스를 결정합니다. TCP 연결에는 종료 인터페이스의 소스 IP가 있습니다.

netstat -rn

라우팅 테이블의 출력을 제공합니다. 연결하려는 클라이언트 IP와 일치하는 특정 항목을 찾으십시오. 존재하지 않는 경우 기본 경로 (0.0.0.0, 마스크 0.0.0.0)를 사용하게됩니다. 기본 경로가 여러 개인 경우 가장 저렴한 경로가 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.