I'm (network engineer as day job) hosting a dedicated server in my LAN to play with my wife. We have played on LAN over 700 hours and large maps without problems.
Recently a friend of ours wanted to join so I set up port forwarding and we created a new map. He was able to join without a problem and we played 3 hours that day.
Next day he tried to join and the download didn't finish for him. It started but then stopped at quarter or half download. On the third try it worked so we ignored it.
By now the map had 10 hours of play time and now he has the downloading problem every time he tries to connect. We can still connect from LAN without a problem.

Here's what I know:
- The larger the map download is, the less likely any external user can finish the download (and therefore connect)
- The first second or so the download works but then the B/s and ETA drop to 0 and nothing happens
- 3 more friends have tested it and have the same problem
- I can't reproduce the error from within my network but when using a VPN and connecting via that, I have the same problem
- I'm using a PFsense box so I set up outgoing static port mapping
- The download never stops at the same download size. Sometimes it stops with 200kb, sometimes it gets to 4mb (almost finished)
- If the download completes (happens increasingly rareley (depending on the map size), anyone can play without a problem
- If I delete the map and restart the server, everyone can connect (because download is so small it finishes for everyone)
- I'm using a business fiber internet connection and have multiple static external IPs so no blocking or rate limits apply
- Nothing changes if I change the "segment_size" settings in the server config to higher or lower values
- The Factorio server is running from a Docker container with --net=host
Any pointers on what else I could try?151.684 ConnectionRequestReplyConfirm (type(ConnectionRequestReplyConfirm) ) from(IP ADDR:({82.218.xx.117:59546}))
151.684 Info ServerRouter.cpp:425: Replying to connectionRequest for address(IP ADDR:({82.218.xx.117:59546})).
151.684 Info ServerSynchronizer.cpp:599: nextHeartbeatSequenceNumber(4337) adding peer(40)
151.703 Info ServerMultiplayerManager.cpp:776: updateTick(1763745) changing state from(InGame) to(InGameSavingMap)
151.737 Info ServerMultiplayerManager.cpp:925: updateTick(1763745) received stateChanged peerID(40) oldState(Ready) newState(ConnectedWaitingForMap)
152.324 Info ServerMultiplayerManager.cpp:993: UpdateTick(1763745) Serving map(/opt/factorio/temp/mp-save-38.zip) for peer(40) size(5150412) crc(2617383273)
152.324 Info ServerMultiplayerManager.cpp:776: updateTick(1763745) changing state from(InGameSavingMap) to(InGame)
152.375 Info ServerMultiplayerManager.cpp:925: updateTick(1763745) received stateChanged peerID(40) oldState(ConnectedWaitingForMap) newState(ConnectedDownloadingMap)
153.302 Info ServerMultiplayerManager.cppDisconnect notification for peer (40)
153.302 Info ServerMultiplayerManager.cpp:925: updateTick(1763745) received stateChanged peerID(40) oldState(ConnectedDownloadingMap) newState(DisconnectScheduled)
2020-05-03 21:17:37 [LEAVE] r3d4rr0w left the game