无法跨子网挂载 NFS 共享;即使 iptables 完全打开,rpcinfo 命令从客户端到服务器也会失败

无法跨子网挂载 NFS 共享;即使 iptables 完全打开,rpcinfo 命令从客户端到服务器也会失败

对于以下中篇小说,我提前致歉。

我有一个 USB 驱动器连接到运行 Raspbian 的 Raspberry Pi;遗憾的是,crashplan 不再适用于 Raspbian,所以我无法将其备份到我的 Crashplan 服务器(创造性地命名为“备份”)。我尝试做的是 NFS 将文件系统共享到我的 Crashplan 服务器,并让它将其 rsync 到本地文件系统,但我无法将其安装在备份服务器上。

“备份”是在 ESXi 上运行的 CentOS 6 VM,与 Pi 位于不同的子网中;我使用 VyOS 作为路由器。到目前为止,它总体上运行良好,但我怀疑 VyOS 的某些方面可能会搞砸工作。VyOS 设置为在我的 10.47.6.0/24(pi 所在的位置)和 10.47.7.0/24(我的大多数 VM 所在的位置)之间路由。当我从 pi(或从同一子网中的另一台服务器)执行 rpcinfo 时,它会成功;当我从另一个子网执行时,我得到:

rpcinfo: can't contact portmapper: RPC: Unable to receive; errno = Connection reset by peer

它也可以用于 VyOS VM。

pi 是进入我网络的通道(我的 Verizon 路由器将某些端口转发给它以供外部访问),因此 iptables 配置为阻止大多数东西。但是,它对我的​​两个子网中的所有端口都开放:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  165.160.2.0/24       anywhere             tcp dpt:https
ACCEPT     all  --  localhost            anywhere
ACCEPT     all  --  10.47.6.0/23         anywhere
ACCEPT     tcp  --  165.160.32.0/24      anywhere             tcp dpt:ssh
ACCEPT     tcp  --  165.160.2.0/24       anywhere             tcp dpt:ssh
ACCEPT     all  --  10.8.0.0/24          anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpt:http-alt
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
LOGGING    all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain LOGGING (1 references)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             limit: avg 2/min burst 5 LOG level warning prefix "IPTables-logged: "
DROP       all  --  anywhere             anywhere

VyOS 本身在两个子网之间根本没有配置防火墙:

vyos@vyos:~$ show firewall

-----------------------------
Rulesets Information
-----------------------------
vyos@vyos:~$

它具有最基本的路由配置:

vyos@vyos:~$ show configuration
interfaces {
    ethernet eth0 {
        address 10.47.6.11/24
        duplex auto
        hw-id 00:0c:29:de:e1:e1
        smp_affinity auto
        speed auto
    }
    ethernet eth1 {
        address 10.47.7.1/24
        duplex auto
        hw-id 00:0c:29:de:e1:eb
        smp_affinity auto
        speed auto
    }
    loopback lo {
    }
}
nat {
    source {
        rule 10 {
            outbound-interface eth0
            protocol all
            source {
                address 10.47.7.0/24
            }
            translation {
                address 10.47.7.0/24
            }
        }
    }
}
protocols {
    static {
        route 0.0.0.0/0 {
            next-hop 10.47.6.1 {
                distance 1
            }
        }
    }
}
<snippety snip snip>

我可以 ping 遍所有地方,可以 ssh,可以访问在 10.47.7.0/24 VLAN 上的各种端口上运行的 Web 和其他服务,所以我认为我没有防火墙问题。更重要的是,当我将 strace 连接到 pi 上的 rpcbind 守护程序时,它看到连接进来然后由于某种原因将其转储,我没有足够的智慧来从跟踪数据中进行转换。这已经是 5 倍长了,所以我就不给你完整的 strace 输出了,因为它在某个点之前是相同的。

当我从 VyOS 成功连接时,pi 显示:

write(12, "\200\0\2t\16z\37\322\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"..., 632) = 632
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=6, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=8, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=9, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=10, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=11, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=12, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 8, 30000) = 1 ([{fd=12, revents=POLLIN|POLLRDNORM}])
read(12, "", 4)                         = 0
close(12)                               = 0

...然后它打开一个轮询来等待另一个连接。当我从我的备份服务器执行此操作时:

write(12, "\200\0\2t\314\315\372\355\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"..., 632) = -1 ECONNRESET (Connection reset by peer)
close(12)                               = 0

我认为这可能是防火墙问题,但 VyOS 根本没有防火墙,备份服务器也没有;与备份服务器位于同一子网中的其他设备可以正常执行 rpcinfo -p 备份,但它们都无法执行 rpcinfo 我的 pi。奇怪的是:10.47.7 网络中的服务器可以执行 rpcinfo 10.47.6 网络中的服务器除了 pi但是 pi 允许在 10.47.6.0/23(即两个子网)中看到的任何协议和任何端口上进行连接,并且 rpcbind 上的 strace 表明它查看传入连接。我唯一能想到的是它阻止了自己到 10.47.7.0/24 的出站连接,但我没有任何类型的出站规则和默认的 ACCEPT 策略,当我刷新整个表进行快速测试时,仍然失败了。这到底是怎么回事?pi 正在监听所有常用端口:

root@splunk:~> rpcinfo -p pi
program vers proto   port  service
100000    4   tcp    111  portmapper
100000    3   tcp    111  portmapper
100000    2   tcp    111  portmapper
100000    4   udp    111  portmapper
100000    3   udp    111  portmapper
100000    2   udp    111  portmapper
100024    1   udp  60044  status
100024    1   tcp  55702  status
100003    2   tcp   2049  nfs
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100227    2   tcp   2049
100227    3   tcp   2049
100003    2   udp   2049  nfs
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
100227    2   udp   2049
100227    3   udp   2049
100021    1   udp  38666  nlockmgr
100021    3   udp  38666  nlockmgr
100021    4   udp  38666  nlockmgr
100021    1   tcp  44067  nlockmgr
100021    3   tcp  44067  nlockmgr
100021    4   tcp  44067  nlockmgr
100005    1   udp  51123  mountd
100005    1   tcp  57740  mountd
100005    2   udp  39024  mountd
100005    2   tcp  53219  mountd
100005    3   udp  40590  mountd
100005    3   tcp  47949  mountd

啊!!!

相关内容