PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NFS over SSH



craano
19.01.07, 23:42
Schönen guten Abend allerseits,

ich versuche gerade eine NFS Freigabe durch SSH zu tunneln, dabei bin ich nach folgendem Howto vorgegangen:

http://www.samag.com/documents/s=4072/sam0203d/sam0203d.htm

1.
Ohne SSH Tunnel kann ich die NFS Freigabe übers Netz mounten. NFS Server und Client arbeiten also korrekt und /etc/exports passt auch.

cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync) hostname2(ro,sync)
#
/media/sdb8_ext3/hdimages 192.168.1.61(rw)
/media/sdb8_ext3/hdimages localhost(rw)



# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt)
# /srv/nfs4/homes gss/krb5i(rw,sync)
#



2.
Netfilter Regeln auf dem Host:

#Alles flushen
5 iptables -F
6 iptables -t nat -F
7 iptables -P INPUT ACCEPT
8 iptables -P FORWARD ACCEPT
9 iptables -P OUTPUT ACCEPT
10 iptables -t nat -P PREROUTING ACCEPT
11 iptables -t nat -P POSTROUTING ACCEPT
12 iptables -t nat -P OUTPUT ACCEPT
13
14 #Standard Policy, wenn keine Regel matched.
15 iptables -P INPUT DROP
16 iptables -P OUTPUT DROP
17 iptables -P FORWARD DROP
18
19 #nfs over ssh for Xubuntu
20 iptables -A INPUT -i eth0 -p tcp -s 192.168.1.61 --dport ssh -j ACCEPT
21 iptables -A OUTPUT -o eth0 -p tcp --sport ssh -d 192.168.1.61 -j ACCEPT
22 iptables -A INPUT -i eth0 -p tcp -s 192.168.1.61 --dport 111 -j ACCEPT
23 iptables -A OUTPUT -o eth0 -p tcp --sport 111 -d 192.168.1.61 -j ACCEPT

2.
rpcinfo -p HOST

rpcinfo -p 192.168.1.33
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 udp 4001 nlockmgr
100021 3 udp 4001 nlockmgr
100021 4 udp 4001 nlockmgr
100021 1 tcp 4001 nlockmgr
100021 3 tcp 4001 nlockmgr
100021 4 tcp 4001 nlockmgr
100005 1 udp 4002 mountd
100005 1 tcp 4002 mountd
100005 2 udp 4002 mountd
100005 2 tcp 4002 mountd
100005 3 udp 4002 mountd
100005 3 tcp 4002 mountd
100024 1 udp 4000 status
100024 1 tcp 4000 status

3.
Aufbau des Tunnels

ssh -f -c blowfish -L 2818:192.168.1.33:2049 -L 3045:192.168.1.33:4002 -l james nfs1 /bin/sleep 86400
4.
Mountversuch der Freigabe

mount -t nfs -o tcp,port=2818,mountport=3045 localhost:/media/sdb8_ext3/hdimages ./nfs
Leider schlägt das mounten fehl.

Reason given by server: Permission denied

Habt Ihr eine Idee, was ich hier übersehe?
Falsche Freigabe in /etc/exports ? Durch den Tunnel connected er doch jetzt von localhost. 192.168.1.61 ist der client.

Grüße.
craano.

craano
20.01.07, 00:19
Eine neue Erkenntnis, es scheint ein iptables Problem zu sein.

Mit geflushten Regeln kann ich durch den Tunnel mounten. (Soweit ich das beurteilen kann, iptables blockt die NFS Ports ja nicht nach außen.)


mount -v -t nfs -o tcp,rsize=8192,wsize=8192,intr,rw,port=8888,mountp ort=8889 localhost:/media/sdb8_ext3/hdimages ./nfs/
localhost:/media/sdb8_ext3/hdimages on /root/nfs type nfs (rw,tcp,rsize=8192,wsize=8192,intr,port=8888,mount port=8889,addr=127.0.0.1)


Soweit ja ganz vielversprechend.
Es wird also irgendetwas durch meine Netfilter Regeln geblockt, was für das mounten notwendig ist.

