Назад | Перейти на главную страницу

Перенаправление порта 8080 на порт 80 - как добавить в файл / etc / sysconfig / iptables?

В CentOS 7 Linux (действующий как LAMP - а не «брандмауэр / шлюз») я создал настраиваемая служба systemd для запуска встроенной Jetty на порту 8080 от имени пользователя nobody:

[Unit]
Description=WebSocket Handler Service
After=network-online.target

[Service]
Type=simple
User=nobody
Group=nobody
ExecStart=/usr/bin/java -classpath '/usr/share/java/jetty/*' de.afarber.MyHandler 123.123.123.123:8080
ExecStop=/bin/kill ${MAINPID}
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Однако мне действительно нужно, чтобы сервер прослушивал порт 80, чтобы подключения к нему через WebSocket работали даже через корпоративные брандмауэры.

Документ Jetty на Настройка доступа к порту 80 для пользователя без полномочий root предлагает выполнить следующую команду:

# iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

К счастью, я уже использую iptables-services пакет на моем выделенном сервере и текущий /etc/sysconfig/iptables файл содержит:

*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 25,80,443,8080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 2/min --limit-burst 1 -j ACCEPT
COMMIT

Моя проблема в том, что я не знаю правильного синтаксиса PREROUTING для указанного выше файла.

Я пробовал выполнить команду выше, а затем iptables -S в надежде, что iptables перечислит мне нужную строку - но этого не произошло.

ОБНОВИТЬ:

К сожалению, следующие /etc/sysconfig/iptables файл не работает:

*nat
:INPUT ACCEPT
:OUTPUT ACCEPT
:PREROUTING ACCEPT
:POSTROUTING ACCEPT
-A PREROUTING -p tcp -m tcp --dst 123.123.123.123 --dport 80 -j REDIRECT --to-ports 8080
COMMIT

*filter
:INPUT ACCEPT
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -p tcp -m tcp -m state --state NEW -m multiport --dports 25,80,443,8080 -j ACCEPT
-A INPUT -p tcp -m tcp -m state --state NEW --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 2/min --limit-burst 1 -j ACCEPT
-A FORWARD -p tcp -m tcp --dst 123.123.123.123 --dport 8080 -j ACCEPT
COMMIT

Мне нужно, чтобы входящие HTTP-соединения на 123.123.123.123:80 перенаправлялись на 123.123.123.123:8080 (где Jetty слушает как пользователь "nobody"), но по какой-то причине этого не происходит.

Когда я просматриваю http://123.123.123.123:8080 затем я вижу ответ Jetty.

Но когда я перехожу к http://123.123.123.123 в соединении отказано.

Кто-нибудь может указать мне ошибку?

Вот мой ток nat стол:

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             afarber.de           tcp dpt:http redir ports 8080

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Вот мой ток filter стол:

# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere             icmp any
ACCEPT     tcp  --  anywhere             anywhere             tcp state NEW multiport dports smtp,http,https,webcache
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN state NEW limit: avg 2/min burst 1

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             afarber.de           tcp dpt:webcache

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Вот мой /etc/sysctl.conf файл:

net.ipv4.ip_forward=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1

Проблема: запросы к -d 123.123.123.123 --dport 80 не перенаправлены на 8080

ОБНОВЛЕНИЕ 2:

Строчка тоже не помогает:

-A PREROUTING -p tcp -m tcp -i eth0:1 --dst 123.123.123.123 --dport 80 -j DNAT --to-destination :8080

связь с 123.123.123.123:80 все еще отброшен

Это было бы так:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [3:353]
:POSTROUTING ACCEPT [3:353]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
COMMIT
# Completed on Mon Jun 20 23:41:41 2016

Вы знаете, как это сделать проще? Я предполагаю, что вы отключили firewalld и установили iptables-services, потому что хотели, чтобы ваш centos7 работал как centos6.

"/ etc / sysconfig / iptables" - это файл, в котором службы iptables сохраняют правила. Вы можете редактировать его вручную, но в этом нет необходимости. Вы можете просто ввести любые правила, используя команду «iptables», а затем «service iptables save», чтобы сохранить текущие активные правила в файл.

Вы также можете сделать так, чтобы правила сохранялись каждый раз при перезапуске службы iptables, установив здесь "/ etc / sysconfig / iptables-config" IPTABLES_SAVE_ON_STOP и IPTABLES_SAVE_ON_RESTART

Думаю, я наконец понял это - NAT HOWTO Говорит, что -j REDIRECT это просто ярлык для -j DNAT с адресом назначения, являющимся адресом интерфейса:

Существует специальный случай NAT назначения, называемый перенаправлением: это простое удобство, которое в точности эквивалентно выполнению DNAT по адресу входящего интерфейса.

Но в моем случае это просто не может работать, потому что мой сервер CentOS 7 имеет 4 IP-адреса.

(Мне очень жаль, что я не упомянул об этом, потому что не думал, что это имеет значение).

В eth0 порт 80 запускает Apache (который может отбрасывать права root).

И в eth0:1 порт 8080 запускает Jetty (который не может сбросить рут права). Но мне нужна Jetty на порту 80 (чтобы веб-сокеты работали для корпоративных пользователей за прокси-серверами), и я хочу, чтобы она запускалась как пользователь «никто».

И теперь я понял, как перенаправлять входящие запросы с помощью net.ipv4.ip_forward=1 в /etc/sysctl.conf и в следующем / etc / sysconfig / iptables:

*filter
:INPUT DROP
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m multiport --dports 25,80,443,8080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 2/min --limit-burst 1 -j ACCEPT
COMMIT

*nat
:INPUT ACCEPT
:OUTPUT ACCEPT
:PREROUTING ACCEPT
:POSTROUTING ACCEPT
-A PREROUTING -p tcp --dst 123.123.123.123 --dport 80 -j DNAT --to-destination 123.123.123.123:8080
COMMIT