외부 인터페이스로 로컬 IP 트래픽 강제


30

예를 들어 원하는대로 구성 할 수있는 여러 인터페이스가있는 머신이 있습니다.

  • eth1 : 192.168.1.1
  • eth2 : 192.168.2.2

다른 인터페이스를 통해이 로컬 주소 중 하나로 전송 된 모든 트래픽을 전달하고 싶습니다. 예를 들어, 192.168.1.1의 iperf, ftp, http 서버에 대한 모든 요청은 내부적으로 라우팅 될뿐만 아니라 eth2를 통해 전달되어야합니다 (그리고 외부 네트워크는 패킷을 eth1로 다시 라우팅하는 것을 처리합니다).

iptables, ip route 등과 같은 여러 명령을 시도하고 보았지만 아무것도 작동하지 않았습니다.

내가 얻을 수있는 가장 가까운 행동은 다음과 같습니다.

ip route change to 192.168.1.1/24 dev eth2

내부적으로 라우팅되는 192.168.1.1을 제외하고 eth2에서 모든 192.168.1.x를 보냅니다. 그런 다음 eth1의 가짜 192.168.1.2로 향하는 모든 트래픽의 NAT 전달을 내부적으로 192.168.1.1로 다시 라우팅 할 수 있습니까? 실제로 iptables로 어려움을 겪고 있지만 너무 힘든 일입니다.

이 설정의 목표는 두 대의 PC를 사용하지 않고 인터페이스 드라이버 테스트를 수행하는 것입니다.

나는 리눅스를 사용하고 있지만 Windows로 어떻게하는지 알고 있다면 그것을 구입할 것이다!

편집하다:

외부 네트워크는 eth1과 eth2 사이의 크로스 오버 케이블입니다. 내 컴퓨터에 http 서버가 있다고 가정 해 봅시다. 이제 같은 컴퓨터에서이 서버에 액세스하고 싶지만 TCP / IP 트래픽이이 eth1 / eth2 케이블을 통과하도록하고 싶습니다. 이를 위해 인터페이스를 어떻게 구성해야합니까?


인터페이스 1과 2를 통해 미러링 된 모든 트래픽을 원하지만 다른 라우터에서 인터페이스 2로만 되돌아 오길 원하십니까? 네트워크에서 이상한 일을 할 수 없었습니까? 인터페이스 2에서 트래픽을 방금 삭제 한 다른 시스템으로 미러링 된 트래픽을 보낸 다음 모니터링하거나 가상화 소프트웨어를 사용하여 트래픽을 캡처하는 것이 더 좋습니까? 설명에 뭔가 빠졌을 수도 있습니다.
Bart Silverstrim

eth1의 IP 인 192.168.1.1로 패킷을 생성하려는 것 같습니다. 그러나 리눅스 스택은 그 패킷을 내부적으로 완전히받는 대신에 eth2 (외부 적으로 eth1로 전달 된 다음 리눅스 스택으로 전달 될) 패킷을 강제로 원한다. 이것이 가능한지 잘 모르겠습니다. 네트워크 계층이 주소가 내부 인터페이스임을 감지하면 라우팅 테이블을 살펴볼 이유가 거의 없습니다. 다른 사람이 더 잘 알고있을 것입니다.
PP.

답변:


14

응답 패킷을 볼 수 없으므로 caladona의 답변을 확장했습니다. 이 예의 경우 :

  1. 내 로컬 PC에는 다른 서브넷 192.168.1 / 24 , 192.168.2 / 24 에 NIC가 있습니다.
  2. 두 서브넷에 모두 액세스 할 수있는 외부 라우터 / PC가 있습니다.
  3. 로컬 PC의 NIC를 통해 양방향 트래픽을 보내려고합니다.
  4. 구성에는 각 서브넷에 사용되지 않는 두 개의 IP 주소가 필요합니다.

로컬 PC iptable 경로는 '가짜'IP로 나가는 트래픽을 SNAT 및 DNAT로 설정합니다.

