On 02/09/2022 14:03, Luis Thomas wrote:
Hi everyone,
We are using both dnsmasq and isc dhcrelay as dhcp-relays for dhcpv6
only.
we launch dnsmasq like this:
dnsmasq -d \
--conf-file=/dev/null \
--dhcp-relay fd12:3456::b6e3:f9ff:fea5:fa5b,2020:abcd::1 \
--except-interface=lo \
--interface=tun0,eno2 \
--port 0
and isc dhcrelay like this:
dhcrelay -d -6 -l tun0 -u 2020:abcd::1%eno2 --no-pid
tun0 address is fd12:3456::b6e3:f9ff:fea5:fa5b.
eno2 address is 2020:abcd::2.
With dnsmasq the source address of the relay-forward packets is the
address of tun0.
With dhcrelay the source address of the relay-forward packets is the
address of eno2.
We don't really understand why it so on dnsmasq (or dhcrelay for that
matter), could someone explain it to us ? RFC 3315 section 20. Relay
Agent Behavior says nothing about the source address.
In our use case it makes more sense that the source address of the
relay-forward packet is the address of eno2 since it's the outbound
interface (and the one that will receive the replies).
Nevertheless the attached patch fixes this issue as it sets the source
address of relay-forward packets to be the address of the "upper"
interface.
We've also attached two filtered pcap files of a wireshark capture
showing the difference before and after the patch on the machine
hosting the dhcp server and the machine hosting the dhcp_relay.
Regards,
Hmm,
Looking at the code, I obviously intended the current behaviour: there's
a comment to that effect /* source address == relay address */ and the
code goes to the effort of setting up the source address and calling
send_from() which supplies that to the kernel.
The question, therefore, is why? I think this probably a carry-over from
DHCPv4, where the "giaddr" field is overloaded to specify the subnet on
which the client resides, and the global address of the relay. It's also
the case that a configured V4 client communicates directly with the
server, bypassing the relay , so the server has to have a route to the
client-side subnet of the relay in all cases.
DHCPv6 is not the same: the relay is always involved in client-server
communication; it's actually a proxy, not a relay, so the need for the
server to have a route to the client-side is no longer there and it
makes more sense for the server to use the server-side address to return
messages to the client.
You're right that RFC3315 is silent on this, and so is RFC8415, as far
as I can see. Googling did find
https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9500/software/release/16-8/configuration_guide/sec/b_168_sec_9500_cg/b_168_sec_9500_cg_chapter_0101000.pdf
and
https://techhub.hpe.com/eginfolib/networking/docs/switches/5710/5200-4993_l3-ip-svcs_cr/content/517706420.htm
both of which state that the default is the server-side interface
address. Of course, the behaviour of ISC code is a strong push in the
same direction.
TLDR; I think the behaviour change you want is correct. I understand why
the patch you submitted went for minimal-change, but I'd like to go for
maximum-simplification instead, removing the calculation of the address
on "from" and the call to send_from(). I will push that in the next day
or two.
Cheers.
Simon.
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss