Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for central servers behind NAT #954

Merged
merged 3 commits into from
Feb 7, 2021

Conversation

hoffie
Copy link
Member

@hoffie hoffie commented Feb 4, 2021

It is currently not possible to run a central server + slaves behind NAT and have external clients connect to such servers (#888). This is due to the fact that a the central server will only know the slave server's internal IP address. It will therefore also hand out this internal IP address to external clients. External clients will then fail to connect.

This PR solves this via two server-side modifications. No protocol changes or client modifications are necessary.

  1. Add a new command line flag --serverpublicip. This flag can be used by slave servers to specify their external IP address which is reported in the slave server registration message to the central server.
  2. Extend the server list logic: If a request by a non-local client comes in, the IP address of the returned slave servers is run through an additional check. If an entry's IP is an internal IP, we know it won't work for the external client. We therefore check the "alternative" IP of the slave server entry (which comes from --externalserverip). If this is a public IP, we use this instead.

@genesisproject2020 initially requested this feature and tested the approach taken in this PR. This code is slightly modified/cleaned up (flag name changed), so it would be cool if you could retest and report back in this PR.

@@ -814,6 +830,9 @@ QString UsageArguments ( char **argv )
" -u, --numchannels maximum number of channels\n"
" -w, --welcomemessage welcome message on connect\n"
" -z, --startminimized start minimizied\n"
" --serverpublicip specify your public IP address when\n"
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you have any other suggestions how the flag should be called, let me know.

src/util.cpp Outdated
Comment on lines 1068 to 1080
QList<QPair<QHostAddress, int>> addresses =
{
QPair<QHostAddress, int>(QHostAddress("10.0.0.0"), 8),
QPair<QHostAddress, int>(QHostAddress("127.0.0.0"), 8),
QPair<QHostAddress, int>(QHostAddress("172.16.0.0"), 12),
QPair<QHostAddress, int>(QHostAddress("192.168.0.0"), 16),
};

int addressesSize = addresses.size();
for ( int iIdx = 0; iIdx < addressesSize; iIdx++ ) {
if (qhAddr.isInSubnet(addresses[iIdx])) {
return true;
}
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have little to zero C++/Qt experience. There may well be better approaches to handle such list-based checks. I'm open to suggestions.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can simplify the loop using Qt's foreach - something like:

foreach ( auto item, addresses ) {
    if ( qhAddress.isInSubset( item ) ) {
        return true;
    }
}

(In new code I'd use standard C++'s range-based for, but Jamulus tends to use Qt's facilities.)

It'd also be good to declare addresses as static constexpr, so it doesn't get constructed anew every time this bit of code runs.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can simplify the loop using Qt's foreach - something like:

Thanks, done!

It'd also be good to declare addresses as static constexpr, so it doesn't get constructed anew every time this bit of code runs.

Hrm, I understand the intention (and was even thinking about such a thing), but constexpr doesn't seem to work (src/util.cpp:1068:54: error: the type 'const QList<QPair<QHostAddress, int> >' of 'constexpr' variable 'addresses' is not literal). Per the docs it only works on literals (which I read as: int, char, etc.?) while I'm using a QList. I have now changed it to just static. Wouldn't this accomplish the same?

@@ -1059,6 +1059,29 @@ QString NetworkUtil::FixAddress ( const QString& strAddress )
return strAddress.simplified().replace ( " ", "" );
}

// Return whether the given HostAdress is within a private IP range
// as per RFC 1918 & RFC 5735.
bool NetworkUtil::IsPrivateNetworkIP ( const QHostAddress &qhAddr )
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is qhAddr the proper naming for a QHostAddress?

@@ -41,7 +42,18 @@ CServerListManager::CServerListManager ( const quint16 iNPortNum,
SetCentralServerAddress ( sNCentServAddr );

// set the server internal address, including internal port number
SlaveCurLocalHostAddress = CHostAddress( NetworkUtil::GetLocalAddress().InetAddr, iNPortNum );
QHostAddress qhaServerPublicIP;
Copy link
Member Author

@hoffie hoffie Feb 4, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is qhaServerPublicIP the proper naming convention?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There generally isn't consistent Microsoft-style class name initial prefixing of variable names. So these aren't inherently "right" (and I bristle against them) but there are enough type-prefixed names in the code to make them not inherently "wrong", either.

@ann0see
Copy link
Member

ann0see commented Feb 4, 2021

Interesting approach.

So there's no way to automatically get the external IP from the slave servers automatically?

Would

CHostAddress NetworkUtil::GetLocalAddress()

work?

I'm not yet sure about security problems which might be introduced by this approach. What would happen if someone intentionally sets a wrong IP?

@hoffie
Copy link
Member Author

hoffie commented Feb 4, 2021

Would

CHostAddress NetworkUtil::GetLocalAddress()

work?

I don't think so because this is the code which runs without my PR. This code can detect the external interface of the machine (i.e. it will yield some 192.168.x, 10.x.y.z, etc. IP), but not the external IP of the network/NAT. To accomplish that automatically, some kind of external "reflector" would be needed such as a web service or using a protocol such as STUN.

I'm not yet sure about security problems which might be introduced by this approach. What would happen if someone intentionally sets a wrong IP?

Yes, setting an intentionally wrong IP could allow one to create misleading server list entries for existing servers (for example). However, this cannot be prevented by not merging the PR. Bad actors could just modify Jamulus themselves or send plain, modified protocol messages using some other means.

@gene96817
Copy link

There are two possible solutions. (a) a solution where the firewall is configured to use addresses and ports determined by the server and (b ) a solution where the firewall and server are independent on each other.
To make (a) work you have to assign port mappings to both the NAT and the server or the server dynamically picks ports and configures the NAT. If you don't have control of the NAT, then STUN can be used. for (b) to function, you could have all connections initiated by the server. Then the outbound initial packet will carry the port assigned by the NAT and the client will have the IP:port pair to send the reverse traffic.

For the inbound traffic to find the right destination, the mapping of the public IP:port pair and then internal IP:port pair has to be known. If the path is initiated by the inbound traffic, then the port mappings have to be predetermined and communicated to the client. If the path is initiated by the outbound traffic, then the NAT can dynamically create the mapping and the remote client only needs to know the public IP:port pair. You can add layers of complication but this is the fundamental machinery for packets crossing the NAT.

I am not able to follow the discussion to know this principle has been handled properly.

@hoffie
Copy link
Member Author

hoffie commented Feb 5, 2021

There are two possible solutions.

I'm not sure I'm following. Are you saying that other techniques should be used instead of the proposed PR? Or are you listing ways for finding out one's own public IP? Or just some generic explanation regarding NAT?

This PR is intended for users who run a central server and one or more slave setups in a private network behind NAT. The NAT has to be set up with proper port forwardings in this case. @genesisproject2020 can probably elaborate what his setup looks like exactly.

When running servers and registering them with a central server,
Jamulus will auto-detect the external IP of the current machine.
However, this will not be a publicly reachable IP when using NAT and a
central server in the same private network.
This means, that the server is inaccessible via that central server.

Therefore, add a new command line option --serverpublicip to override
this auto-detection.

Note: This still requires that proper port forwarding is set up. It also
assumes that ports are forwarded symmetrically, i.e.
	external-ip:22124 -> internal-ip:22124

Required for jamulussoftware#888.

Signed-off-by: Christian Hoffmann <[email protected]>
Previously, the server list handed out the originating address
of a slave server to any client.
A special case was implemented to hand out internal addresses
instead of public addresses when both the slave server and the
client are assumed to be behind the same NAT.

This commit adds another special case for running central servers
and slave servers behind NAT while serving clients from the Internet.
In such a setup, slave servers would only be known by their internal
address to the central server. As such, clients would be served an
internal IP address which they cannot use.

When slave servers make use of the newly added --externalserverip flag,
they can now override their internal IP address with the proper public
IP address.

This commit adapts the server list logic to make use of an IP which is
provided in this way.

Fixes jamulussoftware#888.

Signed-off-by: Christian Hoffmann <[email protected]>
@hoffie hoffie force-pushed the centralserver-behind-nat branch from 7510756 to 4800e05 Compare February 5, 2021 21:57
@genesisproject2020
Copy link
Contributor

Works great!

@genesisproject2020
Copy link
Contributor

genesisproject2020 commented Feb 6, 2021

@ann0see I have a hard time to see that the solution opens upp for a security problem. If someone would like to redirect traffic there is a lot of ways to do that. If someone would redirect the traffic to the "wrong" IP where a server does not answer it will just not work.

The solution makes it possible to build an internal solution and easily make it available to the outside world. I've created a main central server with 4 "sub servers", all within my local network, to be used for a choir to use when practicing so the each group can be by them selves when needed and all see where they are connected. I've asked my groups on my servers to test it and I've got a great response.

One thing that are a prerequisite is that the port forwarding hat to be 1:1 meaning that if you configure the server with port 10000 the same port has to be configured on the outside (external ip:10000 <-> internal ip:10000).

@gene96817 I'm sorry but as I've said before I have a hard time to follow you in this case.

@ann0see
Copy link
Member

ann0see commented Feb 6, 2021

I have a hard time to see that the solution opens upp for a security problem. If someone would like to redirect traffic there is a lot of ways todo that.

Agree. Probably I'm over cautious (there's no encryption either). I don't object this idea, please don't misunderstand me.

Nevertheless, I'd like to hear a few other opinions/ideas since the best way would be automatic external IP detection.

@hoffie
Copy link
Member Author

hoffie commented Feb 6, 2021

the best way would be automatic external IP detection

I certainly think this is possible, but I tried to adhere to KISS principles and attempted to make this as simple as possible. ;)
As said, we could get the external IP from somewhere, for example by using STUN. For reference, here is a quick example from someone who has implemented this in Ruby: https://gist.github.com/bmuller/a1525bd8f7799812867f
We would either have to implement this ourselves or find/include a library which does this.
This would probably also start discussions about auto-detecting changed IP addresses (reconnect of dialup connections, etc.). This is all possible, but would require code which has to be maintained. That's why I went the simple route first. If demand comes up, we could still extend this.

By the way, I do not think such autodetection is possible without using external infrastructure. This either implies relying on third parties (e.g. Google or some other public STUN server provider) or running something on jamulus.io.

@ann0see
Copy link
Member

ann0see commented Feb 6, 2021

Ok. Going to approve it now (I didn’t test the myself but I assume since the code compiles everything is ok). Please also add a short explanation of this feature to the documentation (open a PR to the command line page) and the ChangeLog file here.

@ann0see ann0see self-requested a review February 6, 2021 22:42
hoffie added a commit to hoffie/jamulussoftware.github.io that referenced this pull request Feb 6, 2021
hoffie added a commit to hoffie/jamulussoftware.github.io that referenced this pull request Feb 6, 2021
@gene96817
Copy link

@genesisproject2020 We are having understanding each other. Since you have this working, my comments don't apply. I just don't understand why this is working. There is probably something "obvious" that is not explained in how this is working.

@hoffie
Copy link
Member Author

hoffie commented Feb 6, 2021

@ann0see:

Please also add a short explanation of this feature to the documentation (open a PR to the command line page) and the ChangeLog file here.

Both done.

@gene96817:

I just don't understand why this is working. There is probably something "obvious" that is not explained in how this is working.

I think you may have been talking about the general network aspects (NAT, port forwarding, etc.). Proper NAT configuration is the basis for all this. The PR is about the application-level protocol changes which are required in addition. It's not meant to be an alternative. Maybe this clears up some confusion.

@@ -303,6 +303,9 @@ CONNECTION LESS MESSAGES
NOTE: In the PROTMESSID_CLM_SERVER_LIST list, this field will be empty
as only the initial IP address should be used by the client. Where
necessary, that value will contain the server internal address.
When running a central server and a slave server behind the same NAT,
this field is used the other way round: It will contain the public
IP in this case which will be served to clients from the Internet.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a certain natural flow to that which I like :)