iptables -t nat -A POSTROUTING -d 192.168.1.100 -s 192.168.2.0/24 -j SNAT --to-source      192.168.2.100
iptables -t nat -A PREROUTING  -d 192.168.1.100 -i eth0           -j DNAT --to-destination 192.168.1.1
iptables -t nat -A POSTROUTING -d 192.168.2.100 -s 192.168.1.0/24 -j SNAT --to-source      192.168.1.100
iptables -t nat -A PREROUTING  -d 192.168.2.100 -i eth1           -j DNAT --to-destination 192.168.2.1

규칙은 다음을 수행합니다.

  1. 발신 패킷에서 192.168.2.1 소스를 192.168.2.100으로 다시 작성
  2. 수신 패킷에서 192.168.1.100 대상을 192.168.1.1로 다시 작성
  3. 발신 패킷에서 192.168.1.1 소스를 192.168.1.100으로 다시 작성
  4. 수신 패킷에서 192.168.2.100 대상을 192.168.2.1로 다시 작성

요약하면 로컬 시스템은 이제 주소가 192.168.1.100 및 192.168.2.100 인 '가상'시스템과 통신 할 수 있습니다.

다음으로 로컬 PC가 외부 라우터를 사용하여 가짜 IP에 도달하도록해야합니다. 라우터를 통해 IP로 직접 라우트를 작성하여이를 수행합니다. 패킷을 대상 서브넷의 반대쪽으로 강제로 보내려고합니다.

ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP 
ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP

마지막으로이 모든 기능을 작동 시키려면 외부 라우터가 로컬 PC에서 가짜 IP에 도달하는 방법을 알아야합니다. 시스템에 프록시 ARP를 설정하여 씬을 수행 할 수 있습니다.

echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

이 설정으로 이제 가짜 IP를 로컬 PC의 실제 시스템으로 취급 할 수 있습니다. .1 서브넷으로 데이터를 전송하면 .2 인터페이스에서 패킷이 강제로 제거됩니다. .2 서브넷으로 데이터를 보내면 .1 인터페이스에서 패킷이 강제로 제거됩니다.

ping 192.168.1.100
ping 192.168.2.100

훨씬 더 나은 길! ARP 기능을 작동 시키려면 ip_forward도 필요합니다. echo 1> / proc / sys / net / ipv4 / ip_forward
calandoa

28

Linux에서 다음을 성공적으로 사용하여 "루프백"모드의 새 이중 포트 10Gbps 카드, 즉 한 포트가 다른 포트에 직접 연결되었습니다. 이것은 모두 패킷을 강제로 보내기위한 약간의 부두입니다. 그렇지 않으면 Linux는 커널을 통해 트래픽을 단락시킵니다 (따라서 OP의 문제). 위의 Casey의 답변에서 실제로 외부 라우터가 필요한지 여부는 확실하지 않지만 다음은 완전히 독립적입니다. 두 가지 인터페이스는 eth2와 eth3입니다.

인터페이스에 IP를주고 별도의 네트워크에 배치하십시오.

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

다음으로 이중 NAT 시나리오를 설정합니다. 두 개의 새로운 가짜 네트워크가 다른 네트워크에 도달하는 데 사용됩니다. 도중에 NAT를 가짜 네트워크에 공급하십시오. 도중에 목적지를 수정하십시오. 다른 네트워크의 경우도 마찬가지입니다.

# nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1

# nat inbound 10.60.0.1 -> 10.50.0.1
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1

# nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1

# nat inbound 10.60.1.1 -> 10.50.1.1
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1

이제 시스템에 각 가짜 네트워크에 연결하는 방법을 알려주고 arp 항목을 미리 채 웁니다 (MAC 주소를 대체하고 내 것을 사용하지 마십시오).

ip route add 10.60.1.1 dev eth2
arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address

ip route add 10.60.0.1 dev eth3 
arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address

