8 Commits

Author SHA1 Message Date
4fa26d51d0 Merge branch 'dev' into beta 2026-01-11 20:32:28 +01:00
7d56f9db5d Update year 2026-01-10 19:10:37 +01:00
4609e85ca9 Logging uses ISO8601 instead of Unix Millis 2026-01-04 19:38:05 +01:00
154296bcdc README Update 2026-01-03 16:36:10 +01:00
867b2c953a Patch 1.0.1 START 2026-01-01 21:51:16 +01:00
83693ed1da Update README to be more clear about IPv4 forwarding 2026-01-01 21:48:42 +01:00
62335f3693 Test fixing writing bug 2026-01-01 21:27:13 +01:00
2d3d6afb07 Test: fix forwarding 2026-01-01 21:18:51 +01:00
30 changed files with 185 additions and 45 deletions

View File

@@ -3,7 +3,7 @@
## ASIO C++ Library ## ASIO C++ Library
- **Name:** ASIO (standalone) - **Name:** ASIO (standalone)
- **Website:** https://think-async.com/Asio/ - **Website:** https://think-async.com/Asio/
- **Copyright:** (c) 2003-2025 Christopher M. Kohlhoff - **Copyright:** (c) 2003-2026 Christopher M. Kohlhoff
- **License:** Boost Software License, Version 1.0 - **License:** Boost Software License, Version 1.0
- **License Text:** See `third_party/asio/LICENSE_1_0.txt` - **License Text:** See `third_party/asio/LICENSE_1_0.txt`
@@ -12,14 +12,14 @@ This project uses the standalone version of the ASIO C++ library for asynchronou
## CXXOPTS C++ Library ## CXXOPTS C++ Library
- **Name:** cxxopts - **Name:** cxxopts
- **Website:** https://github.com/jarro2783/cxxopts/ - **Website:** https://github.com/jarro2783/cxxopts/
- **Copyright:** (c) 2014-2025 Christopher M. Kohlhoff - **Copyright:** (c) 2014-2026 Christopher M. Kohlhoff
- **License:** MIT License - **License:** MIT License
- **License Text:** See `third_party/cxxopts/LICENSE_1_0.txt` - **License Text:** See `third_party/cxxopts/LICENSE_1_0.txt`
## Wintun C++ Library ## Wintun C++ Library
- **Name:** wintun - **Name:** wintun
- **Website:** https://www.wintun.net/ - **Website:** https://www.wintun.net/
- **Copyright:** (c) 2018-2025 WireGuard LLC - **Copyright:** (c) 2018-2026 WireGuard LLC
- **License:** MIT License OR GPL-2.0 License - **License:** MIT License OR GPL-2.0 License
- **License Text:** See `third_party/wintun/` - **License Text:** See `third_party/wintun/`
- **Utilized Under:** MIT License - **Utilized Under:** MIT License

View File

@@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.16)
# If MAJOR is 0, and MINOR > 0, Version is BETA # If MAJOR is 0, and MINOR > 0, Version is BETA
project(ColumnLynx project(ColumnLynx
VERSION 1.0.0 VERSION 1.0.1
LANGUAGES CXX LANGUAGES CXX
) )
@@ -50,7 +50,7 @@ endif()
FetchContent_Declare( FetchContent_Declare(
Sodium Sodium
GIT_REPOSITORY https://github.com/robinlinden/libsodium-cmake.git GIT_REPOSITORY https://github.com/robinlinden/libsodium-cmake.git
GIT_TAG e5b985ad0dd235d8c4307ea3a385b45e76c74c6a # Last updated at 2025-04-13 GIT_TAG e5b985ad0dd235d8c4307ea3a385b45e76c74c6a
) )
set(SODIUM_DISABLE_TESTS ON CACHE BOOL "" FORCE) set(SODIUM_DISABLE_TESTS ON CACHE BOOL "" FORCE)

View File

