У меня есть сервер linux в моей лаборатории (в дальнейшем называемый pc1), и у меня есть windows pc2, на котором запущен игровой сервер. Но поскольку это частная сеть, и единственный компьютер, к которому есть доступ в Интернет, - это компьютер pc1. Но я хочу, чтобы игровой сервер на pc2 был виден за пределами интернета. Но у меня нет разрешения на доступ к роутеру нашей лаборатории. Поэтому я хочу, чтобы pc1 действовал как своего рода маршрутизатор, который перенаправляет pc1:port1 на pc2:port2 и обратно. И тогда запрос из внешнего интернета может получить доступ к pc2:port2, а ответ от pc2 также может достичь внешнего. Есть ли способ достичь этого?
1 ответ
Давайте назовем eth0 интерфейсом (IF), на котором pc1 связан с маршрутизатором, а eth1 - IF, на котором pc1 связан с pc2. Вам нужны эти команды, выданные как sudo, на pc1:
service network-manager stop
ifconfig eth0 down
ifconfig eth0 up
dhclient eth0
ifconfig eth1 down
ifconfig eth1 192.168.27.1 up
route add default gw The_IP_Addres_of_Your_Router
route add -net 192.168.27.0/24 dev eth1
echo nameserver 8.8.8.8 >> /etc/resolv.conf
echo nameserver 8.8.4.4 >> /etc/resolv.conf
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT
На компьютере с Windows вам нужно будет настроить статический IP-адрес в диапазоне 192.168.27.0/24, например 192.168.27.2, и установить 192.168.27.1 в качестве шлюза по умолчанию.
Это работает на Debian-подобных системах. Если у вас есть другой дистрибутив, вам придется адаптировать его под свои нужды. Например, в Systemd-дистрибутивах (Arch-Linux, Fedora, SuSE 19 ..) первая команда - systemctl stop network-manager
).
Первая команда отключает сетевой менеджер, который мешает большинству пользовательских операций. Следующие 3 команды подключают pc1 к маршрутизатору, а дальнейшие команды 5-6 подключают pc1 к pc2. Затем команды 7-8 настраивают таблицу маршрутизации, команды 9-10 настраивают DNS, команда 11 включает пересылку Ipv4 в ядре, а команды 12-13 устанавливают правила для iptables, выполняющих функции пересылки NAT и принимающих соединения от рс2.
Это может быть легко написано.
Если вы хотите разрешить связь только на определенных портах, замените
iptables --append FORWARD --in-interface eth1 -j ACCEPT
с
iptables --append FORWARD --in-interface eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables --append FORWARD --in-interface eth1 -p Protocol_To_Be_Allowed --sport Port_To_Be_Forwarded -j ACCEPT
iptables --append FORWARD --in-interface eth1 -j DROP