이것은 실제로 패킷을 와이어에 넣을 정도로 Linux를 바보입니다. 예를 들면 다음과 같습니다.

ping 10.60.1.1

eth2로 이동하면 소스 IP 10.50.0.1은 10.60.0.1로 NAT가되고 eth3으로 도착하면 10.60.1.1은 10.50.1.1로 NAT가됩니다. 답장은 비슷한 여행을합니다.

이제 iperf를 사용하여 처리량을 테스트하십시오. 올바른 IP에 바인딩하고 연락중인 IP (다른 쪽의 가짜 주소)를 확인하십시오.

# server
./iperf -B 10.50.1.1 -s

# client: your destination is the other end's fake address
./iperf -B 10.50.0.1 -c 10.60.1.1 -t 60 -i 10

트래픽이 실제로 전선으로 나가는 지 확인하십시오.

tcpdump -nn -i eth2 -c 500

카드가 사용되고 있는지 확인하기 위해 / proc / interrupts를 볼 수도 있습니다.

while true ; do egrep 'eth2|eth3' /proc/interrupts ; sleep 1 ; done

어쨌든,이 게시물은이 작업을 수행하는 방법을 검색하는 데 도움이되었고 Q & A 직원에게 감사드립니다.이 게시물이 다른 사람이 나중에이 게시물을 찾는 데 도움이되기를 바랍니다.


+1 훌륭한 솔루션-IP 전달을 활성화하지 않아도됩니다! 이것이 바로 지금 필요한 것입니다 (루프백을 통한 10GB 테스트).
Nils

16

항상 그렇듯이-조금 늦었지만 요즘에는 네트워크 네임 스페이스를 사용하여 인터페이스를 격리하고 로컬 전달 (및 iptables :)을 방지 할 수 있습니다.

네임 스페이스를 만듭니다 (모두 필요한 권한으로 수행 (예 : 루트)).

ip netns add ns_server
ip netns add ns_client

인터페이스 상태 / 구성은 이제 할당 된 네임 스페이스의 컨텍스트 내에서 액세스해야하므로 기본 네임 스페이스의 컨텍스트에서 실행되는 기본 IP 링크 를 실행하면 인터페이스 상태가 표시되지 않습니다 . 네임 스페이스 내에서 명령을 실행하면

ip netns exec <namespace-name> <command>

접두사로.

이제 인터페이스에 네임 스페이스를 할당하고 구성을 적용하고 인터페이스를 설정하십시오.

ip link set eth1 netns ns_server
ip netns exec ns_server ip addr add dev eth1 192.168.1.1/24
ip netns exec ns_server ip link set dev eth1 up
ip link set eth2 netns ns_client
ip netns exec ns_client ip addr add dev eth2 192.168.1.2/24
ip netns exec ns_client ip link set dev eth2 up

이제 iperf 서버 실행을 위해 네임 스페이스 내에서 응용 프로그램을 실행할 수 있습니다.

ip netns exec ns_server iperf -s -B 192.168.1.1

그리고 클라이언트 :

ip netns exec ns_client iperf -c 192.168.1.1 -B 192.168.1.2

이제 전체 네트워크 스택, 인터페이스, 라우팅 ...이 네임 스페이스에 의해 격리되어 커널이 트래픽에 사용 된 주소를 로컬 (사용 가능한) 인터페이스와 일치시킬 수 없으므로 트래픽이 물리적 인터페이스를 통해 전송됩니다.

실험을 마치면 네임 스페이스를 삭제하면됩니다.

ip netns del <namespace-name>

인터페이스가 기본 네임 스페이스에 다시 할당되고 네임 스페이스 내에서 수행 된 모든 구성이 사라집니다 (예 : 할당 된 IP 주소를 삭제할 필요가 없음).


이것은 제안 된 더블 낫 마법보다 훨씬 간단하며 네트워크상의 다른 컴퓨터와의 조정이 필요하지 않으며 물리적 토폴로지를 가정하지 않습니다. 내 유일한 요청은 경로를 추가하는 명령을 추가하는 것입니다.
허클

