-
Notifications
You must be signed in to change notification settings - Fork 228
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
Add support for central servers behind NAT #954
Conversation
@@ -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" |
There was a problem hiding this comment.
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
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; | ||
} | ||
} |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 ) |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
Interesting approach. So there's no way to automatically get the external IP from the slave servers automatically? Would Line 1021 in 373e1f4
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? |
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.
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. |
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. 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. |
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]>
7510756
to
4800e05
Compare
Works great! |
@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. |
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. |
I certainly think this is possible, but I tried to adhere to KISS principles and attempted to make this as simple as possible. ;) 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. |
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. |
jamulussoftware/jamulus#954 Signed-off-by: Christian Hoffmann <[email protected]>
jamulussoftware/jamulus#954 Signed-off-by: Christian Hoffmann <[email protected]>
@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. |
Signed-off-by: Christian Hoffmann <[email protected]>
Both done.
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. |
There was a problem hiding this comment.
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 :)
@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?
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. |
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
Yes, this is what is meant and your proposal sounds fine.
Sure.
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. |
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. |
"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)? |
@hoffie Ah I see what you mean about the contributing guidelines:
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). |
"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? |
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. |
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. |
Well, by that logic we'd be calling clients "client/servers" since you can use the |
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.) |
Yes, but I don't see how any of that is conveyed by calling a thing a "client" and more than 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. |
I'm saying that anything with 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...) |
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 :-)
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? |
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. |
* Link --serverpublicip desc. to docs As per jamulussoftware/jamulus#954 (comment) * Update en-Command-Line-Options.md
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? |
Hrm, that's indeed one of the proposed solutions I've posted here: #888 (comment)
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. |
@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? |
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.
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 If the central server uses the old code, nothing bad will happen, it just won't work (as it used to). |
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. |
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.) |
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. |
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 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 |
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. |
* [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]>
* [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]>
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.
--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.--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.