Я использую компьютер с Linux в качестве шлюза/брандмауэра между более широкой сетью и несколькими серверами.
WAN -> [ 192.x | GATEWAY (Linux) | 10.x ] -> [ 10.0.0.100 | SERVER (Linux) ]
Эта конфигурация отлично работает как шлюз. Нижестоящие узлы могут нормально подключаться к Интернету, и я могу перенаправлять запросы на 80
шлюзе на сервер 8000
с помощью firewall-cmd
.
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.100:toport=8000
Однако, как только я запускаю эту команду и начинается переадресация портов, сервер ( 10.0.0.100
) больше не может связаться с WAN
портом on 80
. Это проблема, поскольку это означает, что сервер не может получить доступ ни к какому HTTP-трафику в Интернете.
Сервер может curl
любой интернет ресурскромеесли он находится на порту, 80
пока действует это правило переадресации.
Шлюз имеет только одну физическую сетевую карту и находится в external
зоне, что позволяет осуществлять маскировку.
gateway:$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether dc:a6:32:1b:40:9e brd ff:ff:ff:ff:ff:ff
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.1/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::dea6:32ff:fe1b:409e/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether dc:a6:32:1b:40:9f brd ff:ff:ff:ff:ff:ff
gateway:$ ip route
default via 192.168.0.1 dev eth0 onlink
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2
Вероятно, я упускаю какие-то фундаментальные принципы работы сетей, что мешает мне понять эту проблему.
Я предполагаю, что правило пересылки делает это таквсеТрафик порта 80 (входящий или исходящий) искажается, хотя на самом деле мне нужно, чтобы входящий трафик с 80 перенаправлялся на порт 8000 для моего сервера.
Может быть, конфигурация сети неверна? Или есть что-то в том, как я использую, firewalld
что недопустимо?
решение1
Возможно iptables
, или его firewalld
можно использовать в моем сценарии для переадресации портов на определенные машины в нисходящей подсети, но я не смог понять, как заставить это работать.
Это может быть неидеальным решением, но я создал на своей gateway
машине службу systemd, которая socat
перенаправляет трафик с определенного порта на определенный IP-адрес.
Это скрипт, который запускается на моем компьютере для gateway
переадресации портов 80
и 443
.10.0.0.100
firewall-cmd --zone=external --add-port=80/tcp
socat TCP4-LISTEN:80,fork TCP4:10.0.0.100:80 &
firewall-cmd --zone=external --add-port=443/tcp
socat TCP4-LISTEN:443,fork TCP4:10.0.0.100:443 &
wait