@pljones pljones merged commit 983e11a into jamulussoftware:master Feb 7, 2021
@gilgongo
Copy link
Member

gilgongo commented Feb 9, 2021

@hoffie Just a question about the documentation for this, which I note you have added here.

Your explanation introduces the concept of a "slave server", which we don't use anywhere else, and isn't explained. If I understand correctly and you mean a "normal" server which is being advertised by the central server, then would the explanation of the serverpublicip option be as follows?

When running a public central server behind a NAT firewall on a private network, use the --serverpublicip option to specify the public IP address of the server(s) being listed by your central server. This is necessarily to allow clients on the public Internet to connect to them via NAT. Note that for the servers using this option, you will still need proper port forwarding in your router/firewall.

Also as a general point, I think it might be better to move this explanation to the other docs for central servers here and link to that from the configuration page, as we do for other things. This is to avoid duplication in future, and cluttering up the configuration page. Would it be OK if I did that?

Oh and also BTW, please don't put translations onto the changes branch. That's just for the English, which then gets merged to translation before site release. I'll back that out if that's OK with you.

@hoffie
Copy link
Member Author

hoffie commented Feb 9, 2021

Your explanation introduces the concept of a "slave server", which we don't use anywhere else, and isn't explained.

Hrm, I'm pretty sure I haven't invented it. Grepping through the code I see that it is being used in multiple places such as the ChangeLog and src/serverlist.cpp. This is probably where I've got this from. But I assume that you are mainly referring to documentation where it isn't used.