2

좋아, 마침내 구성 설정에 성공했습니다.

아이디어는 다른 가짜 주소를 사용하여이 가짜 주소의 경로를 인터페이스 2로 강제 설정 한 다음 NAT / iptables를 사용하여 실제 주소 2로 가짜 주소를 변환하는 것입니다.

내 설정은 실제로 IF1 (인터페이스 1)과 IF2 사이에 텔넷 할 수있는 하나의 라우터로 구성됩니다.

내 설정에서 FAKE_ADDR과 IF1_ADDR은 동일한 서브넷에 있습니다.

ifconfig $IF1 $IF1_ADDR netmask 255.255.255.0
ifconfig $IF2 $IF2_ADDR netmask 255.255.255.0

iptables -t nat -A PREROUTING -d $FAKE_ADDR -i $IF2 -j DNAT --to-destination $IF2_ADDR
iptables -t nat -A POSTROUTING -s $IF2_ADDR -d $IF1_ADDR/24 -j SNAT --to-source $FAKE_ADDR

route add $FAKE_ADDR gw $ROUTER_ADDR

그리고 라우터에서 :

route add $FAKE_ADDR gw $IF2_ADDR

FAKE_ADDR에 무언가를 보내면 pkt가 IF1을 통해 라우터로 전달되고 다시 IF2로 전달되고 FAKE_IP가 IF2_ADDR로 대체됩니다. 패킷은 서버에 의해 처리되고 결과는 FAKE_ADDR로 대체 된 IF2_ADDR에서 IF1_ADDR로 다시 전송됩니다.

하나의 크로스 오버 케이블로 더 간단한 구성을 사용하는 것이 가능할 수도 있지만 시도하지 않았으므로 작업 솔루션을 선호합니다.


라우터가 $ FAKE_ADDR을 $ IF2_ADDR로 보내는 경우 DNAT 규칙이 "-i $ IF1"대신 "-i $ IF2"가 아니어야합니까?
cmcginty

당신은 옳은 케이시입니다.
calandoa

1

Thomas Tannhäuser의 위의 답변은 바로 그 자리에있었습니다!

비슷한 상황이 발생했습니다. 두 개의 enet 인터페이스가있는 단일 시스템입니다. 내 계획은 하나의 인터페이스를 서버 (수신자)로 사용하고 다른 인터페이스를 클라이언트 (발신자)로 사용하는 것이 었습니다. 각 인터페이스는 라우터에 연결되며 iperf는 라우터를 통해 트래픽을 유도하여 처리량, PPS, 지연 등을 측정합니다.

불행히도 iptables 접근 방식은 직관적이지 않았으며 문제가있었습니다. 몇 시간의 좌절 끝에, 나는이 공격 계획을 포기했다. Thomas의 제안에서 영감을 받아 Linux IP 네임 스페이스에 대해 약간의 숙제를했고이 솔루션의 단순성과 우아함에 감사하기 시작했습니다.

다음은이 용량을 제공하도록 Fedora FC26을 구성하는 데 사용한 정확한 명령 목록입니다. 두 인터페이스는 enp1s0 및 enp3s0입니다. 라우터에는 주소가 192.168.2.112 및 172.16.16.2 인 두 개의 인터페이스가 있습니다. 각 FC26 ENET 커넥터는 해당 라우터 인터페이스에 직접 케이블로 연결되어 있습니다.

# How to configure the IP Namespaces
ip netns add iperf-server
ip netns add iperf-client
ip link set enp1s0 netns iperf-server
ip link set enp3s0 netns iperf-client
ip netns exec iperf-server ip addr add dev enp1s0 192.168.2.139/20
ip netns exec iperf-client ip addr add dev enp3s0 172.16.16.2/24
ip netns exec iperf-client ip link set dev enp3s0 up
ip netns exec iperf-server ip link set dev enp1s0 up
ip netns exec iperf-server route add default gw 192.168.2.112
ip netns exec iperf-client route add default gw 172.16.16.1

