В 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