If I understand correctly and you mean a "normal" server which is being advertised by the central server, then would the explanation of the serverpublicip option be as follows?

Yes, this is what is meant and your proposal sounds fine.

Also as a general point, I think it might be better to move this explanation to the other docs for central servers here and link to that from the configuration page, as we do for other things. This is to avoid duplication in future, and cluttering up the configuration page. Would it be OK if I did that?

Sure.

Oh and also BTW, please don't put translations onto the changes branch. That's just for the English, which then gets merged to translation before site release. I'll back that out if that's OK with you.

I thought about this and read the CONTRIBUTING.md document multiple times, but could not find any information whether it would be a good idea or not. Obiously I was trying to be helpful and I'm sorry if I wasn't. Feel free to back it out. Maybe I'll raise a PR for adding "Only change English docs in changes branch" later.

@pljones
Copy link
Collaborator

pljones commented Feb 9, 2021

One point on "central server", "slave server", "normal server", etc. I've been trying to encourage "server list" and "server list server" rather than "central server" -- as there's nothing central about having seven official server lists, plus as many "custom" lists as you like. So a server that hosts a server list is a "server list server". What it's doing is "hosting a server list". Then all the servers on that list are just "servers on that server list". That eliminates jargon.

@gilgongo
Copy link
Member

gilgongo commented Feb 9, 2021

I've been trying to encourage "server list" and "server list server"

"Server list server" is a bit .... palindromic (in English at least). I think "directory server" has been suggested before too. BTW I take it "server list" refers to the thing in the UI that the server provides to the client, in which case I don't think we need to be too strict about the usage there since the context will explain it ("A list of servers will appear", "Select from the list"). The main confusion is between servers and central servers, where context sometimes doesn't help ("To connect to the server", "The address of the server").

Also, we can easily change all this in the docs, but I don't know if might cause confusion in the code (which has been the main objection in the past)?

@gilgongo
Copy link
Member

gilgongo commented Feb 10, 2021

@hoffie Ah I see what you mean about the contributing guidelines:

A fix which needs to be translated (e.g. if you want to make a sentence or paragraph clearer) --> Commit to changes since others will need to translate it.

That's not clear :-) I think it should say "a fix IN THE ENGLISH which needs to be translated". Otherwise language .md files get out of sync with the "root" English file, unless you are volunteering to translate the fix for ALL languages ;-)

(Personally, I think the contribution file is over-explaining, too long, and now we see it's confusing. I may try a re-write).

@pljones
Copy link
Collaborator

pljones commented Feb 10, 2021

I think "directory server" has been suggested before too.

"Something needs to be done" is really as far as I'd got -- "central" is wrong - was only right whilst there was only one. I'd rather the term was as non-technical as it can be: I guess people still understand "directory" to be something you look things up in?

@gilgongo
Copy link
Member

I guess people still understand "directory" to be something you look things up in?

I think that's a fairly safe assumption. Might we even retire the "server" word from it and just call them "Directories"? So "Private server", "Public server", "Directory"? Replacing "Central Server" with "Directory" in the docs actually reads quite well and allows the word "Server" to be disambiguated in all contexts.

@pljones
Copy link
Collaborator

pljones commented Feb 10, 2021

The only issue is that a "directory" server is still able to function as a public or private Jamulus server, so I wouldn't drop server entirely. It's essentially an additional function on top of being a Jamulus server.

@gilgongo
Copy link
Member

Well, by that logic we'd be calling clients "client/servers" since you can use the -s option. I think referring simply to a "Directory" gets it out of the hair of the vast majority of users have no in interest in central servers, and therefore disambiguates things nicely.

@pljones
Copy link
Collaborator

pljones commented Feb 11, 2021

A client without "-s" can't be used as a server. You can't run a server at all without "-s" -- "-e localhost" isn't allowed for a client. So you have to be a server to have "-e localhost".

"-e" determines whether you're server is a list / directory server ("-e localhost"), a registered server ("-e something" -- because you can register with a custom directory and hence not be pubic just because you're registered) or an unregistered server (no "-e"). A public server is one registered with one of the official directory servers.

(Same in the UI, of course.)

@gilgongo
Copy link
Member

A client without "-s" can't be used as a server. You can't run a server at all without "-s" -- "-e localhost" isn't allowed for a client. So you have to be a server to have "-e localhost".

Yes, but I don't see how any of that is conveyed by calling a thing a "client" and more than -e is conveyed by the term "server". All I'm saying is that by naming two things "... server" it makes the docs less clear perhaps.

We could adopt a long form of "Directory Server" (for headings or UI labels, say) and a short form of just "Directory" (eg "Can you connect to any of the directories?", "When running a directory." etc. )

Again I have no idea if this will cause confusion in the code.

@pljones
Copy link
Collaborator

pljones commented Feb 12, 2021

I'm saying that anything with -s is a server. The value of -e, when present, determines what kind of server it is. Hosting a directory is an additional function provided by directory servers. The docs need to make it clear that different kinds of server exist -- it's currently obvious many people get confused about this, not understanding that not all servers are the same.