# Test the interfaces and network using ping
ip netns exec iperf-client ping -c1 172.16.16.1
ip netns exec iperf-server ping -c1 192.168.2.112
ip netns exec iperf-server ping -c1 172.16.16.2
ip netns exec iperf-client ping -c1 192.168.2.139

# Start Iperf Server for UDP test
ip netns exec iperf-server iperf -u -s
# Run Client against Iperf server for UDP test
ip netns exec iperf-client iperf -u -c 192.168.2.139

0

리눅스 박스를 라우터 / 브리지 / 게이트웨이 / 방화벽 타입 박스로 바꾸고 싶은 것 같습니다. 다음 리소스가 원하는 것일 수 있습니다.

리눅스 라우터 프로젝트

라우터 또는 방화벽 배포 목록

리눅스 LiveCD 라우터

리눅스 저널-리눅스 라우터

추가 정보를 기반으로 업데이트 :

나는 당신이 원하는 것을 할 수 있다고 생각하지 않습니다. OS는 항상 내부 라우팅 테이블을 살펴보고 두 IP 주소를 로컬로 '확인'합니다. 그런 다음 OS 내에서 트래픽을 라우팅하고 유선으로 연결하지 않습니다. 두 번째 머신 또는 두 개의 가상 머신이 필요합니다 ( Xen 확인 ).


0

여기에 많은 것들이 있으므로 정확성을 완전히 보장 할 수는 없지만 원래 질문은 "자기에게 보내기"기술을 찾는 것 같습니다 . 링크 된 검색은 내가 가장 많이 유지 관리하는 커널 패치 인 톱 링크 + 토론 및 다양한 메일 링리스트에 대한 다른 접근 방식의 패치 로 생각합니다 . LKML.

iproute2의 "ip netns"로 수행 된 네트워크 네임 스페이스 도 살펴 봐야한다고 생각합니다 . 이것은 또한 추가 인터페이스와 라우팅 마법을 필요로하므로 다른 답변의 거대한 iptables hoopla보다 덜 복잡하지 않을 수도 있습니다.

의견이 누군가가 이것들에 유용한 것을 발견했다면-어떻게, 무엇을, 구현에 관한 장소를 환영합니다.



-1

여기 내가 IPV6에서 작동하게하는 방법입니다

할당 된 고정 IP

/sbin/ifconfig eth1 inet6 add 2001:db8::1/127 
/sbin/ifconfig eth3 inet6 add 2001:db8::2/127 

"FAKE"주소로 호스트 전용 경로 설정

ip -6 route add 2001:db8::2/128 dev eth1 metric 1
ip -6 route add 2001:db8::1/128 dev eth3 metric 1

이웃과 같은 이웃 테이블을 채웠습니다 ...

ip -6 neighbor add 2001:db8::1 lladdr 90:e2:ba:0d:75:e8 dev eth3 # eth1's mac address
ip -6 neighbor add 2001:db8::2 lladdr 90:e2:ba:0d:75:e9 dev eth1 # eth3's mac address

ip6tables 항목 추가

ip6tables -t nat -A POSTROUTING -s 2001:db8::1 -d 2013::2 -j SNAT --to-source 2001:db8::1
ip6tables -t nat -A PREROUTING -d 2001:db8::1 -j DNAT --to-destination 2001:db8::1
ip6tables -t nat -A POSTROUTING -s 2001:db8::2 -d 2013::1 -j SNAT --to-source 2001:db8::2
ip6tables -t nat -A PREROUTING -d 2001:db8::2 -j DNAT --to-destination 2001:db8::2

어떤 배포판을 사용하고 있습니까? 마지막으로 확인했을 때 커널에는 IPv6에 대한 NAT 테이블이 없습니다.
fukawi2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.