@@ -57,7 +57,9 @@ openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | xxd -p -c 32
You can then set these keys accordingly in the **server_config** and **client_config** files. You can then set these keys accordingly in the **server_config** and **client_config** files.
### Creating the Tun Interface (Linux Server ONLY) ### Server Setup (Linux Server ONLY)
#### Creating the Tun Interface
In order for the VPN server to work, you need to create the Tun interface that the VPN will use. In order for the VPN server to work, you need to create the Tun interface that the VPN will use.
@@ -69,6 +71,88 @@ sudo ip link set dev lynx0 mtu 1420
sudo ip link set dev lynx0 up sudo ip link set dev lynx0 up
``` ```
#### Creating the systemd service
It is highly recommended to **run the server as a systemd service**, as systemd is the primary service manager on Linux.
**1. Create a file for the service**
```bash
sudo touch /etc/systemd/system/columnlynx.service
```
**2. Open the file in your editor of choice**
```bash
sudo nano /etc/systemd/system/columnlynx.service
# OR
sudo vim /etc/systemd/system/columnlynx.service
# OR any other editor of your choice...
```
**3. Configure the service**
**Replace** the **ExecStart** and **WorkingDirectory** paths with the paths where your binaries are stored.
If you configured your tun interface to belong to a custom user, you may also replace the **User** and **Group** with that user, however you must ensure that that user owns the **tun interface**, **config directory in /etc/columnlynx** and the **working directory**.
This is a **simple example** for the **root user** and the executable in **/opt/columnlynx**:
```
[Unit]
Description=ColumnLynx Server Service
After=network.target
[Service]
Type=simple
ExecStart=/opt/columnlynx/columnlynx_server
WorkingDirectory=/opt/columnlynx
User=root
Group=root
Restart=on-failure
StandardOutput=append:/var/log/columnlynx.log
StandardError=append:/var/log/columnlynx.err
[Install]
WantedBy=multi-user.target
```
**4. Reload systemd and enable the service**
```bash
sudo systemctl daemon-reload
sudo systemctl enable columnlynx.service
sudo systemctl start columnlynx.service
```
#### Set firewall rules
This part greatly depends on your firewall of choice. Generally you just need to **allow port 48042 on both TCP and UDP** (Both IPv4 and IPv6).
This example is for **UFW**:
```bash
sudo ufw allow 48042
sudo ufw reload
```
#### IPTables rules for forwarding (Optional)
In addition to creating the interface, you'll also need to make some **iptables** rules if you want to be able to **send traffic to foreign networks** (more like a *commercial VPN*).
You can do these as such (example with NFT IPTABLES):
- Enable the **generic IPv4 forwarding**:
```bash
sudo sysctl net.ipv4.ip_forward=1
```
- Create the masquerade (**Replace the IP subnet** with your own that you set in the config and **replace the interface** with your server's main (NOT *lynx0*) interface):
```bash
sudo nft add table nat
sudo nft add chain nat postroute { type nat hook postrouting priority 100 \; }
sudo nft add rule nat postroute ip saddr 10.10.0.0/24 oifname "eth0" masquerade
```
### Server ### Server
"**server_config**" is a file that contains the server configuration, **one variable per line**. These are the current configuration available variables: "**server_config**" is a file that contains the server configuration, **one variable per line**. These are the current configuration available variables:

View File

@@ -1,5 +1,5 @@
// tcp_client.hpp - TCP Client for ColumnLynx // tcp_client.hpp - TCP Client for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// udp_client.hpp - UDP Client for ColumnLynx // udp_client.hpp - UDP Client for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// libsodium_wrapper.hpp - Libsodium Wrapper for ColumnLynx // libsodium_wrapper.hpp - Libsodium Wrapper for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// protocol_structs.hpp - Network Protocol Structures // protocol_structs.hpp - Network Protocol Structures
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// session_registry.hpp - Session Registry for ColumnLynx // session_registry.hpp - Session Registry for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// net_helper.hpp - Network Helper Functions for ColumnLynx // net_helper.hpp - Network Helper Functions for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// tcp_message_handler.hpp - TCP Message Handler for ColumnLynx // tcp_message_handler.hpp - TCP Message Handler for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// tcp_message_type.hpp - TCP Message Types for ColumnLynx // tcp_message_type.hpp - TCP Message Types for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// udp_message_type.hpp - UDP Message Types for ColumnLynx // udp_message_type.hpp - UDP Message Types for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// virtual_interface.hpp - Virtual Interface for Network Communication // virtual_interface.hpp - Virtual Interface for Network Communication
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// panic_handler.hpp - Panic Handler for ColumnLynx // panic_handler.hpp - Panic Handler for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// utils.hpp - Utility functions for ColumnLynx // utils.hpp - Utility functions for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once
@@ -29,6 +29,9 @@ namespace ColumnLynx {
} }
namespace ColumnLynx::Utils { namespace ColumnLynx::Utils {
// Converts unix milliseconds to a local ISO 8601 formatted string; Defaults to local time; Will use UTC if local is false.
std::string unixMillisToISO8601(uint64_t unixMillis, bool local = true);
// General log function. Use for logging important information. // General log function. Use for logging important information.
void log(const std::string &msg); void log(const std::string &msg);
// General warning function. Use for logging important warnings. // General warning function. Use for logging important warnings.

View File

@@ -1,5 +1,5 @@
// tcp_connection.hpp - TCP Connection for ColumnLynx // tcp_connection.hpp - TCP Connection for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// tcp_server.hpp - TCP Server for ColumnLynx // tcp_server.hpp - TCP Server for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// udp_server.hpp - UDP Server for ColumnLynx // udp_server.hpp - UDP Server for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#pragma once #pragma once

View File

@@ -1,5 +1,5 @@
// main.cpp - Client entry point for ColumnLynx // main.cpp - Client entry point for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <asio.hpp> #include <asio.hpp>
@@ -68,7 +68,7 @@ int main(int argc, char** argv) {
if (optionsObj.count("help")) { if (optionsObj.count("help")) {
std::cout << options.help() << std::endl; std::cout << options.help() << std::endl;
std::cout << "This software is licensed under the GPLv2-only license OR the GPLv3 license.\n"; std::cout << "This software is licensed under the GPLv2-only license OR the GPLv3 license.\n";
std::cout << "Copyright (C) 2025, The ColumnLynx Contributors.\n"; std::cout << "Copyright (C) 2026, The ColumnLynx Contributors.\n";
std::cout << "This software is provided under ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n"; std::cout << "This software is provided under ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n";
return 0; return 0;
} }
@@ -110,6 +110,10 @@ int main(int argc, char** argv) {
aesKey->fill(0); // Defualt zeroed state until modified by handshake aesKey->fill(0); // Defualt zeroed state until modified by handshake
std::shared_ptr<uint64_t> sessionID = std::make_shared<uint64_t>(0); std::shared_ptr<uint64_t> sessionID = std::make_shared<uint64_t>(0);
if (insecureMode) {
warn("You have started the client with the --ignore-whitelist. This means that the client will NOT attempt to verify the server's public key. This is INSECURE and SHOULDN'T be used!");
}
asio::io_context io; asio::io_context io;
auto client = std::make_shared<ColumnLynx::Net::TCP::TCPClient>(io, host, port, sodiumWrapper, aesKey, sessionID, insecureMode, configPath, tun); auto client = std::make_shared<ColumnLynx::Net::TCP::TCPClient>(io, host, port, sodiumWrapper, aesKey, sessionID, insecureMode, configPath, tun);
auto udpClient = std::make_shared<ColumnLynx::Net::UDP::UDPClient>(io, host, port, aesKey, sessionID, tun); auto udpClient = std::make_shared<ColumnLynx::Net::UDP::UDPClient>(io, host, port, aesKey, sessionID, tun);

View File

@@ -1,5 +1,5 @@
// tcp_client.cpp - TCP Client for ColumnLynx // tcp_client.cpp - TCP Client for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/client/net/tcp/tcp_client.hpp> #include <columnlynx/client/net/tcp/tcp_client.hpp>

View File

@@ -1,5 +1,5 @@
// udp_client.cpp - UDP Client for ColumnLynx // udp_client.cpp - UDP Client for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/client/net/udp/udp_client.hpp> #include <columnlynx/client/net/udp/udp_client.hpp>

View File

@@ -1,5 +1,5 @@
// libsodium_wrapper.cpp - Libsodium Wrapper for ColumnLynx // libsodium_wrapper.cpp - Libsodium Wrapper for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/common/libsodium_wrapper.hpp> #include <columnlynx/common/libsodium_wrapper.hpp>

View File

@@ -1,5 +1,5 @@
// session_registry.cpp - Session Registry for ColumnLynx // session_registry.cpp - Session Registry for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/common/net/session_registry.hpp> #include <columnlynx/common/net/session_registry.hpp>

View File

@@ -1,5 +1,5 @@
// tcp_message_handler.cpp - TCP Message Handler for ColumnLynx // tcp_message_handler.cpp - TCP Message Handler for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/common/net/tcp/tcp_message_handler.hpp> #include <columnlynx/common/net/tcp/tcp_message_handler.hpp>

View File

@@ -1,29 +1,65 @@
// utils.cpp - Utility functions for ColumnLynx // utils.cpp - Utility functions for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/common/utils.hpp> #include <columnlynx/common/utils.hpp>
namespace ColumnLynx::Utils { namespace ColumnLynx::Utils {
std::string unixMillisToISO8601(uint64_t unixMillis, bool local) {
using namespace std::chrono;
// Convert milliseconds since epoch to system_clock::time_point
system_clock::time_point tp = system_clock::time_point(milliseconds(unixMillis));
// Convert to time_t for localtime conversion
std::time_t tt = system_clock::to_time_t(tp);
std::tm localTm;
if (local) {
#ifdef _WIN32
localtime_s(&localTm, &tt);
#else
localtime_r(&tt, &localTm);
#endif
} else {
#ifdef _WIN32
gmtime_s(&localTm, &tt);
#else
gmtime_r(&tt, &localTm);
#endif
}
// Format the time to ISO 8601
char buffer[30];
std::strftime(buffer, sizeof(buffer), "%Y-%m-%dT%H:%M:%S", &localTm);
// Append milliseconds
auto ms = duration_cast<milliseconds>(tp.time_since_epoch()) % 1000;
char iso8601[34];
std::snprintf(iso8601, sizeof(iso8601), "%s.%03lld", buffer, static_cast<long long>(ms.count()));
return std::string(iso8601);
}
void log(const std::string &msg) { void log(const std::string &msg) {
uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
std::cout << "\033[0m[" << std::to_string(now) << " LOG] " << msg << std::endl; std::cout << "\033[0m[" << unixMillisToISO8601(now) << " LOG] " << msg << std::endl;
} }
void warn(const std::string &msg) { void warn(const std::string &msg) {
uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
std::cerr << "\033[33m[" << std::to_string(now) << " WARN] " << msg << "\033[0m" << std::endl; std::cerr << "\033[33m[" << unixMillisToISO8601(now) << " WARN] " << msg << "\033[0m" << std::endl;
} }
void error(const std::string &msg) { void error(const std::string &msg) {
uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
std::cerr << "\033[31m[" << std::to_string(now) << " ERROR] " << msg << "\033[0m" << std::endl; std::cerr << "\033[31m[" << unixMillisToISO8601(now) << " ERROR] " << msg << "\033[0m" << std::endl;
} }
void debug(const std::string &msg) { void debug(const std::string &msg) {
#if DEBUG || _DEBUG #if DEBUG || _DEBUG
uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
std::cerr << "\033[95m[" << std::to_string(now) << " DEBUG] " << msg << "\033[0m" << std::endl; std::cerr << "\033[95m[" << unixMillisToISO8601(now) << " DEBUG] " << msg << "\033[0m" << std::endl;
#else #else
return; return;
#endif #endif
@@ -49,7 +85,7 @@ namespace ColumnLynx::Utils {
} }
std::string getVersion() { std::string getVersion() {
return "1.0.0"; return "1.0.1";
} }
unsigned short serverPort() { unsigned short serverPort() {

View File

@@ -1,5 +1,5 @@
// virtual_interface.cpp - Virtual Interface for Network Communication // virtual_interface.cpp - Virtual Interface for Network Communication
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/common/net/virtual_interface.hpp> #include <columnlynx/common/net/virtual_interface.hpp>

View File

@@ -1,5 +1,5 @@
// main.cpp - Server entry point for ColumnLynx // main.cpp - Server entry point for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <asio.hpp> #include <asio.hpp>
@@ -55,7 +55,7 @@ int main(int argc, char** argv) {
if (optionsObj.count("help")) { if (optionsObj.count("help")) {
std::cout << options.help() << std::endl; std::cout << options.help() << std::endl;
std::cout << "This software is licensed under the GPLv2-only license OR the GPLv3 license.\n"; std::cout << "This software is licensed under the GPLv2-only license OR the GPLv3 license.\n";
std::cout << "Copyright (C) 2025, The ColumnLynx Contributors.\n"; std::cout << "Copyright (C) 2026, The ColumnLynx Contributors.\n";
std::cout << "This software is provided under ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n"; std::cout << "This software is provided under ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n";
return 0; return 0;
} }
@@ -153,15 +153,28 @@ int main(int argc, char** argv) {
} }
const uint8_t* ip = packet.data(); const uint8_t* ip = packet.data();
uint32_t dstIP = ntohl(*(uint32_t*)(ip + 16)); // IPv4 destination address offset in IPv6-mapped header uint32_t srcIP = ntohl(*(uint32_t*)(ip + 12)); // IPv4 source address offset
uint32_t dstIP = ntohl(*(uint32_t*)(ip + 16)); // IPv4 destination address offset
auto session = SessionRegistry::getInstance().getByIP(dstIP); // First, check if destination IP is a registered client (e.g., server responding to client or client-to-client)
if (!session) { auto dstSession = SessionRegistry::getInstance().getByIP(dstIP);
Utils::warn("TUN: No session found for destination IP " + VirtualInterface::ipv4ToString(dstIP)); if (dstSession) {
// Destination is a registered client, forward to that client's session
udpServer->sendData(dstSession->sessionID, std::string(packet.begin(), packet.end()));
continue; continue;
} }
udpServer->sendData(session->sessionID, std::string(packet.begin(), packet.end())); // Destination is not a registered client, check if source is (for external routing)
auto srcSession = SessionRegistry::getInstance().getByIP(srcIP);
if (srcSession) {
// Source is a registered client, write to TUN interface to forward to external destination
tun->writePacket(packet);
continue;
}
// Neither source nor destination is registered, drop the packet
Utils::warn("TUN: No session found for source IP " + VirtualInterface::ipv4ToString(srcIP) +
" or destination IP " + VirtualInterface::ipv4ToString(dstIP));
} }
log("Shutting down server..."); log("Shutting down server...");

View File

@@ -1,5 +1,5 @@
// tcp_connection.cpp - TCP Connection for ColumnLynx // tcp_connection.cpp - TCP Connection for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/server/net/tcp/tcp_connection.hpp> #include <columnlynx/server/net/tcp/tcp_connection.hpp>

View File

@@ -1,5 +1,5 @@
// tcp_server.cpp - TCP Server for ColumnLynx // tcp_server.cpp - TCP Server for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/server/net/tcp/tcp_server.hpp> #include <columnlynx/server/net/tcp/tcp_server.hpp>

View File

@@ -1,5 +1,5 @@
// udp_server.cpp - UDP Server for ColumnLynx // udp_server.cpp - UDP Server for ColumnLynx
// Copyright (C) 2025 DcruBro // Copyright (C) 2026 DcruBro
// Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details. // Distributed under the terms of the GNU General Public License, either version 2 only or version 3. See LICENSES/ for details.
#include <columnlynx/server/net/udp/udp_server.hpp> #include <columnlynx/server/net/udp/udp_server.hpp>