[asterisk-dev] directmediapermit/deny doesn't work in any way approaching correct for any Asterisk version and is poorly named, so we should rework it in trunk
Mark Michelson
mmichelson at digium.com
Wed May 2 13:44:43 CDT 2012
On 05/02/2012 01:09 PM, Jonathan Rose wrote:
> None of us really know how this feature ended up going through quite as dysfunctional as it was. Here is a summary:
>
> directmediapermit/deny should allow a user to specify host addresses which block and allow the use of certain host addresses with directmedia if it would otherwise be available. Allows supersede denies, so a user could specify something like:
> directmediadeny=0.0.0.0
> directmediapermit=192.168.10.203
> for a peer to allow that peer to use directmedia when making calls only to 192.168.10.203.
This isn't *quite* accurate. It's not that permits supersede denies,
it's that the order that they are specified matters. The setup you just
showed is for a typical whitelist approach. Another way is to use a
blacklist approach like:
directmediapermit=0.0.0.0/0
directmediadeny=192.168.10.203/32
With this setup, you would initially permit everything, but the deny
specified afterwards would supersede the previously established behavior
of allowing everything.
> Meanwhile any calls to/from another host should keep Asterisk in the RTP path.
>
> Unfortunately, that isn't what it does right now at all.
>
> Currently, the permit/deny lists are only used for to the peer they are set for (calls coming from the peer aren't checked against that peer's permit/deny list at all)
This sentence is kind of hard to parse. If I understand you correctly, a
peer's directmedia ACL is only checked if the call originates from the
peer, correct? Both peers should have their directmedia ACLs checked
based on what I see in ast_rtp_instance_bridge() in main/rtp_engine.c.
ast_get_rtp_info() is called for both channels in the bridge, therefore
it should not matter if the peer is the originator or recipient of the call.
> and to make matters even more ridiculous, the address that is compared against the permit/deny list is the address belonging to the peer the list was set for. To simplify, on directmedia will be blocked in all cases where the peer has blocked itself from callid and it will be allowed for all cases where it has permitted itself for callid. This basically makes this a completely useless feature.
Yes, this is a glaring error. Peer B's media address should be run
through Peer A's directmedia ACL and vice versa. The current approach
does not work because only one endpoint is passed to the get_rtp_info()
callback.
> This feature has never worked at any time since it was committed, so the current plan is to redesign the feature in trunk with a new name to the options (currently looking at directmediareachable/unreachable) and simply mark the option as broken in 1.8 and 10. If anyone has any commentary about this, I'm all ears.
I think that if at all possible, the option should be fixed in 1.8 and
10, even if it never actually worked. It was supposed to work, people
expect it to work, and so we should go to the effort to make it work.
Your approach for the release branches can differ from your plan for
trunk to minimize invasiveness. Outline your suggested method of solving
the problem and we can give feedback for whether the approach is usable
for 1.8 and 10.
I don't think the feature necessarily has to be redesigned for trunk
(i.e. I don't see a good reason to rename the option). Can't you just
make it so the directmediapermit and directmediadeny options do what
they are documented to do?
Mark!
More information about the asterisk-dev
mailing list