У меня есть сервер Ubuntu 16.04 на Linode.
Моя цель состояла в том, чтобы запустить несколько веб-серверов на нескольких портах, а затем подключиться к ним, используя адрес моего хоста,
.
Я установил Nginx, и он действительно заработал. Я мог посетить
и увидеть свой сайт.
Проблемы возникли, когда я пытался добавить правила iptable в соответствии с их рекомендациями по защите сервера . После выполнения следующих команд, Я больше не могу подключиться по этому URL.
Я вижу эту ошибку в моем браузере
This site can’t be reached
<url> refused to connect.
Я могу воспроизвести эту ошибку с помощью следующих сценариев. Запуск первого приводит к тому, что я не могу подключиться. Запуск второго и затем позволяет мне подключиться снова:
Устанавливает рекомендуемые Linode правила iptables
# setup_iptables.sh
rm /tmp/v4
rm /tmp/v6 cp ./tmp_v4_rules /tmp/v4
cp ./tmp_v6_rules /tmp/v6
iptables-restore < /tmp/v4
ip6tables-restore < /tmp/v6
Отключает межсетевой экран , как рекомендовано здесь
# stop_firewall.sh
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
В сценарии start_iptables.sh я имею в виду файлы tmp_v4_rules
и tmp_v6_rules
. Вот как они выглядят. Они взяты из руководства по безопасности Linode, на которое я ссылался ранее.
tmp_v4_rules копируется в / tmp / v4
*filter
# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
# Allow ping.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
# Allow SSH connections.
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere
# (the normal ports for web servers).
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# Allow inbound traffic from established connections.
# This includes ICMP error returns.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Log what was incoming but denied (optional but useful).
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
# Reject all other inbound.
-A INPUT -j REJECT
# Log any traffic that was sent to you
# for forwarding (optional but useful).
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7
# Reject all traffic forwarding.
-A FORWARD -j REJECT
COMMIT
tmp_v6_rules копируется в / tmp / v6
*filter
# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s ::1/128 -j REJECT
# Allow ICMP
-A INPUT -p icmpv6 -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere
# (the normal ports for web servers).
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# Allow inbound traffic from established connections.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Log what was incoming but denied (optional but useful).
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7
# Reject all other inbound.
-A INPUT -j REJECT
# Log any traffic that was sent to you
# for forwarding (optional but useful).
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7
# Reject all traffic forwarding.
-A FORWARD -j REJECT
COMMIT
Я был бы признателен за рекомендацию, как чтобы отладить это. Я полагаю, что рекомендации iptables существуют не просто так, и это нехорошо, что мне приходится выключать брандмауэр, чтобы подключиться к моему сайту. Тем не менее, я понятия не имею, какая часть набора правил iptables не работает.
Из комментария Майкла было предложено посмотреть файл журнала. Из здесь рекомендуется посмотреть /var/log/kern.log
, чтобы увидеть отклонения iptables.
Я действительно вижу кучу отказов. На самом деле кажется, что все отрицает. Вот один пример:
Sep 1 09:58:31 li1196-141 kernel: iptables_INPUT_denied:
IN=eth0 OUT= MAC=<OMMITTED> SRC=<OMMITTED> DST=<OMMITTED> LEN=60
TOS=0x00 PREC=0x00 TTL=52 ID=63084 DF PROTO=TCP SPT=36306 DPT=23
WINDOW=5808 RES=0x00 SYN URGP=0
на самом деле вообще не понимаю, что это значит. Нет опыта работы с iptables. У меня 600 уникальных журналов отказа. Не уверен, что искать.
Еще несколько журналов из /var/log/kern.log:
Я очистил файл, запустил первый скрипт, попытался подключиться, затем появились эти 5 файлов. При обновлении окна браузера больше строк в файл журнала не добавлялось.
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=33801 DF
PROTO=TCP SPT=34834
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=34016 DF
PROTO=TCP SPT=34839
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=31437 DF
PROTO=TCP SPT=34836
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=62629 DF
PROTO=TCP SPT=34835
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
I ' Я почти уверен, что это подходящие журналы для моей попытки подключения. Мой веб-сервер работает на порту 6066, и в журнале я вижу DPT = 6066
Как заметил Майкл, я пытался подключиться через некоторые произвольные порты (6066, 1234, 9292), но я не внес эти порты в белый список в конфигурации iptables.
I добавил следующие строки:
-A INPUT -p tcp --dport 6066 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 1234 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 9292 -m state --state NEW -j ACCEPT
затем запустил мой сценарий setup_iptables.sh для загрузки новых правил.