我有一台机器,可以根据需要configuration多个接口,例如:
我想转发所有通过其他接口发送到这些本地地址之一的stream量。 例如,所有对192.168.1.1的iperf,ftp,http服务器的请求都不应该只是在内部路由,而是通过eth2转发(外部networking将负责将数据包重新路由到eth1)。
我试着看了几个命令,如iptables,ip route等…但没有任何工作。
我能得到的最接近的行为是:
ip route change to 192.168.1.1/24 dev eth2
在eth2上发送所有192.168.1.x,除了192.168.1.1仍然在内部路由。 可能我可以做NAT转发的所有stream量在eth1上伪造192.168.1.2,重新路由到192.168.1.1内部? 实际上我正在用iptables挣扎,但对我来说太困难了。
这个设置的目标是在不使用两台PC的情况下进行接口驱动程序testing。
我正在使用Linux,但是如果您知道如何使用Windows,我会购买它!
外部networking只是eth1和eth2之间的交叉电缆。 假设我在我的机器上有一个http服务器。 现在我想从同一台机器上访问这个服务器,但是我想强制TCP / IP通信通过这个eth1 / eth2电缆。 我应该如何configuration我的界面呢?
由于看不到响应数据包,我扩展了caladona的答案。 对于这个例子:
本地PC iptable路由被设置为SNAT和DNAT输出stream量到“假”IP。
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
规则做到以下几点:
总而言之,本地系统现在可以与地址为192.168.1.100和192.168.2.100的“虚拟”机器通信。
接下来,您必须强制您的本地PC使用外部路由器来访问您的假IP。 您可以通过路由器创build到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
我在Linux上成功地使用了以下内容来testing新的双端口10Gbps卡在“环回”模式下的吞吐量,也就是说,一个端口直接插入另一个端口。 这只是一个巫术,只是为了强制数据包传输,但是如果不这样做,Linux只会使内核stream量短路(因此OP的问题)。 在上面的Casey的回答中,我不确定是否有必要有一个外部路由器或以上,但以下是完全独立的。 这两个接口是eth2和eth3。
将IP提供给接口,并将它们放在不同的networking上:
ifconfig eth2 10.50.0.1/24 ifconfig eth3 10.50.1.1/24
接下来,我们将build立一个双重的NAT场景:两个新的虚假networking用于达到另一个。 在出路的过程中,将NAT转换为您的假networking。 在途中,修复目的地。 反之亦然的其他networking:
# 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
现在告诉系统如何到达每个假networking,并预先填充ARP条目(一定要replace你的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得到NAT到10.60.0.1,并且当它进入eth3时,目的地10.60.1.1得到NAT到10.50.1.1。 答案也是一样的。
现在使用iperf来testing吞吐量。 绑定到正确的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
无论如何,我发现这个post寻找如何做到这一点,感谢问答人员,并希望这有助于任何人在未来find这个职位。
像往常一样 – 我有点晚 – 但现在可以使用networking命名空间来隔离接口,并防止任何本地转发(和iptables :)摆弄)。
创build名称空间(全部使用必需的权限完成,例如以root身份):
ip netns add ns_server ip netns add ns_client
请注意,接口状态/configuration现在必须在分配的命名空间的上下文中访问 – 所以如果您运行一个裸IP链接,因为它在默认名称空间的上下文中运行,它们将不会出现。 在名称空间内运行命令可以使用
ip netns exec <namespace-name> <command>
作为前缀。
现在为命名空间分配接口,应用configuration和设置接口:
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
现在stream量将通过物理接口发送,因为整个networking堆栈,接口,路由…被命名空间隔离,所以内核无法将stream量中使用的地址与本地(可用)接口匹配。
如果你已经完成了你的实验,只需删除命名空间:
ip netns del <namespace-name>
接口将被重新分配到默认名称空间,并且名称空间内完成的所有configuration消失(例如,不需要删除分配的IP地址)。
好的,我终于成功地设置了我的configuration。
这个想法是使用另一个虚拟地址,强制这个虚拟地址的路由到接口2,然后用NAT / iptables翻译虚拟地址与真实地址2。
我的设置实际上是由一个路由器组成的,我可以在IF1(接口1)和IF2之间telnet
在我的设置中,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_ADDRreplace。 数据包由服务器处理,结果从IF2_ADDR发送回IF1_ADDR,由IFKE_ADDR取代。
也许可以使用一个简单的configuration只有一个交叉电缆,但因为我没有尝试,我宁愿给我的工作解决scheme。
这听起来像你想把你的linux的盒子变成一个路由器/网桥/网关/防火墙types的框。 以下资源可能是您正在寻找的内容:
Linux路由器项目
路由器或防火墙分发列表
Linux LiveCD路由器
Linux杂志 – Linux路由器
根据更多信息更新:
我不认为你将能够做到你想要的。 操作系统总是要查看其内部路由表,并在本地“查看”两个IP地址。 然后它将在OS内部路由stream量,并且不会将其放在电线上。 您将需要第二台机器或两台虚拟机(检查Xen )。
很多东西要经过这里,所以我不能完全保证我的准确性,但是原来的问题似乎在寻找所谓的“自我发送”技术 。 链接search显示我认为是最好的维护内核补丁作为顶级链接+讨论和其他方法在各种邮件列表上的补丁,特别是。 LKML。
我想也应该看一下networking命名空间 ,用iproute2的“ip netns”完成 。 这也需要一些额外的接口和路由魔法,因此可能不会比其他答案中的大规模iptables hoopla复杂。
如果有人发现有用的东西 – 如何,什么,在哪里实施,评论绝对欢迎。
检查这篇文章。 这里提到了使用NAT转发来访问虚拟机虚拟机的详细步骤。
http://jackal777.wordpress.com/2012/02/13/virtualbox-host-only-networking-nat-for-internet-access/
上面ThomasTannhäuser给出的答案是现货!
我也有类似的情况:一台机器有两个enet接口。 我的计划是使用一个接口作为服务器(接收器),另一个作为客户端(发送者)。 每个接口都将连接到路由器,iperf将通过路由器驱动stream量来测量吞吐量,PPS,延迟等。
不幸的是,iptables的方法是非直观的,充满了问题。 几个小时后,我放弃了这个攻击计划。 受托马斯build议的启发,我在Linux IP Namespaces上做了一些小作业,并开始欣赏这个解决scheme的简单和高雅。
下面是我用来configuration我的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
这里是我如何得到IPV6的工作
分配静态ips
/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
填充邻居表…就像arp
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