Моя цель - запустить веб-сервер на порту 3000 и сделать его доступным для моей сети через порт 80. Лучший ответ, который я нашел до сих пор, - это приятный лайнер.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
Но это влияет только на входящие пакеты, и я хотел бы, чтобы клиент получил ответ от порта 80. Следующая проблема заключается в том, что веб-сервер должен быть доступен только через порт 80. Пока я придерживаюсь этой конфигурации.
# Default Chain Policies
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
# Allow Loopback Access
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
iptables -t nat -A POSTROUTING -p tcp -o eth0 --sport 3000 -j SNAT --to 192.168.0.2:80
iptables -t filter -A INPUT -i eth0 -p tcp --dport 3000 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 3000 -j ACCEPT
Вам необходимо разрешить состояния «СВЯЗАННЫЙ» и «УСТАНОВЛЕННЫЙ». Нет необходимости в правиле POSTROUTING.
Веб-сервер, такой как apache, может подключаться к порту 80, потому что он работает как root. Это позволяет ему подключаться к привилегированному порту <1024, но после этого он теряет привилегии root и обрабатывает HTTP-запрос от имени непривилегированного пользователя. Итак, вы должны иметь возможность сделать что-то подобное, если хотите привязаться к порту 80.
Кажется, это помогает. Веб-сервер сейчас доступен более 80, а не более 3000.
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
iptables -t filter -A INPUT -i eth0 -p tcp --dport 3000 -m state --state NEW,ESTABLISHED -m mark --mark 1 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 3000 -m state --state ESTABLISHED -j ACCEPT