Was muss ich denn noch durch die Firewall durchlassen, wie soll ich die obigen Regeln ändern?

Grüße.
craano.

EDIT
Vergessen zu erwähnen, ich habe die /etc/exports nocheinmal angepasst, da localhost falsch war und als Option noch insecure angegeben:

/media/sdb8_ext3/hdimages 192.168.1.33(rw,insecure)
Wenn ich jetzt mount, mit aktivierter Firewall auf dem Host, aufrufe, erscheint folgende Ausgabe:

root@dhcppc3:~# mount -v -t nfs -o tcp,rsize=8192,wsize=8192,intr,rw,port=8888,mountp ort=8889,nolock,noudp localhost:/media/sdb8_ext3/hdimages ./nfs/
mount: RPC: Timed out
root@dhcppc3:~# channel 5: open failed: connect failed: Connection timed out
channel 6: open failed: connect failed: Connection timed out

Ohne Firewall macht das ganze aber wenig Sinn. Nach aussen soll möglichst nur Port 22 offen sein. Ich weiss, zur Zeit lass ich auch noch 111 durch. Dafür suche ich noch eine Lösung einen Tunnel zu bauen, falls das überhaupt geht.

Muss ich vielleicht die Ports 4001 (nlockmgr) und 4000 (status) auch noch tunneln?

Diese beiden ports kann ich aber nicht als Option beim mounten angeben. Ich finde zumindest keinen Schalter in der manpage.

Columbo0815
20.01.07, 09:18
http://www.howtoforge.com/nfs_ssh_tunneling

craano
20.01.07, 13:22
Ich habe das Howto von howtoforge.com auch gelesen.
Die Vorgehensweise ist grundsätzlich die selbe.
Erst NFS bändigen und auf bestimmte Ports festnageln, dann die Tunnel aufbauen und anschließend die Freigabe durch die Tunnel mounten.
Das funktioniert ja auch so alles bereits bei mir.
Wenn ich die eigentlichen NFS Ports durch eine Firewall nach außen blockiere jedoch nicht, obwohl der gesamte doch dann durch den SSH Tunnel auf Port 22 laufen sollte. :confused:

Grüße.
craano.

craano
20.01.07, 17:50
Nachtrag:

Eine kleine Pause und ein wenig Nachdenken kann manchmal doch nützlich sein.

Die Lösung ist ziemlich einfach. Wenn man durch den SSH Tunnel die NFS Freigabe mounted, dann spricht der NFS Server sich selbst mit seiner eigenen Netzwerkadresse an, also muss man in den Netfilter Regeln auf dem Server die entsprechenden Ports, die NFS verwendet, auch freigeben. Ansonsten blockt die Standard Policy.
Da sämtlicher Verkehr nach aussen durch den SSH Port geht, genügt es ausschließlich für die eigene IP Adresse zu öffnen.


iptables -A INPUT -p tcp -s 192.168.1.33 -d 192.168.1.33 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.1.33 -s 192.168.1.33 -j ACCEPT

Es ist auch möglich den Portmapper nach außen zu blocken. Eine Netfilter Regeln für den Port 111 braucht es nicht, wenn man vorher den NFS Server auf feste Ports gesetzt hat. Bei festen, also bekannten Ports, können diese beim Tunnelaufbau explizit angegeben werden und portmap muss dann nicht kontaktiert werden, um herauszufinden an welchen Port die RPC Pakete zu senden sind.

Mit dieser Konfiguration ist es möglich eine NFS Freigabe zu mounten und den gesamten Verkehr (Authentifizierung und Daten) zu verschlüsseln. Dabei ist nach außen nur der SSH Port sichtbar (alles andere durch iptables gedroppt).
Wenn man zusätzlich noch RSA Key Authentifizierung verwendet hat man sogar eine Client Identifikation.

Grüße.
craano.

craano
20.01.07, 20:35
Eine kleine Zusammenfassung, falls jemand diese Lösung nachbauen will.

Grüße.
craano.