# Linux : nfs 设置固定端口

因安全管理需要,内网机器也需要启用防火墙。由于nfs相关服务中存在非固定端口,需要将其设置成固定端口以便于设置防火墙。

本文记录下nfs设置固定端口的过程。

## 环境信息

机器:**Ubuntu 16.04.2 LTS**

## 设置步骤

nfs涉及到到服务有:**nfs、portmapper、rquotad、mountd、nlockmgr**,nfs和portmapper是固定端口,分别为2049、111,端口信息可以在 */etc/services* 中查到,以portmapper为例:

```shell
grep 'portmapper' /etc/services
```
结果如下,portmapper的tcp/udp都使用了111端口。
```
sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP
```
*注意:不同os之间差异较大,像在 CentOS 7 中,除nlockmgr外,其他都是固定端口*
你可以使用 `rpcinfo -p` 查看所有使用 **rpcbind** 注册的rpc服务。
```shell
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
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100024 1 udp 50866 status
100024 1 tcp 45152 status
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 59293 nlockmgr
100021 3 udp 59293 nlockmgr
100021 4 udp 59293 nlockmgr
100021 1 tcp 42315 nlockmgr
100021 3 tcp 42315 nlockmgr
100021 4 tcp 42315 nlockmgr
```
mountd tcp/udp端口为20048、nlockmgr tcp为42315,udp为59293。**重启nfs服务后端口会发生变化**。
在 */etc/services* 的最后添加如下配置,为mountd和rquotad设置固定端口。
```
mountd 20048/tcp
mountd 20048/udp
rquotad 875/tcp
rquotad 875/udp
```
因nlockmgr在 */etc/services* 中配置没有效果,我改配置到了 */etc/sysctl.conf* 中。
```
fs.nfs.nlm_udpport=42315
fs.nfs.nlm_tcpport=42315

```

配置后使用 `/sbin/sysctl -p` 生效 */etc/sysctl.conf* 中的配置。

上面的端口信息你可以自由设定。

## 拓展阅读

碰到点问题就学点Linux,学习下 */etc/services* 和 */etc/sysctl.conf* 两个配置文件。

### /etc/services

用于记录网络服务名和对应的端口及协议,每一行数据由 **服务名称、端口、协议、别名** 四部分组成。很多服务都会使用这个文件,如果各服务都在这个文件中注册自己的端口信息,那主机上的端口使用情况会十分清晰,容易管理。

下面是熟知的 **ssh** 和 **http** 服务的例子。

```shell
ssh22/tcp# SSH Remote Login Protocol
ssh22/udp
http80/tcpwww# WorldWideWeb HTTP
http80/udp# HyperText Transfer Protocol

```

该文件也充当配置文件的作用,在应用程序中可以使用服务名和协议获取到对应的端口,使得应用程序不用关心端口号。

>Note:Linux端口范围为0-65535,不同范围含义不同。

>

>0 不建议使用

>1-1023 系统保留

>1024-4999 客户端程序自由分配

>5000-65536 服务端程序自由分配

### /etc/sysctl.conf

系统控制文件,用于配置系统信息。其中配置的内容对应了 **/proc/sys/** 目录下的子目录及文件。

以上面配置的 `fs.nfs.nlm_udpport=42315` 为例:

```shell
$ cat /proc/sys/fs/nfs/nlm_udpport
35818
```

`fs.nfs.nlm_udpport=42315` 这个配置转换成了配置文件,配置中的 **.(点)** 代表目录。

另,

* **/proc/** 目录每次在系统启动时都会重新挂载,**/proc/sys** 只是其中的一小部分。

* 修改 /etc/sysctl.conf 后需要使用 `sysctl -p` 来生效配置。