Принцип проброса портов в Linux
Проброс портов (port forwarding) — мощная функция NAT, позволяющая перенаправлять сетевые соединения, поступающие на один хост, к другому. Это часто используется при работе с P2P-соединениями, туннелями или сервисами, когда локальный узел не имеет белого IP-адреса.
1. Подготовка
Для корректной работы проброса портов необходимо:
- Удалённый сервер с белым IP-адресом, подключение к которому организуется через VPN или другие виды туннелирования сетевого уровня (например, SSH).
- Убедиться, что нужные порты открыты на обоих хостах (локальном и удалённом). По-умолчанию netfilter не фильтрует порты.
- На удалённом сервере разрешить пересылку пакетов между интерфейсами.
- Настроить NAT и правила перенаправления в
iptablesилиnftables.
2. Разрешение пересылки пакетов
На удалённой машине включаем форвардинг IPv4 (и IPv6 при необходимости), если он выключен (NixOS включает пересылку автоматически при обнаружении требующей этого конфигурации):
# Временно, до перезагрузки
# Постоянно (добавить в /etc/sysctl.conf)
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
Проверить можно командой:
3. Настройка NAT и проброс порта
Допустим, нам нужно пробросить UDP-порт 10800 с внешнего интерфейса eth0 удалённого сервера на внутренний хост 10.10.0.2:10800.
Вариант 1: через iptables
# Пробрасываем порт 10800/UDP с внешнего интерфейса на внутренний адрес
# Включаем маскарадинг, чтобы пакеты с внутреннего хоста могли корректно возвращаться через внешний интерфейс
# Сохраняем правила
Вариант 2: через nftables
# Создаём таблицу NAT, если её нет
# Создаём цепочки
# Пробрасываем порт 10800/UDP
# Включаем маскарадинг
# Сохраняем правила
Для TCP будет тоже самое, достаточно заменить udp на tcp.
4. Проверка
Проверьте, что правила применились:
# или
Убедитесь, что порт доступен снаружи:
На локальной машине, куда проброшен порт, можно проверить, что пакеты действительно приходят, например, с помощью tcpdump:
5. NixOS
В этом плане NixOS простой как дрова. Для включения всего вышеперечисленного достаточно добавить этот блок в файл конфигурации (где бы он ни был):
{
networking = {
# Открываем порты
firewall = {
enable = true;
allowedUDPPorts = [ 10800 ];
};
# Включаем маскарадинг
nat = {
enable = true;
externalInterface = "eth0";
internalInterfaces = [ "wg0" ];
};
# Пробрасываем порт 10800/UDP
nftables = {
enable = true;
tables.nat.content = ''
chain prerouting {
type nat hook prerouting priority 0;
iifname "eth0" udp dport 10800 dnat to 10.10.0.2:10800
}
'';
};
};
}
6. Итог
Теперь входящие соединения на удалённый сервер по порту 10800/UDP будут автоматически перенаправляться на внутренний хост 10.10.0.2:10800.