So, I'd use the phrase "Can you display any of the directories?" (i.e. the results of querying directory servers) - they're different things: the server is what supplies the directory. The same server can also be used for jamming, of course, so connecting to the directory server could be for that. (I'm still happy using "server list" instead of "directory"... it just gets "recursive", as you say...)

@gilgongo
Copy link
Member

gilgongo commented Feb 13, 2021

The docs need to make it clear that different kinds of server

Every relevant page in the docs has a header asking you whether you've read the explanation before continuing. Short of throwing up a server quiz and allowing only those supplying correct answers to read the next page, I highly doubt we could be any clearer :-)

it's currently obvious many people get confused about this,

Which is why (given the above) my hypothesis is that calling two things a "server" may not helpful.

But I think the ability simply to refer to "directory" when we used to say "central" would be fine. So a straight find/replace of that term in the docs would be OK I think. That would mean we'd be saying "directory server" in the docs, but also could use just "directory" in casual conversation without mishap (eg "Can you display any of the directories?").


Totally off topic but while I've got you: Do we need to display the port numbers of the directory servers in the docs here? That is, if I set jamulusrock.jamulus.io on my command line, will connections be forwarded to 22424 automatically or do I need to explicitly add :22424 to the end of the host name? If so, can we just remove those ports from that table?

@pljones
Copy link
Collaborator

pljones commented Feb 13, 2021

Do we need to display the port numbers of the directory servers in the docs here? That is, if I set jamulusrock.jamulus.io on my command line, will connections be forwarded to 22424 automatically or do I need to explicitly add :22424 to the end of the host name? If so, can we just remove those ports from that table?

Host name resolves to an IP number only. So, on its own, that will always get you the default port number of 22124. So yes, you always need to supply the port number when it's not 22124, i.e. not the default port number.

gilgongo added a commit to jamulussoftware/jamuluswebsite that referenced this pull request Feb 13, 2021
gilgongo added a commit to jamulussoftware/jamuluswebsite that referenced this pull request Feb 15, 2021
* Link --serverpublicip desc. to docs

As per jamulussoftware/jamulus#954 (comment)

* Update en-Command-Line-Options.md
@softins
Copy link
Member

softins commented Feb 15, 2021

I'm a bit late to the party here, but have only just had time to test multiple servers behind NAT.

I tested with the 3.6.2 release. I set up inbound port forwarding on my router for ports 22120-22123 to my RPi.

I then created a central server on my RPi on port 22120. It was visible to Explorer on my public IP port 22120.

I then created three more servers on the RPi, using ports 22121-22123, and specifying that they should register with my PUBLIC IP port 22120 (not my LAN IP, nor 127.0.0.1). They all appeared correctly in Explorer.

I then started up a client on another computer on the LAN, and set the custom central server to my PUBLIC IP port 22120. I was able to connect successfully to any of the four servers via the custom central server.

All of this worked without the new feature, so it leads me to wonder why it was needed and when it would actually be used?

@hoffie
Copy link
Member Author

hoffie commented Feb 16, 2021

I then created three more servers on the RPi, using ports 22121-22123, and specifying that they should register with my PUBLIC IP port 22120 (not my LAN IP, nor 127.0.0.1). They all appeared correctly in Explorer.

I then started up a client on another computer on the LAN, and set the custom central server to my PUBLIC IP port 22120. I was able to connect successfully to any of the four servers via the custom central server.

Hrm, that's indeed one of the proposed solutions I've posted here: #888 (comment)
I've just noticed that the initial requester (@genesisproject2020) did not comment on that part (?), although I somehow had the impression that this was attempted. @genesisproject2020 Had you tested this? I ran a quick test and couldn't get it to work, but that might also be related to my specific network setup/NAT environment.

All of this worked without the new feature, so it leads me to wonder why it was needed and when it would actually be used?

If it turns out that the requested behavior is possible without any code changes, then, it should probably be discussed if the new code should be removed again. Would be sad to say as there's been some effort not only by you and me but also by @genesisproject2020, @pljones, @gilgongo and others, but I think it would be in the interest of the project to only add code which is really needed.

I suggest waiting for some feedback by @genesisproject2020.

@softins
Copy link
Member

softins commented Feb 16, 2021

@hoffie thanks for your comments! I can imagine it might be possible that some routers do not allow internal hosts to route to the external address for forwarding back in. In that situation, this new option may help. Just to confirm, it would only be needed on the central server, not on the other local servers registering to it?

@hoffie
Copy link
Member Author

hoffie commented Feb 16, 2021

I can imagine it might be possible that some routers do not allow internal hosts to route to the external address for forwarding back in.

Yes, might be possible. In my case it was Linux/iptables, so guess it would be possible to hack this somehow. Let's wait what @genesisproject2020 says.

Just to confirm, it would only be needed on the central server, not on the other local servers registering to it?

Not quite. If you need this feature (i.e. you run a central server and regular servers behind NAT and want public clients to connect via the central server), then both the central server and the regular server need to run the new code. The central server does not need any configuration, it will auto-detect if the new code branch should be triggered. The regular server needs the new --serverpublicip parameter.

If the central server uses the old code, nothing bad will happen, it just won't work (as it used to).
If the regular server uses the old code, --serverpublicip will not work and startup will fail.

@genesisproject2020
Copy link
Contributor

Some firewalls and broadband routers have support for hairpinning (using external IP to communicate within a NAT environment). Mostly this is not supported and therefore another solution is needed to be able to present the external IP.

Another scenario where a solution to choose the presenting IP is if you have more then one IP on the external interface. The solution implemented to get the external IP will probably choose the first IP or the NAT IP.

The solution to override the found external IP solves both scenarios in an easy and effective way.

I've used the code for a while with no complications. As said before, the updated code has to be on the directory instance as well as the server instances that connect to the directory server. The clients can be whatever version so it's backward compatible.

@gene96817
Copy link

A usual way to avoid the need for hairpinning, is to use the router's DNS service. Then internal network devices can use external hostnames and get internal IP addresses. This allows all clients to use the same hostnames; external clients get external IP addresses from an external DNS server and internal clients get internal IP addresses from the internal (in the router) DNS server. (The internal DNS server table is very short. Only the internal host needs an entry. All other domain names are proxied to an external DNS server.)

@genesisproject2020
Copy link
Contributor

The suggestion to use an internal DNS will present the internal IP to the directory server and will not work.

There will probably be a long row of techie solutions to solve this but none of them will be an easy way for someone to do. The solution @hoffie created overcomes the need of being a techie and having special equipment. I hope we can leave it as it is.

@gene96817
Copy link

The suggestion to use an internal DNS will present the internal IP to the directory server and will not work.

Why?

@softins
Copy link
Member

softins commented Feb 16, 2021

The suggestion to use an internal DNS will present the internal IP to the directory server and will not work.

Why?

Because the issue is not DNS, whether split horizon, independent internal/external or otherwise.

The issue here is purely related to IP addresses and NAT routing. If a router supports hairpinning, and the appropriate port forwardings are set up, then internal hosts A and B can communicate with each other using the external IP and the appropriate port numbers. If they are just communicating with each other, there is no point and it’s wasteful, but if host A is a central server and needs to publicise host B to the outside world, the fact that B registered from its external IP, by hairpinning, means that the correct public IP and port get publicised. This works in all versions of Jamulus without needing --serverpublicip.

If the router does not support hairpinning, host B is only able to register with host A directly on its LAN IP address. In that case, the central server on host A would list the wrong IP for B when sending it to an external client. The new option --serverpublicip is intended to solve this particular problem, by telling the central server the external IP to present instead of the LAN IP.

@gene96817
Copy link

oooo.... are you saying that a core problem is many Jamulus servers do not have domain names?

@softins
Copy link
Member

softins commented Feb 16, 2021

oooo.... are you saying that a core problem is many Jamulus servers do not have domain names?

No, I’m not saying that’s a problem at all. I’m saying it isn’t relevant to this issue.

gilgongo added a commit to jamulussoftware/jamuluswebsite that referenced this pull request Feb 23, 2021
* [gen] Add community section (#101)

* First blog beta

* non working blog pagination

* small fix

* Revert "small fix"

This reverts commit d527efc.

* Add example blog

* clarify github

* Fix heading

* Add structured data

* add structured data

* First try GH comment api

* Revert "First try GH comment api"

This reverts commit 0ad04d8.

* Remove blog posts

* Add dates

* add authors

* Add more pages

* add pagination to bottom of posts

* Fix issues and add example draft

* Rename blog to knowledge base

* Remove german translation since it's not wanted

* Add discussion url

* move some files

* Update 2020-03-28-Example-Setup-Hardware.md

* Remove SW Synth to re-add it

* Add Software Synth by @niebert

* Update 2020-12-10-Software-Synth.md

* First review

* Second review

* Remove install script to re add it via pr

* Minor improvements

* Use @trebmuh changes

* Beautify

* Added pictures

* Update 2020-10-19-Software-Synth.md

* Update 2020-10-19-Software-Synth.md

* Fixed screenshot

* rename blog folder to kb

* Update 2020-09-20-Linux-Install-Script.md

* smaller bugfixes

* Dirty fix for nav kb

* small changes

* Add review changes

Co-authored-by: Olivier Humbert <[email protected]>
Co-authored-by: ignotus <[email protected]>

* Update en-Compiling.md

* Update fr-Compiling.md

* Update de-Compiling.md

* Update es-Compiling.md

* W: [fr] fr-Tips-Tricks-More.md (#122) (#193)

* Link to the CC french version

* GNU/Linux -> Linux (keep close to EN!)

* W: [fr] fr-Tips-Tricks-More.mdd

* [fr] fr-Tips-Tricks-More update

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* Fix a link

* Move Raspi page

* add new line

* redirect pages

* Fix a typo (#195)

Co-authored-by: ann0see <[email protected]>

* remove draft

* Add gen reccom

* Update en-Getting-Started.md

* Fix a few qjackctl

* fix a few jack --> JACK

* fix macbook --> MacBook and firewire --> FireWire

* consistent ASIO4ALL

* Add trombonepizza link to user profile

* Update en-Getting-Started.md

* [fr] Create fr-Network-Requirements.md (#112) (#197)

* W: [fr] fr-Network-Requirements.md

* Update fr-Network-Requirement.md

* [fr] update fr-Network-Requirements.md

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* [fr] Network-Requirements: fixes a broken link (#198) (#199)

Co-authored-by: Olivier Humbert <[email protected]>

* Avoid repetition: fix redundant link.

* Let's match the title of the linked page. (#200) (#202)

Co-authored-by: Gérald Niel <[email protected]>

* Add @gegeweb rec

* [fr] fr-Server-Troubleshooting.md (#145) (#203)

* W: [fr] fr-Server-Troubleshooting.md

* [fr] update fr-Server-Troubleshooting.md

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* a few small typos fixed

* fix a few sounddevices

* W: [fr] fr-Server-Win-Mac.md (#119) (#205)

* W: [fr] fr-Server-Win-Mac.md

* [fr] update fr-Server-Win-Mac.md

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* Make the download more prominent

* Get closer to english (#206)

Co-authored-by: ann0see <[email protected]>

* [fr] Create fr-Choosing-a-Server-Type.md (#115) (#207)

* W: [fr] fr-Choosing-a-Server-Type.md

* Little rewording, ready for review.

* [fr] update fr-Choosing-a-Server-Type.md

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* W: [fr] fr-Running-a-Private-Server.md (#116) (#208)

* W: [fr] fr-Running-a-Private-Server.md

* [fr] fr-Running-a-Private-Server.md update

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* uncomment kb

* [en] consistency: Internet speed not clear: MBit/s, Mbps,... (#204)

* MBit/s

* kbps --> Kbit/s

* consistency

* add spaces

* add more spaces

* remove some target blank

* fix syntax

* add anc to compiling os

* W: [fr] fr-Hardware-Setup.md (#117) (#209)

* W: [fr] fr-Hardware-Setup.md

* Update fr-Hardware-Setup.md

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* W: [fr] fr-Server-Linux.md (#118) (#212)

* W: [fr] fr-Server-Linux.md

* [fr] update fr-Server-Linux.md

Co-authored-by: Olivier Humbert <[email protected]>

Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>

* Add link to ASIO4ALL manual

* Update de-Contribution.md (#214)

Co-authored-by: ann0see <[email protected]>

* Update de-Installation-for-Windows.md

* Update de-Getting-Started.md (#215)

Co-authored-by: ann0see <[email protected]>

* Update CONTRIBUTING files (#157)

* Add new contributing file

* Clarify branches

* Moved a bit to homepage

* Review updates

* fix typo

* Grammar

* Add more translation services

* fix a few issues

* small fix

* Add github

* Update README

* @ignotus666 changes

* Wording

* ignotus rechnet

* gilgongo fix

* Update CONTRIBUTING.md

* Update README.md

* Update README.md

* Update README.md

* Update 2020-11-24-Multiple-Audio-Interfaces.md

* Update en-Installation-for-Linux.md

* [en] en-Compiling.md (consistency: QT -> Qt)

* [fr] consistency: jack Jack JACK (#219) (#221)

* Update fr-Software-Manual.md

* Update fr-Command-Line-Options.md

* Update fr-Installation-for-Linux.md

Co-authored-by: Olivier Humbert <[email protected]>

* Change some texts on the homepage (#217)

* Small changes with SEO in mind

Jamulus is currently bad at SEO. I think we could improve the wording here.

* Update 1-index.html

* [en] QjackCtl spelling (2020-11-24-Multiple-Audio-Interfaces.md)

* [en] QjackCtl spelling (en-Hardware-Setup.md)

* [fr] typo fix Berhinger/Behringer (#224) (#225)

Co-authored-by: Olivier Humbert <[email protected]>

* [fr] démonstrations -> démos (#226) (#227)

* [fr] update fr-Demos.md (démonstrations -> démos)

* [fr] update navigation.yml (démonstrations -> démos)

Co-authored-by: Olivier Humbert <[email protected]>

* [fr] consistency: Internet -> internet (#228) (#229)

* [fr] consistency: Internet -> internet (1-fr-index.html)

* [fr] consistency: Internet -> internet (fr-Getting-Started.md)

* [fr] consistency: Internet -> internet (fr-Client-Troubleshooting.md)

* [fr] consistency: Internet -> internet (fr-Demos.md)

Co-authored-by: Olivier Humbert <[email protected]>

* [en] consistency alsa -> ALSA (2020-11-24-Multiple-Audio-Interfaces.md)

* Add Debian packages

* A few changes  (#210)

* Add some small changes

* remove duplicate

* sync mac and windows

* Update en-Installation-for-Windows.md

* Remove compilation link since it might confuse people

* Remove scroll down since there's nothing below

* Change MacOS to macOS

* Update en-Installation-for-Windows.md

* Update it-Getting-Started.md (#230)

Some small correction plus the main one: the meaning of footnote 1 was reversed in Italian.

* [en] consistency Macintosh->macOS (en-Server-Linux.md)

* Explain how the new installer can be compiled

This will show how to compile the new installer on Windows. Have a look at the discussion in jamulussoftware/jamulus#792

* Quote the directory name as code

* Create newsounddevice.md

* Create 2021-01-05-Jamulus-Sound-Devices.md

* Move Sound Devices to community KB

* Structure sound devices by OS

* Update 2021-01-05-Jamulus-Sound-Devices.md

* Add more detail for Windows build process

* Fix formatting

* Add Qt versioning info

* Small edit

* Add tested Behringer XENYX X1832 USB

Thanks to @achim-grosse-oetringhaus #223

* Update en-Sound-Devices.md (#223)

Added Behringer XENYX 1832 USB

Co-authored-by: ann0see <[email protected]>

* [fr] links fixes (fr-Server-Win-Mac.md) (#235) (#236)

Co-authored-by: Olivier Humbert <[email protected]>

* [fr] update 1-fr-index.html (#238) (#239)

* [fr] update fr-Command-Line-Options.md (#240) (#241)

Co-authored-by: Olivier Humbert <[email protected]>

* Since GH Action fails remove CI (#243)

Co-authored-by: ann0see <[email protected]>

* French translation update (#245) (#247)

* [en] update en-Compiling.md (steinberg link in EN) (#244) (#246)

* Add contributors

* Add qjackctl

* French l10n update (#248) (#249)

* [fr] update fr-Onboarding.md

* [fr] update fr-Installation-for-Windows.md

* [fr] update fr-Installation-for-Macintosh.md

* [fr] update fr-Installation-for-Linux.md

Co-authored-by: Olivier Humbert <[email protected]>

* Link quoting issue

* ASIO description (#242)

* Add ASIO description

Since the new installer will link to this page, a description of ASIO is needed

* Grammar mistake fixed

* Add ASIO heading (#251)

* [fr] links fixes (fr-Server-Win-Mac.md) (#235)

* [fr] update 1-fr-index.html (#238)

* [fr] update fr-Command-Line-Options.md (#240)

* Since GH Action fails remove CI

* French translation update (#245)

* [en] update en-Compiling.md (steinberg link in EN) (#244)

* French l10n update (#248)

* [fr] update fr-Onboarding.md

* [fr] update fr-Installation-for-Windows.md

* [fr] update fr-Installation-for-Macintosh.md

* [fr] update fr-Installation-for-Linux.md

* Add small changes to link ASIO from new installer

* Update en-Installation-for-Windows.md

Co-authored-by: Olivier Humbert <[email protected]>

* French l10v improvements (#253) (#254)

* French l10n improvements (#257) (#258)

* Re Add jekyll CI

* Review changes

* updates/fixes a link

* Clarify the .deb package installation

* [en] update footertext.md

closes #255

* Checking spelling and grammar

* Delete cherrypick.yml

* Create syncbranches.yml

* Sync on release merge only

* Sync md style

* Revert slogan to make music 

Reference: jamulussoftware/jamulus#861 (comment)

* Update hosts list and explanation

* Add note about ProtectHome

As per forum discussion on saving recordings.

* Correct typos, spelling

* Make Gemfile.lock writable

* Pull request test (#277)

Does the build script only work with pull requests?

* Pull request previously non-building version (#278)

* Add GUI instructions

* Add more prominent ASIO4ALL link and changes

* Make --> Play

* Apply suggestions from @mulyaj

* fixed typo

* wiki/Command-Line-Options: document --serverpublicip

jamulussoftware/jamulus#954

Signed-off-by: Christian Hoffmann <[email protected]>

* Changed body text colour - 000 to 333

* Update en-Central-Servers.md

* Update en-Client-Troubleshooting.md

* Update en-Compiling.md

* Update en-Contribution.md

* Update en-Getting-Started.md

* Update en-Hardware-Setup.md

* Update en-Installation-for-Linux.md

* Update en-Installation-for-Macintosh.md

* Update en-Installation-for-Windows.md

* Update en-Network-Requirements.md

* Update en-Onboarding.md

* Update en-Privacy-Statement.md

* Update en-Running-a-Private-Server.md

* Update en-Running-a-Server.md

* Update en-Server-Linux.md

* Update en-Server-Troubleshooting.md

* Update en-Server-Win-Mac.md

* Update en-Software-Manual.md

* Update en-Tips-Tricks-More.md

* Update en-Central-Servers.md

* Update en-Contribution.md

* Add spacing

* Update en-Client-Troubleshooting.md

* Add --listfilter documentation

Will also create link to this from Configuration page.

* Remove premature change

Sorry! Non-English changes directly on the changes branch cause chaos.

* Use "involved"

As per #279 (comment)

Also added FOSS as per #163

* Create image library

* Multi-lingual screenshots

* Update image path

Images now in en-screenshots to allow multi-lingual.

* Fix broken link

* Clarify translation (#288)

* Add new linux installation

* Update it footer

* Add basic android guide

* Update general.yml

* Change beta to PoC

* Revert "Update"

* Apply changes from review

* Apply clarification

* Update en-Hardware-Setup.md

* Update en-Installation-for-Windows.md

* Update en-Onboarding.md

* Update en-Onboarding.md

* Update en-Software-Manual.md

* Corrected URL

* Corrected URL

* Corrected URL

* Better local monitoring test

From [Chris Rimple](https://sourceforge.net/p/llcon/discussion/software/thread/166288d63e/#e047)

* Updated to document new MIDI controller functions

* Updated MIDI controller syntax

* Update en-Command-Line-Options.md

* Correction and addition

* Update en-Installation-for-Linux.md

* Removed spaces

* Link --serverpublicip desc. to docs (#290)

* Link --serverpublicip desc. to docs

As per jamulussoftware/jamulus#954 (comment)

* Update en-Command-Line-Options.md

* Removed spaces

* Correction

* Correction

* Update

* Some rephrasing

* Just realised the next release will be 3.7.0

* Remove donation implication

Also BE spelling for licence

* Install deb via apt

* Add flatpak and other instructions

* Move debian testing down

* Add jump marker

* Add headless server .deb instruction

* Add link to deb file

* Add direct link to deb file

* Add configuration of headless server

* Add daemon-reload

* Breadcrumb (#306)

* Add breadcrumb style

* Create breadcrumb.html

* Update breadcrumb.html

* Update en-Central-Servers.md

* Update en-Choosing-a-Server-Type.md

* Update en-Installation-for-Windows.md

* Update en-Installation-for-Macintosh.md

* Update en-Installation-for-Linux.md

* Update en-Hardware-Setup.md

* Update en-Running-a-Private-Server.md

* Update en-Server-Linux.md

* Update en-Server-Troubleshooting.md

* Update en-Server-Win-Mac.md

* is will be -> is

* Update en-Tips-Tricks-More.md

* Fix grammar mistake

* Change quoting

@gilgongo could you please verify if this works as expected?

* Update link

* Add binary links via config.yml file

* Add link to headless deb on server page

* Move corrados to jamulussoftware

* Fix broken ASIO4ALL manual link

* Remove ASIO4ALL manual link

@pljones I hope that's ok now

* Add breadcrumb

* URL updates, admin page

* Add debian buster backports

Co-authored-by: ann0see <[email protected]>
Co-authored-by: Olivier Humbert <[email protected]>
Co-authored-by: ignotus <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gérald Niel <[email protected]>
Co-authored-by: vdellamea <[email protected]>
Co-authored-by: jdrage <[email protected]>
Co-authored-by: achim-grosse-oetringhaus <[email protected]>
Co-authored-by: ann0see <[email protected]>
Co-authored-by: mulyaj <[email protected]>
Co-authored-by: Christian Hoffmann <[email protected]>
Co-authored-by: Peter L Jones <[email protected]>
Co-authored-by: dzpex <[email protected]>
gilgongo added a commit to jamulussoftware/jamuluswebsite that referenced this pull request Mar 17, 2021
* [fr] consistency: Internet -> internet (#228) (#229)

* [fr] consistency: Internet -> internet (1-fr-index.html)

* [fr] consistency: Internet -> internet (fr-Getting-Started.md)

* [fr] consistency: Internet -> internet (fr-Client-Troubleshooting.md)

* [fr] consistency: Internet -> internet (fr-Demos.md)

Co-authored-by: Olivier Humbert <[email protected]>

* [en] consistency alsa -> ALSA (2020-11-24-Multiple-Audio-Interfaces.md)

* Add Debian packages

* A few changes  (#210)

* Add some small changes

* remove duplicate

* sync mac and windows

* Update en-Installation-for-Windows.md

* Remove compilation link since it might confuse people

* Remove scroll down since there's nothing below

* Change MacOS to macOS

* Update en-Installation-for-Windows.md

* Update it-Getting-Started.md (#230)

Some small correction plus the main one: the meaning of footnote 1 was reversed in Italian.

* [en] consistency Macintosh->macOS (en-Server-Linux.md)

* Explain how the new installer can be compiled

This will show how to compile the new installer on Windows. Have a look at the discussion in jamulussoftware/jamulus#792

* Quote the directory name as code

* Create newsounddevice.md

* Create 2021-01-05-Jamulus-Sound-Devices.md

* Move Sound Devices to community KB

* Structure sound devices by OS

* Update 2021-01-05-Jamulus-Sound-Devices.md

* Add more detail for Windows build process

* Fix formatting

* Add Qt versioning info

* Small edit

* Add tested Behringer XENYX X1832 USB

Thanks to @achim-grosse-oetringhaus #223

* Update en-Sound-Devices.md (#223)

Added Behringer XENYX 1832 USB

Co-authored-by: ann0see <[email protected]>

* [fr] links fixes (fr-Server-Win-Mac.md) (#235) (#236)

Co-authored-by: Olivier Humbert <[email protected]>

* [fr] update 1-fr-index.html (#238) (#239)

* [fr] update fr-Command-Line-Options.md (#240) (#241)

Co-authored-by: Olivier Humbert <[email protected]>

* Since GH Action fails remove CI (#243)

Co-authored-by: ann0see <[email protected]>

* French translation update (#245) (#247)

* [en] update en-Compiling.md (steinberg link in EN) (#244) (#246)

* Add contributors

* Add qjackctl

* French l10n update (#248) (#249)

* [fr] update fr-Onboarding.md

* [fr] update fr-Installation-for-Windows.md

* [fr] update fr-Installation-for-Macintosh.md

* [fr] update fr-Installation-for-Linux.md

Co-authored-by: Olivier Humbert <[email protected]>

* Link quoting issue

* ASIO description (#242)

* Add ASIO description

Since the new installer will link to this page, a description of ASIO is needed

* Grammar mistake fixed

* Add ASIO heading (#251)

* [fr] links fixes (fr-Server-Win-Mac.md) (#235)

* [fr] update 1-fr-index.html (#238)

* [fr] update fr-Command-Line-Options.md (#240)

* Since GH Action fails remove CI

* French translation update (#245)

* [en] update en-Compiling.md (steinberg link in EN) (#244)

* French l10n update (#248)

* [fr] update fr-Onboarding.md

* [fr] update fr-Installation-for-Windows.md

* [fr] update fr-Installation-for-Macintosh.md

* [fr] update fr-Installation-for-Linux.md

* Add small changes to link ASIO from new installer

* Update en-Installation-for-Windows.md

Co-authored-by: Olivier Humbert <[email protected]>

* French l10v improvements (#253) (#254)

* French l10n improvements (#257) (#258)

* Re Add jekyll CI

* Review changes

* updates/fixes a link

* Clarify the .deb package installation

* [en] update footertext.md

closes #255

* Checking spelling and grammar

* Delete cherrypick.yml

* Create syncbranches.yml

* Sync on release merge only

* Sync md style

* Revert slogan to make music 

Reference: jamulussoftware/jamulus#861 (comment)

* Update hosts list and explanation

* Add note about ProtectHome

As per forum discussion on saving recordings.

* Correct typos, spelling

* Make Gemfile.lock writable

* Pull request test (#277)

Does the build script only work with pull requests?

* Pull request previously non-building version (#278)

* Add GUI instructions

* Add more prominent ASIO4ALL link and changes

* Make --> Play

* Apply suggestions from @mulyaj

* fixed typo

* wiki/Command-Line-Options: document --serverpublicip

jamulussoftware/jamulus#954

Signed-off-by: Christian Hoffmann <[email protected]>

* Changed body text colour - 000 to 333

* Update en-Central-Servers.md

* Update en-Client-Troubleshooting.md

* Update en-Compiling.md

* Update en-Contribution.md

* Update en-Getting-Started.md

* Update en-Hardware-Setup.md

* Update en-Installation-for-Linux.md

* Update en-Installation-for-Macintosh.md

* Update en-Installation-for-Windows.md

* Update en-Network-Requirements.md

* Update en-Onboarding.md

* Update en-Privacy-Statement.md

* Update en-Running-a-Private-Server.md

* Update en-Running-a-Server.md

* Update en-Server-Linux.md

* Update en-Server-Troubleshooting.md

* Update en-Server-Win-Mac.md

* Update en-Software-Manual.md

* Update en-Tips-Tricks-More.md

* Update en-Central-Servers.md

* Update en-Contribution.md

* Add spacing

* Update en-Client-Troubleshooting.md

* Add --listfilter documentation

Will also create link to this from Configuration page.

* Remove premature change

Sorry! Non-English changes directly on the changes branch cause chaos.

* Use "involved"

As per #279 (comment)

Also added FOSS as per #163

* Create image library

* Multi-lingual screenshots

* Update image path

Images now in en-screenshots to allow multi-lingual.

* Fix broken link

* Clarify translation (#288)

* Add new linux installation

* Update it footer

* Add basic android guide

* Update general.yml

* Change beta to PoC

* Revert "Update"

* Apply changes from review

* Apply clarification

* Update en-Hardware-Setup.md

* Update en-Installation-for-Windows.md

* Update en-Onboarding.md

* Update en-Onboarding.md

* Update en-Software-Manual.md

* Corrected URL

* Corrected URL

* Corrected URL

* Better local monitoring test

From [Chris Rimple](https://sourceforge.net/p/llcon/discussion/software/thread/166288d63e/#e047)

* Updated to document new MIDI controller functions

* Updated MIDI controller syntax

* Update en-Command-Line-Options.md

* Correction and addition

* Update en-Installation-for-Linux.md

* Removed spaces

* Link --serverpublicip desc. to docs (#290)

* Link --serverpublicip desc. to docs

As per jamulussoftware/jamulus#954 (comment)

* Update en-Command-Line-Options.md

* Removed spaces

* Correction

* Correction

* Update

* Some rephrasing

* Just realised the next release will be 3.7.0

* Remove donation implication

Also BE spelling for licence

* Install deb via apt

* Add flatpak and other instructions

* Move debian testing down

* Add jump marker

* Add headless server .deb instruction

* Add link to deb file

* Add direct link to deb file

* Add configuration of headless server

* Add daemon-reload

* Breadcrumb (#306)

* Add breadcrumb style

* Create breadcrumb.html

* Update breadcrumb.html

* Update en-Central-Servers.md

* Update en-Choosing-a-Server-Type.md

* Update en-Installation-for-Windows.md

* Update en-Installation-for-Macintosh.md

* Update en-Installation-for-Linux.md

* Update en-Hardware-Setup.md

* Update en-Running-a-Private-Server.md

* Update en-Server-Linux.md

* Update en-Server-Troubleshooting.md

* Update en-Server-Win-Mac.md

* is will be -> is

* Update en-Tips-Tricks-More.md

* Fix grammar mistake

* Change quoting

@gilgongo could you please verify if this works as expected?

* Update link

* Add binary links via config.yml file

* Add link to headless deb on server page

* Move corrados to jamulussoftware

* Fix broken ASIO4ALL manual link

* Remove ASIO4ALL manual link

@pljones I hope that's ok now

* Add breadcrumb

* URL updates, admin page

* Clarify ASIO4ALL to new UI

* Update wiki/en/en-Installation-for-Windows.md

Co-authored-by: Christian Hoffmann <[email protected]>

* Add debian buster backports

* Add Ad warning

* Remove wrong space

* Add ASIO4ALL direct download

* Update 1-es-index.html

* Update general.yml

* Update navigation.yml

* Update footertext.md

* Update es-Central-Servers.md

* Update es-Choosing-a-Server-Type.md

* Update es-Client-Troubleshooting.md

* Update es-Command-Line-Options.md

* Update es-Compiling.md

* Update es-Compiling.md

* Update es-Contribution.md

* Update es-Demos.md

* Update es-Getting-Started.md

* Update es-Hardware-Setup.md

* Update es-Installation-for-Linux.md

* Update es-Installation-for-Macintosh.md

* Update es-Installation-for-Windows.md

* Create es-Installation-for-Windows.md

* Update es-Network-Requirements.md

* Update es-Onboarding.md

* Update es-Privacy-Statement.md

* Update es-Running-a-Private-Server.md

* Update es-Running-a-Server.md

* Update es-Server-Linux.md

* Update es-Server-Troubleshooting.md

* Update es-Server-Win-Mac.md

* Update es-Software-Manual.md

* Update es-Tips-Tricks-More.md

* Update es-Central-Servers.md

* Update es-Client-Troubleshooting.md

* Update es-Installation-for-Linux.md

* Update es-Installation-for-Windows.md

* Add files via upload

* First german Translation3_7_0

* German translation

* Remove SF reference

* Apply small fixes to german translation

* Apply hoffie's suggestions

* Update wiki/de/de-Installation-for-Windows.md

Co-authored-by: Christian Hoffmann <[email protected]>

* Link server connection

* Translate contribution file in german

* Update es-Server-Linux.md

* Small fixes

* Fix typos in german translation

* Fix some other links

* Remove french install script

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Olivier Humbert <[email protected]>
Co-authored-by: vdellamea <[email protected]>
Co-authored-by: jdrage <[email protected]>
Co-authored-by: achim-grosse-oetringhaus <[email protected]>
Co-authored-by: ann0see <[email protected]>
Co-authored-by: Gilgongo <[email protected]>
Co-authored-by: Jonathan <[email protected]>
Co-authored-by: mulyaj <[email protected]>
Co-authored-by: Christian Hoffmann <[email protected]>
Co-authored-by: Peter L Jones <[email protected]>
Co-authored-by: ignotus <[email protected]>
Co-authored-by: dzpex <[email protected]>
@hoffie hoffie deleted the centralserver-behind-nat branch March 19, 2022 20:25
@pljones pljones added this to the Release 3.7.0 milestone Nov 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Triage
Development

Successfully merging this pull request may close these issues.

8 participants