kohler / click

The Click modular router: fast modular packet processing and analysis
Other
734 stars 324 forks source link

How to make the packet forward hop by hop #480

Open Memtwo opened 3 years ago

Memtwo commented 3 years ago

Hello! I am learning how to use click to forward packets.I want the packet forward hop by hop like node1 to node2, then node2 to node3. My setup is as follows: I have three different nodes in the order below, each running a different click configuration Node1 (source) --> Node2(forward) --> Node3 (sink)

Three nodes' information is as follows: Node1 ens33:192.128.32.128 00:0c:29:92:68:92 ; ens38:192.168.32.129 00:0c:29:92:68:9c Node2 ens33:192.168.32.130 00:0c:29:57:e6:e1 ; ens38:192.168.32.131 00:0c:29:57:e6:eb Node3 ens33:192.168.32.132 00:0c:29:db:6e:56 ; ens38:192.168.32.133 00:0c:29:db:6e:60

Node1: Source.click

FastUDPSource(800000, -1, 60, 00:0c:29:92:68:92, 192.168.32.128, 1234, 00:0c:29:db:6e:56, 192.168.32.132, 1234) ->IPPrint("Hello") ->ToDevice(ens33);

Node2: Forward.click

FromDevice(ens38, PROMISC true) -> Queue -> ToDevice(ens33);

Node3: Sink.click

FromDevice(ens33, PROMISC true) -> c:: Counter -> Discard; Script(wait 10, print c.rate, loop);

I can see the result on node3. I use tcpdump on node2 and can see the packet 192.168.32.128.1234 > 192.168.32.132.1234. However, I don't know whether the packet sent to node3 from node1 hop by hop or node1 sent packets both to node2 and node3 like broadcast. How can I make sure it is hop by hop which node1 send packet to node2, then node2 send packet to node3

tbarbette commented 3 years ago

You can add a Print on node2 to verify. Also in Node1 you target the DST mac address of Node 3 so I doubt you hop through node2 indeed. Node 2 should have an EtherRewrite element to handle mac properly (or ARPQuerier ecosystem). If you're using userlevel mode Click, you'll want SNIFFER false parameter in your FromDevice to avoid packets being routed in the linux stack too.

Memtwo commented 3 years ago

You can add a Print on node2 to verify. Also in Node1 you target the DST mac address of Node 3 so I doubt you hop through node2 indeed. Node 2 should have an EtherRewrite element to handle mac properly (or ARPQuerier ecosystem). If you're using userlevel mode Click, you'll want SNIFFER false parameter in your FromDevice to avoid packets being routed in the linux stack too.

Thanks! Do you mean I should first set DST to node2, then on node2 use EtherRewrite element and set it to node3?

tbarbette commented 3 years ago

Do you mean I should first set DST to node2, then on node2 use EtherRewrite element and set it to node3?

Well, if they're connected to a switch, how would the switch know packets should go to node 2 if you set the address of node 2? A beauty of Click imo is that the magic of networking disappears. Packets do exactly what you ask them to do :)

ahenning commented 3 years ago

How can I make sure it is hop by hop which node1 send packet to node2, then node2 send packet to node3

Physically connect the ethernet cables from node1 to node2 and from node2 to node3

Memtwo commented 3 years ago

How can I make sure it is hop by hop which node1 send packet to node2, then node2 send packet to node3

Physically connect the ethernet cables from node1 to node2 and from node2 to node3

Thanks, but I do this on VM

Memtwo commented 3 years ago

Sorry since I am nearly newbie to click, I really don’t know how to modify it. May I trouble you to give me a more specific configuration example?

xt1234567 commented 2 years ago

Sorry since I am nearly newbie to click, I really don’t know how to modify it. May I trouble you to give me a more specific configuration example?

hello, i also encountered this trouble, If you solve it, can you share your experience,thank you!

tbarbette commented 2 years ago

If it's about VM configuration to make the hop-by-hop wiring, it depends on your hypervisor, not Click.

xt1234567 commented 2 years ago

If it's about VM configuration to make the hop-by-hop wiring, it depends on your hypervisor, not Click.

Thank you for your answer, i used EtherRewrite then it can work correctly. But I have another question,click send the packets by ToDevice(),and it seems to skip iptables rules so that i can't achieve SNAT on my hypervisor. How can I make it work?Thanks!

tbarbette commented 2 years ago

If you use Click for packet processing you have to use it for everything. Do the SNAT inside Click, not with IPTables. Or use a virtual interface in ToDevice and then add an SNAT

xt1234567 commented 2 years ago

If you use Click for packet processing you have to use it for everything. Do the SNAT inside Click, not with IPTables. Or use a virtual interface in ToDevice and then add an SNAT

I got it. Thanks!