У меня есть сервер Ubuntu 16.04 на Linode.
Моя цель состояла в том, чтобы запустить несколько веб-серверов на нескольких портах, а затем подключиться к ним, используя URL-адрес моего хоста, <my_id>.members.linode.com
.
Я установил Nginx и все заработало. Я мог бы посетить <my_url>:<my_port>
и посмотрите мой сайт.
Проблемы возникли, когда я пытался добавить правила 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
Я почти уверен, что это подходящие журналы для моей попытки подключения. Мой веб-сервер работает на порту 6066, и в журнале я вижу DPT=6066
Как заметил Майкл, я пытался подключиться через несколько произвольных портов (6066, 1234, 9292), но я не вносил эти порты в белый список в конфигурации iptables.
Я добавил следующие строки:
-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 для загрузки новых правил.