У меня есть веб-сервер 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» на веб-сервере, я все равно получаю сообщение «Соединение отклонено». Я не понимаю, как я могу получить это сообщение, если теперь вижу перекрестно смонтированный каталог. Я всю ночь работал над этим, так что, возможно, я устал и что-то упускаю.