Я играю с iptables и пытаюсь выполнить довольно простую задачу: перенаправить трафик на порт 8888 на моем Ubuntu на другой сервер, расположенный с IP 172.21.16.1 и портом 5000.
В моей среде у меня есть рабочая станция Windows. Ubuntu обслуживается Hyper-v. Моя рабочая станция Windows имеет несколько сетевых интерфейсов, в том числе созданных с помощью Hyper-v. Там IP-адрес, присвоенный 172.21.16.1
. У Ubuntu есть IP 172.21.26.237
.
Я запустил простой веб-сервер на рабочей станции Windows, который прослушивает порт 5000 на предмет HTTP-запросов. Если открытая страница http://172.21.16.1:5000 в браузере (неважно, Ubuntu это или Windows) я вижу ожидаемый результат.
Я проверил несколько статей, и похоже, что все должно быть легко и понятно. Я выполнил следующие команды:
sudo iptables -A PREROUTING -t nat -p tcp --dport 8888 -j DNAT --to-destination 172.21.16.1:5000
sudo iptables -A POSTROUTING -t nat -p tcp --dport 8888 -j SNAT --to-source 172.21.26.237
Если я открою страницу http://172.21.26.237:8888/ с моей рабочей станции Windows - тайм-аут.
Что я проверил:
(1) sysctl net.ipv4.ip_forward
возвращается net.ipv4.ip_forward = 1
(2) iptable-save дает следующий контент:
# Generated by iptables-save v1.8.4 on Sun Jul 19 20:15:37 2020
*filter
:INPUT ACCEPT [1066:122755]
:FORWARD ACCEPT [90:4680]
:OUTPUT ACCEPT [255:18156]
COMMIT
# Completed on Sun Jul 19 20:15:37 2020
# Generated by iptables-save v1.8.4 on Sun Jul 19 20:15:37 2020
*nat
:PREROUTING ACCEPT [233:25903]
:INPUT ACCEPT [198:18944]
:OUTPUT ACCEPT [23:1798]
:POSTROUTING ACCEPT [41:2734]
-A PREROUTING -p tcp -m tcp --dport 8888 -j DNAT --to-destination 172.21.16.1:5000
-A POSTROUTING -p tcp -m tcp --dport 8888 -j SNAT --to-source 172.21.26.237
COMMIT
# Completed on Sun Jul 19 20:15:37 2020
(3) Следы от tcpdump ..... port 8888
:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
22:18:38.078418 IP (tos 0x0, ttl 128, id 35408, offset 0, flags [DF], proto TCP (6), length 52)
172.21.16.1.63351 > 172.21.26.237.8888: Flags [S], cksum 0xa604 (correct), seq 2988342963, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
22:18:38.078566 IP (tos 0x0, ttl 128, id 35409, offset 0, flags [DF], proto TCP (6), length 52)
172.21.16.1.63352 > 172.21.26.237.8888: Flags [S], cksum 0x04c0 (correct), seq 3168343356, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
22:18:38.329143 IP (tos 0x0, ttl 128, id 35410, offset 0, flags [DF], proto TCP (6), length 52)
172.21.16.1.63353 > 172.21.26.237.8888: Flags [S], cksum 0x58e7 (correct), seq 371877827, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
22:18:39.084897 IP (tos 0x0, ttl 128, id 35411, offset 0, flags [DF], proto TCP (6), length 52)
(4) Следы от tcpdump ..... port 5000
:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
22:19:34.468908 IP (tos 0x0, ttl 127, id 35424, offset 0, flags [DF], proto TCP (6), length 52)
172.21.16.1.63367 > 172.21.16.1.5000: Flags [S], cksum 0x09ca (correct), seq 3528594630, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
22:19:34.468992 IP (tos 0x0, ttl 127, id 35425, offset 0, flags [DF], proto TCP (6), length 52)
172.21.16.1.63368 > 172.21.16.1.5000: Flags [S], cksum 0x3138 (correct), seq 561028665, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
22:19:34.729633 IP (tos 0x0, ttl 127, id 35426, offset 0, flags [DF], proto TCP (6), length 52)
172.21.16.1.63369 > 172.21.16.1.5000: Flags [S], cksum 0xc4c0 (correct), seq 920253766, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
22:19:35.473332 IP (tos 0x0, ttl 127, id 35428, offset 0, flags [DF], proto TCP (6), length 52)
(5) А вот и вывод из curl -v url:8888
выполняется на окнах:
> curl -v 172.21.26.237:8888
* Rebuilt URL to: 172.21.26.237:8888/
* Trying 172.21.26.237...
* TCP_NODELAY set
* connect to 172.21.26.237 port 8888 failed: Timed out
* Failed to connect to 172.21.26.237 port 8888: Timed out
* Closing connection 0
curl: (7) Failed to connect to 172.21.26.237 port 8888: Timed out
К сожалению, до сих пор понятия не имею.
DNAT выглядит хорошо, но SNAT, думаю, я бы пошел
-A POSTROUTING -p tcp -m tcp --dport 5000 -j SNAT --to-source 172.21.26.237
вместо того
-A POSTROUTING -p tcp -m tcp --dport 8888 -j SNAT --to-source 172.21.26.237
Я имею в виду, что, поскольку PREROUTING изменяет порт с 8888 на 5000, нет смысла ожидать 8888 где-либо после этого этапа.