단일 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에 버그가 있는지 또는 순진한 이해가 있는지 알 수 있도록 약간의 통찰력을 얻으려고합니다. 모든 조각들이 어떻게 어울리는 지
감사
답변
기본적으로 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)를 읽어야합니다.
답변
귀하의 예에서 모든 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 인터페이스를 참조하십시오.
답변
특정 라우팅이 다른 라우팅을 사용하도록 지시하지 않는 한 라우팅 테이블에있는 기본 게이트웨이를 사용합니다. route -n
편집 : 나는 당신의 질문을 너무 빨리 읽은 것 같습니다 …
수동 모드를 사용하고 클라이언트가 항상 연결을 시작하므로 IP 헤더의 src ip 필드는 항상 클라이언트가 연결된 IP로 나타납니다. 서버가 활성 모드 인 경우 연결을 시작하는 경우 항상 ‘기본’IP라고 생각합니다. 주소가 동일한 서브넷에있는 경우, Linux는 첫 번째 주소를 ‘기본’으로 추가하고 다른 주소는 보조로 만듭니다.
나는 완전히 확신하지 못합니다 .tcpdump -n을 실행하고 그것이 src IP로 보이는 것을 볼 것입니다.
EDIT2 : 좋아, 나는 서버를 실행하고 있다는 관점에서 위의 내용을 썼다. 그래서 당신은 클라이언트이고 연결을 시작하기 때문에 항상 기본 IP 주소에서 오는 것처럼 보일 것이라고 생각하지만 다시 시도하고보십시오. tcpdump로.
답변
FTP 작업에 연결에 사용할 인터페이스를 지정하는 방법이 없다면 기본적으로 관련 서브넷의 첫 번째 물리적 인터페이스 (이 경우 eth0)로 설정됩니다. 서로 다른 서브넷에 두 개의 NIC가있는 서버가있는 경우 라우팅 테이블을 기반으로 사용할 인터페이스를 파악합니다.
동일한 서브넷에 시스템에 하나의 물리적 인터페이스 (eth0)와 4 개의 가상 / 별칭 (eth0 : 0 ~ eth0 : 2) 만 있으므로 아웃 바운드 트래픽은 응용 프로그램이 충분히 똑똑하지 않은 한 소스로 eth0 IP 주소를 사용합니다. 아웃 바운드 인터페이스를 선언합니다.
답변
다음과 같이 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
별칭 환경에서 이것을 시도하지 않았지만 이것이 도움이되기를 바랍니다.
답변
아웃 바운드 연결을 설정할 때 서버는 라우팅 테이블에서 네 가지 인터페이스 중 사용할 인터페이스를 결정합니다. TCP 연결에는 종료 인터페이스의 소스 IP가 있습니다.
netstat -rn
라우팅 테이블의 출력을 제공합니다. 연결하려는 클라이언트 IP와 일치하는 특정 항목을 찾으십시오. 존재하지 않는 경우 기본 경로 (0.0.0.0, 마스크 0.0.0.0)를 사용하게됩니다. 기본 경로가 여러 개인 경우 가장 저렴한 경로가 사용됩니다.