操作系统版本说明:
华为欧拉操作系统openEuler 22.03 lts
银河麒麟V10
这里以这两个操作系统为例,其他国产操作系统类似,比如UOS。
这两个操作系统已经自带安装nfs-utils,虽然和centos redhat fedora红帽系列的操作系统都是使用yum包管理器,但是nfs-utils相关依赖有所区别,关于红帽系列的如何固定NFS服务的端口,请参考前面的博客文章:
CentOS 7 NFS服务搭建以及防火墙设置(服务 端口两种方式)——筑梦之路_筑梦之路的博客-CSDN博客_centos nfs 端口
NFS服务固定端口和安全加固——筑梦之路_筑梦之路的博客-CSDN博客_nfs服务端口
这里其实也是根据上面第二个博客来操作,由于是国产化操作系统适配,特别提出来,再次将过程步骤记录一下。
-------------------------------------------以下内容以openEuler为例,银河麒麟v10类似
# 查看nfs-utils是否已安装,未安装需要安装
rpm -qa | grep nfs
nfs-utils-help-2.5.4-4.oe2203.x86_64
nfs-utils-2.5.4-4.oe2203.x86_64
# 查看服务状态 和 默认监听的端口
systemctl status nfs rpcbind
rpcinfo -p
# 修改配置,固定NFS端口
vi /etc/services
#添加注释
#mountd 20048/tcp # NFS mount protocol
#mountd 20048/udp # NFS mount protocol
#rquotad 875/tcp # rquota daemon
#rquotad 875/udp # rquota daemon
#添加自定义端口配置
rquotad 30001/tcp
rquotad 30001/udp
lockd 30002/tcp
lockd 30002/udp
mountd 30003/tcp
mountd 30003/udp
statd 30004/tcp
statd 30004/udp
# 重启服务,进行验证
systemctl restart nfs-idmap
systemctl restart nfs-lock
systemctl restart nfs-server
systemctl restart rpcbind
rpcinfo -p
# 以上还有随机端口,未修改到的则进行下一步
vi /etc/nfs.conf
#在原来的标签下添加内容
[lockd]
port=30002
udp-port=30002
[statd]
port=30004
再次重启服务进行验证无误即可
关于华为欧拉操作系统和银河麒麟V10操作系统固定NFS端口方面的资料比较少,而相关社区也没有有用的解决方案,特此做个记录。
防火墙设置:
# 服务方式
# 让防火墙通过NFS服务
firewall-cmd --permanent --add-service=nfs
# 通过rpc服务(如果不开启,rpcinfo就不能扫描)
firewall-cmd --permanent --add-service=rpc-bind
# 通过mountd服务(如果不开启,不能远程showmount)
firewall-cmd --permanent --add-service=mountd
#重载
firewall-cmd --reload
# 端口方式
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=2049/udp
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=111/udp
firewall-cmd --permanent --add-port=30001-30004/tcp
firewall-cmd --permanent --add-port=30001-30004/udp
firewall-cmd --reload
# 安全加固 设置黑白名单
思路:通过系统白名单和nfs配置来进行加固
1.修改nfs配置
cat /etc/exports
data 192.168.47.0/255.255.255.0(rw,sync,no_root_squash)
此处表示允许192.168.47.0/24这个网段访问,其他不允许访问
#重载配置
exportfs -avr
2.添加访问白名单和黑名单
cat /etc/hosts.allow
mountd:192.168.47.
rpcbind:192.168.47.:allow
portmap:192.168.47.
lockd:192.168.47.
rquotad:192.168.47.
statd:192.168.47.
#本机
portmap:127.0.0.1
lockd:1127.0.0.1
rquotad:127.0.0.1
statd:127.0.0.1
mountd:127.0.0.1
rpcbind:127.0.0.1:allow
192.168.47. 表示此网段可访问
cat /etc/hosts.deny
mountd:ALL
rpcbind:ALL:deny
statd:ALL
portmap:ALL
lockd:ALL
rquotad:ALL
3.验证
192.168.47网段机器访问:
rpcinfo server-ip
showmount -e server-ip
192.168.10网段机器访问:
rpcinfo server-ip
showmount -e server-ip
此处获取不到nfs的信息,也不能挂载即成功加固
iptables版本的防火墙设置
#开放NFS端口111 2049 tcp/udp
iptables -A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 2049 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 111 -j ACCEPT
#NFS固定的其他端口30001-30004
iptables -A INPUT -p tcp -m tcp --dport 30001:30004 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 30001:30004 -j ACCEPT
关于安全加固,使用黑白名单的方式,某些操作系统不生效的原因:
hosts.allow和hosts.deny属于tcp_Wrappers防火墙的配置文件,而用tcp_Wrappers防火墙控制某一服务访问策略的前提是,该服务支持tcp_Wrappers防火墙,即该服务应用了libwrapped库文件。
查看某服务(如ssh)是否应用了libwrapped库文件的方法是:
# ldd /usr/sbin/sshd |grep libwrap.so.0
上面两张截图也说明了为何在银河麒麟系统下使用黑白名单的方式不生效,因此需要使用其他方法进行安全加固。
# 使用防火墙进行安全加固
# 比如有3台主机 192.168.100.100-192.168.100.102允许访问NFS 192.168.100.103不允许访问
# 这里使用富规则
# 第一步 开放NFS端口
firewall-cmd --permanent --zone=public --add-port=111/tcp
firewall-cmd --permanent --zone=public --add-port=2049/tcp
firewall-cmd --permanent --zone=public --add-port=20001-20004/tcp
firewall-cmd --permanent --zone=public --add-port=111/udp
firewall-cmd --permanent --zone=public --add-port=2049/udp
firewall-cmd --permanent --zone=public --add-port=20001-20004/udp
# 第二步 添加富规则
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="111" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.101" port protocol="tcp" port="111" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.102" port protocol="tcp" port="111" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="2049" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.101" port protocol="tcp" port="2049" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.102" port protocol="tcp" port="2049" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="20001-20004" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.101" port protocol="tcp" port="20001-20004" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.102" port protocol="tcp" port="20001-20004" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.100" port protocol="udp" port="111" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.100" port protocol="udp" port="2049" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.100" port protocol="udp" port="20001-20004" accept'
其他两台类似
# 拒绝103访问
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.103" port protocol="tcp" port="111" reject'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.103" port protocol="tcp" port="2049" reject'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.103" port protocol="tcp" port="20001-20004" reject'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.103" port protocol="udp" port="111" reject'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.103" port protocol="udp" port="2049" reject'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.103" port protocol="udp" port="20001-20004" reject'
firewall-cmd --reload
参考资料: