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

Восстановлен сервер с теми же правилами брандмауэра, но теперь NFS не работает

У меня есть веб-сервер Django / Nginx / Gunicorn («web02») и файловый сервер Nginx («fs02»), который используется для хранения пользовательских изображений. Когда пользователь загружает изображения через веб-сайт, они сохраняются на файловом сервере через каталог, который перекрестно монтируется с файлового сервера через NFS. Я создаю свои серверы, используя Ansible playbook, который подготавливает каждый сервер, а затем сначала настраивает файловый сервер, а затем веб-сервер. Когда я изначально строю свои серверы, NFS работает отлично. Однако, если я перестрою и перенастрою только файловый сервер (например, если он выйдет из строя, и мне нужно перестроить и восстановить его), NFS не будет работать. В этой ситуации мой веб-сервер не может видеть экспортированный каталог на файловом сервере. Я подтвердил это двумя способами:

# From web02
$ sudo rpcinfo -u fs02 mountd
rpcinfo: RPC: Unable to receive; errno = Connection refused
program 100005 version 0 is not available

$ sudo showmount -e fs02
rpc mount export: RPC: Unable to receive; errno = Connection refused

Если я отключу брандмауэр на своем файловом сервере и повторно выполню обе указанные выше команды, они будут выполнены успешно, и я смогу смонтировать файловую систему. Но если я снова включу брандмауэр, обе команды снова не работают. Что сбивает с толку, так это то, что правила брандмауэра, которые я включил при перестройке файлового сервера, идентичны правилам, которые включаются при первоначальной сборке файлового сервера, поскольку файл правил создается моей книгой воспроизведения Ansible. Вот эти правила:

*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 rsync from the web server
-A INPUT -p tcp -s <web-server-ip-addr> --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

# Allow NFS from the web server
-A INPUT -s <web-server-ip-addr> -p tcp -m multiport --dport 111,2049 -j ACCEPT
-A INPUT -s <web-server-ip-addr> -p udp -m multiport --dport 111,2049 -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 which 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

Вот результат выполнения "iptables -L" на файловом сервере после применения вышеуказанных правил:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  loopback/8           anywhere             reject-with icmp-port-unreachable
ACCEPT     icmp --  anywhere             anywhere             state NEW icmp echo-request
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http state NEW
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https state NEW
ACCEPT     tcp  --  li470-156.members.linode.com  anywhere             tcp dpt:rsync state NEW,ESTABLISHED
ACCEPT     tcp  --  li470-156.members.linode.com  anywhere             multiport dports sunrpc,nfs
ACCEPT     udp  --  li470-156.members.linode.com  anywhere             multiport dports sunrpc,nfs
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_INPUT_denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_FORWARD_denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:rsync state ESTABLISHED

Файловый сервер знает, что нужно экспортировать общий каталог на веб-сервер:

# /etc/exports on fs02
/var/www/mysite.com <web-server-ip-addr>/32(rw,no_root_squash,subtree_check)

Веб-сервер знает, как смонтировать общий каталог с файлового сервера:

# /etc/fstab on web02
/dev/sda     /               ext4    errors=remount-ro 0       1
/dev/sdb     none            swap    sw              0       0
<file-server-ip-addr>:/var/www/mysite.com /var/www/mysite.com nfs rw 0 0

Есть ли еще один шаг, о котором я не знаю?

ОБНОВИТЬ

Вот правила брандмауэра, если я запустил команду «sudo iptables -L -n -v»:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 REJECT     all  --  !lo    *       127.0.0.0/8          0.0.0.0/0            reject-with icmp-port-unreachable
    1    84 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW icmptype 8
   10   592 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW
    3   144 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 state NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 state NEW
    0     0 ACCEPT     tcp  --  *      *       45.79.66.59          0.0.0.0/0            tcp dpt:873 state NEW,ESTABLISHED
    6   364 ACCEPT     tcp  --  *      *       45.79.66.59          0.0.0.0/0            multiport dports 111,2049
   15  1196 ACCEPT     udp  --  *      *       45.79.66.59          0.0.0.0/0            multiport dports 111,2049
 2508 1101K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
   41  1941 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables_FORWARD_denied: "
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 1983 packets, 259K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:873 state ESTABLISHED

Они показывают правильный IP-адрес для web02.

Я также отключил директиву ограничения журнала и проверял / var / log / syslog и / var / log / messages на fs02 и не вижу ничего подходящего. Однако я проверил / var / log / messages на web02 и вижу это сообщение:

<timestamp> debian kernel: nfs: server 45.79.65.48 not responding, timed out

Это сообщение повторяется каждые пять минут. Я подозреваю, что это IP-адрес более ранней сборки файлового сервера, поскольку я могу увидеть, что это адрес linode.com, если я запустил на нем "whois". Но что более интересно, если я перехожу к «grep -Rn 45.79.65.48 / etc», я вижу этот адрес в файле / etc / mtab. Теперь я вижу, что это IP-адрес предыдущего файлового сервера, поскольку я пренебрегал отключением каталога файлового сервера до того, как уничтожил и перестроил файловый сервер. Я сделал "sudo umount -l /var/www/mysite.com", чтобы размонтировать его. Затем я выполнил "sudo mount -a" на веб-сервере, и теперь я вижу, что каталог файлового сервера смонтирован на веб-сервере. Однако, если я повторно запустил команду «sudo rpcinfo -u fs02 mountd» на веб-сервере, я все равно получаю сообщение «Соединение отклонено». Я не понимаю, как я могу получить это сообщение, если теперь вижу перекрестно смонтированный каталог. Я всю ночь работал над этим, так что, возможно, я устал и что-то упускаю.