Как перенаправить/переслать порт локально

Как перенаправить/переслать порт локально

Я хочу перенаправить порт 500 на порт 2500 в пределах того же хоста, и следующее работало на Lubuntu 16.04, но после перезагрузки и повторного запуска команд iptables я не могу заставить это работать:

iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 –dport 500 -j DNAT –to-destination 192.168.1.10:2500
iptables -A FORWARD -p udp -d 192.168.1.10 –dport 2500 -j ACCEPT

где 192.168.1.10 — IP моего локального хоста.
Для тестирования в одном сеансе я запускаю netcat:

nc -u 192.168.1.10:500

и во 2-м сеансе:

nc -l -u 500

и в 3-м сеансе:

nc -l -u 2500

Поэтому я хочу, чтобы данные, которые я ввожу в сеансе 1, были получены в сеансе 3, а не в сеансе 2, который у меня работал, но не может заработать снова.

Я также попробовал:

iptables -t nat -A PREROUTING -p udp --dport 500 -j REDIRECT --to-port 2500

но пакеты по-прежнему принимаются на порт 500, а не 2500.

UFW отключен, и чтобы убедиться, что iptables работает, я попробовал:

iptables -A INPUT -p udp --dport 500 -j DROP

и затем пакеты не были получены на порту 500 или 2500, как ожидалось. Переадресация портов включена:

# cat /proc/sys/net/ipv4/ip_forward
1

Вывод сеанса ниже:

root@mike-TravelMate-8371:~/nat/out# iptables -t nat -S;iptables  -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p udp -m udp --dport 500 -j DNAT --to-destination 192.168.1.10:2500
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p udp -m udp --dport 2500 -j ACCEPT
root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 2500 > nc_2500.out &
[1] 29806
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout

root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 500 > nc_500.out &
[2] 29810
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout

root@mike-TravelMate-8371:~/nat/out# jobs
[1]-  Running                 nohup nc -l -u 2500 > nc_2500.out &
[2]+  Running                 nohup nc -l -u 500 > nc_500.out &
root@mike-TravelMate-8371:~/nat/out# nc -u 192.168.1.10 500
test forwarding UDP port 500 to 2500
^C
[2]+  Done                    nohup nc -l -u 500 > nc_500.out
root@mike-TravelMate-8371:~/nat/out# head nc*.out
==> nc_2500.out <==

==> nc_500.out <==
test forwarding UDP port 500 to 2500
root@mike-TravelMate-8371:~/nat/out# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:1e:33:24:98:86 brd ff:ff:ff:ff:ff:ff
3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:22:fb:64:bd:42 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic wlp1s0
       valid_lft 85651sec preferred_lft 85651sec
    inet6 fd58:7f66:569d:5300:c5df:415:6c56:50d6/64 scope global temporary dynamic 
       valid_lft 6788sec preferred_lft 3188sec
    inet6 fd58:7f66:569d:5300:75d:bbe9:652e:6587/64 scope global mngtmpaddr noprefixroute dynamic 
       valid_lft 6788sec preferred_lft 3188sec
    inet6 fe80::e214:14f8:d95c:73a7/64 scope link 
       valid_lft forever preferred_lft forever
4: vboxnet0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.1/24 brd 192.168.56.255 scope global vboxnet0
       valid_lft forever preferred_lft forever
    inet6 fe80::800:27ff:fe00:0/64 scope link 
       valid_lft forever preferred_lft forever
root@mike-TravelMate-8371:~/nat/out# ip route
default via 192.168.1.1 dev wlp1s0  proto static  metric 600 
192.168.1.0/24 dev wlp1s0  proto kernel  scope link  src 192.168.1.10  metric 600 
192.168.56.0/24 dev vboxnet0  proto kernel  scope link  src 192.168.56.1 linkdown 

Причина, по которой я хочу перенаправить порты, заключается в том, что я хочу настроить VPN между внешним сервером и гостем, работающим в Virtual Box. Гость Vbox использует сеть "NAT", поэтому у Vbox есть собственная переадресация портов для переадресации портов на виртуальную машину с IP 10.0.2.15, поэтому в Vbox правила переадресации портов следующие:

  1. TCP Host 2222 к Vbox guest 22
  2. UDP Host 4500 на Vbox guest 4500
  3. UDP Host 2500 для Vbox guest 500

Первый вариант означает, что я могу подключиться к гостевой системе по ssh, используя «ssh -p 2222[email protected]"

Второе означает, что я могу отправлять пакеты UDP на 4500, то есть я могу отправлять пакеты с помощью «nc -u 192.168.1.10 4500» с хоста и видеть, как они принимаются на гостевой системе Vbox с помощью «nc -l -u 4500» (пакеты НЕ видны, если вы запускаете «nc -l -u 4500» на хосте)

Третья причина заключается в том, что Vbox НЕ будет перенаправлять зарезервированные порты ниже 1024, поэтому я не могу перенаправить порт 500. Поэтому с помощью этого правила я могу использовать «nc -u 192.168.1.10 2500» на хосте и получать UDP-пакеты на гостевой Vbox, используя «nc -l -u 500».

Итак, я хочу перенаправить порты UDP 500 на хосте на порт 2500, чтобы Vbox перенаправлял их на порт 500 на гостевой машине, и это работало, но после перезагрузки и повторного запуска команд iptables это не сработало, и после нескольких часов работы над этим я не могу понять, что я сделал по-другому.

Я пробовал настроить iptables (и Vbox) с переадресацией TCP, но это тоже не работает. Я пробовал UFW и переадресацию локальных портов с запущенным Vbox и без него, но порты так и не переадресуются.

Я также попробовал перенаправить порт на несуществующий IP:

iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 --dport 500 -j DNAT --to-destination 192.168.1.30:500
iptables -A FORWARD -p udp -d 192.168.1.30 --dport 500 -j ACCEPT

Итак, здесь IP 192.168.1.30 не существует, но если я запущу «nc -u 192.168.1.10 500» в одном сеансе, то я все равно смогу получать пакеты, прослушиваемые на хосте (IP 192.168.1.10).

Я попробовал перенаправить TCP-порт 3222 на порт 22, чтобы можно было протестировать без netcat, но это не работает.

root@mike-TravelMate-8371:~/nat# iptables -t nat -S;iptables  -S 
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p tcp -m tcp --dport 3222 -j DNAT --to-destination 192.168.1.10:22
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p tcp -m tcp --dport 22 -j ACCEPT
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 22
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
^C
Connection closed by foreign host.
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 3222
Trying 192.168.1.10...
telnet: Unable to connect to remote host: Connection refused
root@mike-TravelMate-8371:~/nat# 

Итак, здесь я могу напрямую подключиться к порту SSH, используя порт 22, но не могу через порт 3222, поэтому переадресация не работает.

решение1

Правила Iptables не сохраняются после перезагрузки. Возможно, вам придется добавить правила обратно после перезагрузки или использовать iptables-save / iptables-persistent. Перейдите по этой ссылке. Как сделать определенный набор правил iptables постоянным?

решение2

У меня была та же потребность, и я заставил ее работать с этими двумя командами. Мне нужно было перенаправить только локальные звонки, но 127.0.0.1это можно заменить внешним IP

sudo iptables -t nat -A PREROUTING -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235
sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235

Связанный контент