Linux PPPoE server 中文 howto<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

原文: [url]http://www.freeantennas.com/PPPoE-Server-HOWTO.html[/url]

Linux PPPoE server
中文 howto
作者: Michael J. Erskine
联系方式: [email]micers@kaballero.com[/email]
翻译:网盟 —— 七夕银河

修订版本历史记录:

修订版 0.95 -<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />20061012
这个草案包含了使用 pppoe 聚合实现流量×××方面的一些修正和附加注释。它得到了更新可用于 OpenSuSE 10.1

修订版 0.86 -2006828
经过几个月的实际运行,推出了这个包含一些修正和补充说明的草案。

修订版 0.85 -200616
这只是一个未完成的草案,你现在可以用这个草案来搭建一个 pppoe 服务器,但很大程度上这仍是一项需要不断补充完善的工作。

修订版 0.5 -200614
这是一个未完成的草案

本教程介绍了如何使用 Linux 来建立一个 PPPoE 协议服务器。

目录
    1.
导言
          1 .
免责
          2 .
反馈
    2.
硬件
          1.
要求
          2.
估算系统容量
    3.
软件
          1.rp-PPPoE
          2.pppd
          3.radiusclient
raduis 认证客户端)
    4.
配置
          1.radiusclient
          2.pppd
          3.rp-PPPoE
协议
          4.
以太网接口
          5.IP
转发
    5.
故障检修
    6.
额外的参考资料
    7.
作者
    8.
版权信息
    9.
待办事项

1
。导言

PPPoE
是基于以太网实现点对点传输的协议。它是一个在 OSI 的第二层协议中使用 ppp (点对点)协议来连接客户端系统到服务器端系统、提供一对一的网络连接方式。所有流向 PPPoE 客户端的流量必须经过 PPPoE 服务器才能到达客户端。因此 PPPoE 服务器,可以被用来给客户端提供 NAT ,防火墙,并进行 QoS 的流量×××。由于新版本的 PPP 服务支持 RADIUS 属性的客户端,身份验证和配置可以通过远程控制 RADIUS 服务器来完成。而 Linux 是一种优秀的高性能操作系统,它能够轻松支持许多种不同硬件平台的 PPPoE 客户端。

这份说明可能会让互联网服务供应商、资讯科技人员和其他网络管理者感兴趣。

1.1
免责

这是一份不承担任何责任的说明手册。本文所使用的概念、实例和其他内容,都将由您自己承担风险。尤其对于那些新版本的程序来说,本文可能会有错误和不准确的描述,而这些问题当然可能损害你的系统。因此操作的时候你需要谨慎,虽然出现这种情况的可能性不高,但作者们不会对任何造成的损害承担责任。

除非特别指出,否则所有版权属于与内容相对应的作者。本文件不会被视为有效的商标或服务标制。

我们不认可将其命名为特定产品或品牌。

强烈建议你在安装该软件前备份您的系统,并且建议做定期备份。

1.2       
反馈

反馈是最当然欢迎。如果没有你的一份投入,这个文件将不会存在。请把你添加的意见和批评,发送给下列电子邮件地址: [email]micers@kaballero.com[/email]

2.
硬件
Linux
是一种高性能的操作系统。目前趋势来看,许多 SOHO 路由器及无线通讯产品固件提供对 Linux 的支持。 PPPoE 协议属于 CPU 密集型的任务,运行多个实例的服务器守护进程将不可避免消耗更多内存。我们在过去的两三年中已经建成了一批此类 PPPoE 服务器系统,并观察到同时连接的客户数目和系统 CPU 和内存的消耗似乎存在一个线性关系。

按照保守的估计,每个连接客户端在使用 intel 奔腾 处理器的系统上大约需要消耗 2MHz cpu 时钟。同样是保守估计,一个连接客户端大约需要 2MB 左右的系统内存。这些数字是根据观察我们以前建成的、只有少量连接客户端的 PPPoE 服务器系统的运行状态而估计出来的。我们观察到的一次系统最大并发连接数为 128 。那次的观测对象是一台配有奔腾 266cpu 256MB 内存的设备,这台服务器还对每个用户连接进行流量×××和 NAT ,当时在服务器上操作会感到延时出现,但连接的用户并没有抱怨的表现。

2.1
需求

你需要一台双以太网卡服务器(网络接口卡),这是因为 PPPoE 协议必须运行在一个没有分配 ip 地址的以太网接口上。另外的网卡,将会被分配 IP 地址使它接入网络。客户端连接到没有分配 IP 的那块网卡上的 PPPoE 连接,将被转发给另外那些分配了 IP 地址的网卡上。任何有足够的内存 Pentium III 系统,都应该很容易支撑 100 个同步连接。当然你应该使用百兆网卡甚至千兆网卡。

2.2
估算系统容量

正如上文提到的,每个终端都将消耗您系统约 2MB 内存和 2MHz cpu 频率。这没有考虑 Linux 系统本身和其他运行在您的服务器上的软件所需消耗的资源。保守估计, 500 MHz 奔腾 cpu 512 MB 内存,将支持大约 250 个并行连接的 pppoe 终端,当然你可以更保守一点。现在的 CPU 和内存都挺便宜了。对 pppoe 服务来说,多处理器系统会更为可靠,因为它能降低系统延迟。另外,多个的 PPPoE 服务器作集群看起来会更好,相比一个单一但强大的服务器,它的好处是当一台服务器宕机时,其他网络上的服务器可以承接部分负载。冗余总是好的。

当第 254 个虚拟 ppp 设备产生时,无论是 ppp 还是 pppoe 都会产生一个问题,我想这是个 bug 。据我所知,这是个无可回避的问题,除非你修改如今的 ppp PPPoE 的源代码。因此,别指望实现支持并发数超过 255 PPPoE 连接的 PPPoE 服务器。我希望这个问题能在今后被开发者们改善。我无意把问题提交给给发展者。因为让多台服务器平行运行在骨干局域网中会更可靠。同时这样我们还能绕过这个限制。

3
。软件

任何新的 Linux 发行版本都可以用来建立一个 PPPoE 协议服务器。建议使用内核版本 2.6 或更新版本。较早版本中实现 PPP 的软件不支持 RADIUS ,而我们需要在 pam 中对 radius 的支持。新发布的 Linux 都使用较新版本的 PPP 服务。

大多 Linux 发布会在其安装媒体(比如光盘)上提供所需的软件包。我现在使用 open SUSE 10.1 ,所有的支持和软件包都在安装光盘中。我喜欢 open SUSES ,因为其发布中已经编译了对内核模式 PPPoE 协议的支持。这意味着你不需要重新编译内核就使用内核模式。如果你还是想使用自己喜欢的 Linux ,你也可以从他们的网站上下载软件包重建内核以使用它。

3.1        rp-PPPoE
首先我们需要 The Roaring Penguin( 呼啸的企鹅) PPPoE 服务器软件。可以使用 3.5 版或更新的版本。正如我们提到的,这个版本的服务器支持 PPPoE 内核模式 —— 如果你的内核支持这一模式。你可以获取为的 SUSE 10.0 编译的 rpm 包。虽然 rp-PPPoE 的作者宣称他们已经发布的 rp-pppoe 服务器版本不是用于真正的生产用途。但我们已经搭建并运行的 rp-PPPoE 为基础的服务器两年多来一直运行稳定,表现良好 —— 工作环境是这样的,两台服务器为约 250 DSL 和无线网用户提供服务,并由此连入我们的骨干网。注:目前我们运行两台配置为 PIII 750/512Mb 内存的服务器,为 400 个用户提供宽带服务,依然没有问题。

3.2 pppd

您的系统应该安装有 PPP 2.4 或者更新的版本。先前版本可能不支持 radius ,而这个版本支持每个用户通过 radius 属性进行配置。如果您了解 radius 属性,配置用户将不成问题。本教程在更加完善前,将只介绍通过 radius 建立用户登录的方法。

3.3 radiusclient

radiusclient
软件为 PPP 服务的 radius 插件提供配置档案。在 SuSE 10.0 中,它需要单独安装。 openSUSE10.0 为它提供了安装媒体。其他版本的 Linux 可能将它作为 PPP 服务的一部分进行了安装。有关的 SUSE 10.0 RPM 的可以在这里找到。很抱歉,我也没有找到能提供源代码包( tar.gz )的链接。

4.0
配置

配置 PPPoE 服务器前,请确保你是以 root 身份登入的系统。如果运行了防火墙,请你关掉它。

4.1 radiusclient
配置

PPP
服务插件使用的文件同样被 radiusclient 使用。这些文件位于 / etc / radiusclient 目录。有两个文件必须被配置,用于让您的 PPPoE 服务器使用 RADIUS 服务器来验证用户身份。如果你想让你的 PPPoE 服务器使用 radius 验证用户身份,你可以跳过这一节,跳到 4.2 章节。

找到并打开 /etc/radiusclient/serves ,插入 RADIUS 服务器的 IP 地址,以及 radius 与客户端通讯时使用的加密方式。这个档案或许是这样的:
#Server Name or Client/Server pair Key

#---------------- ---------------

#portmaster.elemental.net hardlyasecret

#portmaster2.elemental.net donttellanyone

#

# uncomment the following line for simple testing of radlogin

# with radiusd 1.16.1

#localhost/localhost testing123

123.45.67.89 MyRadiusSecret

另一个需要编辑的文件是 /etc/radiusclient/radiusclient.conf 。在文件中关于 radius 设置的部分,你需要指定 authserver( 认证服务器 ) IP 地址和 acctserver( 接收服务器? ) IP 地址。也可以留空,这样默认是本地服务器 localhost

4.2 pppd
配置

ppp
协议是非常强大和复杂的协议,能在可想象的任何传输媒介之间建立点对点连接。 PPPoE 协议是一个 " 封装协议 " ,通过 pppd 软件确立和断开基于以太网的 PPP 连接。但需要必要的信息时, PPPoE 会呼叫 PPPd pppd 请求用于保持连接。

pppd
配置文件位于 /etc/ppp 。我们感兴趣的有两个文件。分别是 /etc/ppp/options /etc/ppp/pap-secrets 。这是让 pppd 服务支持 PPPoE 连接的最小需求。还有很多可选配置项在 //etc/ppp/options 文件中。仔细地阅读该文件有助于你配置 PPP 服务器中那些从未操作设置过的部分。

更改 /etc/ppp/options

打开 /etc/ppp/options 。大部分的在 *nix 系统的配置文件在第一行使用#标记,以表明该行是一个评论。找到 nologin 这行内容,并改为# nologin 。找到# MRU 1492 ,取消注释(删掉 # 号)。找到# MTU 1492 并取消注释符号。找到# noreplacedefaultroute 并取消注释。

找到# proxyarp 并取消注释,这一步仅当你打算为部分客户提供公共 IP 地址的时候才必要的。如果所有客户端都被 nat 转发时,不需要开启 proxyarp 。从安全角度考虑,请开启 proxyarp ,一旦出错,你能从日志中找到错误信息。

找到# ms-DNS 192.168…… 那几行。在这里为客户端配置 DNS 服务器。客户将被指定 DNS 服务器这里设定的 DNS 。别忘了取消 dns 前面的注释符号。

最后需要在 /etc/ppp/options 的尾部添加这样两行:
plugin radius.so
plugin radattr.so

这两行告诉 ppp 服务使用 RADIUS 作为统计和验证。如果你不打算使用 radius ,比如你打算用本地密码文件验证用户,就不必添加这两行。

更改 /etc/ppp/pap-secrets:
打开 /etc/ppp/pap-secrets ,该文件内容应该类似这样:
# INBOUND CONNECTIONS
#client hostname <password> 192.168.1.1

你可以在客户端,主机名称和 IP 地址的下面分别放一个通配符。这意味着,如果客户提供正确的登录信息,任意客户端,任意主机名称,会被分派上任意的 IP 地址。修改后的文件类似这样:
# INBOUND CONNECTIONS
#client hostname <password> 192.168.1.1
* * "" *

现在已经完成了 /etc/ppp 基本的配置。这是建立 PPPoE 服务器的最低要求设置。

4.3 rp-PPPoE
的配置

rp-PPPoE
有一个配置文件,它就是 /etc/ppp/pppoe-server-options 。它不需修改。 PPPoE 服务器守护进程是一个服务进程,在监测连接或试图连接的时候必须运行它。它应该在系统启动时运行。我用一个脚本启动的 PPPoE 服务器进程,并配置 NAT (网络地址翻译) 以使运行在 PPPoE 服务器的客户端能够上网。下面就是脚本:
#!/bin/bash
# ----------------------------------------------------
# Starts the PPPoE server and turns on NAT
# ----------------------------------------------------
# MAX is the maximum number of addresses your server
# is allowed to hand out.
MAX=250

# BASE is the lowest IP address your server is allowed
# to hand out.
BASE=10.67.7.1

# NAT is the set of addresses which your server will
# NAT behind it. Other addresses behind your server
# WILL NOT be NATed.
NAT=10.67.7.0/24

# MYIP is the public IP address of this server.
MYIP=65.122.24.7

##########################################
# Here is where the script actually starts executing.
##########################################
# Disable IP spoofing on the external interface.

/usr/sbin/iptables -A INPUT -i eth0 -s $NAT -j DROP
#
# Enable NAT for the private addresses we hand out.
/usr/sbin/iptables -t nat -A POSTROUTING -s $NAT -j SNAT --to-source $MYIP

#

# Launch the server.
/usr/sbin/pppoe-server -T 60 -I eth1 -N $MAX -C PPPoE7 -S PPPoE7 -R $BASE

脚本命名命名为 pppoe-up ,位于 /etc/rc.d/pppoe-up 。你必须拷贝一份脚本,然后将它修改为为你自己的系统工作的脚本。设置 MAX= 为你想要允许的 PPPoE 服务器最大并发连接数。设定 BASE= pppoe 服务器允许客户端登陆的起始 IP 地址。可以是 192.168.0.1 或任何其他 IP 地址。在我的例子里, pppoe 服务器会从 10.67.7.1 这个地址开始分配 IP ,最多分配 250 IP 地址。设置 NAT= 为你的网络地址空间。本例中,我设置了一个 c IP 地址 10.67.7.0/24 ,所有在这个块上的 IP 地址都会被 nat ,隐藏在 pppoe 服务器后。设定 MYIP= pppoe 服务器分配的公共 IP 地址。 PPPoE 服务器将使用这个 IP internet 联系。所有连接 PPPoE 服务器的客户也将使用这个地址连接 internet ;除非你在 RADIUS 服务器或其他地方指定不使用它。

这个脚本的内容除了这些变量外,起实际作用的,只有 myip= 后面的三行命令。第一行阻断来自服务器认为藏在其内网的数据包进入本机。第二行启动 NAT 使的所有原本不能被路由的 IP 地址,利用 PPPoE 服务器连接 internet 。第三行实际上是在启动 PPPoE 服务器。


你应该编辑这一行: /usr/sbin/pppoe-server -T 60 -I eth1 -N $MAX -C PPPoE7 -S PPPoE7 -R $BASE ,并改变针对 pppoe7 的参数 -C -S 选项。 -C 用于指定您的 PPPoE 服务器主机名。 -S 选项用于标记特定的服务器,以帮助客户端系统对 pppoe 服务器进行自我标定。 -S 选项经常用来保证一些特定客户始终连接到特定服务器,特别是当你的网络上有多个 pppoe 服务器时。 PPPoE 协议的客户端软件可被配置为只登陆有 " 特殊服务名称 " pppoe 服务器。如果客户端指定的服务器名称与 -S 选项服务名称中宣称的名字相符,就会连接到该服务器。

编辑完这个脚本,并把它放在 /usr/sbin/ 目录中后,继续执行下列命令:
# Change to the directory
cd /etc/rc.d

# Make the file executable.
chmod 755 ./pppoe-up

# Set up the script to run in run levels three and five.
chkconfig pppoe-up 35

4.4
以太网接口
pppoe
服务器需要与一个未编号并工作在混杂模式下的以太网接口卡进行绑定。我从未见过任何一个发布版本的 linux 能自动创建这样的接口设备。所以用你的 linux 版本中的工具(任何工具都可以)给你的两块网卡分配地址并让它们启动,给外网卡(连接 internet 的那个,假设是 eth0 )一个真实的 ip 地址;而针对客户端的网卡(假设 eth1 )设置 ip 192.168.1.1 。保存这些设置,现在进入目录 /etc/sysconfig/network ,列出目录下的所有文件(使用 ls -l 参数),其内容应该类似如下:
PPPoE7:/etc/sysconfig/network # ls -l

total 54
drwxr-xr-x 6 root root 440 2006-01-03 12:11 .
drwxr-xr-x 7 root root 1424 2006-01-03 11:58 ..
-rw-r--r-- 1 root root 6979 2005-09-09 12:15 config
-rw-r--r-- 1 root root 6705 2006-01-02 15:58 dhcp
-rw-r--r-- 1 root root 181 2006-01-03 12:10 ifcfg-eth-id-00:50:bf:43:51:47
-rw-r--r-- 1 root root 250 2006-01-03 12:11 ifcfg-eth-id-00:50:bf:43:66:05
-rw-r--r-- 1 root root 141 2005-09-09 12:15 ifcfg-lo
-rw-r--r-- 1 root root 5779 2005-09-09 12:15 ifcfg.template
drwxr-xr-x 2 root root 48 2005-09-09 12:27 if-down.d
-rw-r--r-- 1 root root 239 2005-09-09 12:15 ifroute-lo
drwxr-xr-x 2 root root 88 2005-12-30 11:59 if-up.d
drwx------ 2 root root 48 2005-09-09 12:27 providers
-rw-r--r-- 1 root root 25 2006-01-02 15:58 routes
drwxr-xr-x 2 root root 1336 2005-12-30 11:59 scriflyfly pts
-rw-r--r-- 1 root root 5469 2005-12-30 11:57 wireless

PPPoE7:/etc/sysconfig/network #
你必须注意那两个名字为 ifcfg-eth-id-<mac address of interface> 的文件,它们是系统启动时用来配置网络接口用的文件。现在在命令行中输入命令 ifconfig eth1 ,输出结果大致如下:
PPPoE7:/etc/sysconfig/network # ifconfig eth1
eth0 Link encap:Ethernet HWaddr 00:50:BF:43:66:05
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::250:bfff:fe43:6605/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1562715 errors:0 dropped:0 overruns:0 frame:0
TX packets:58595 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:127223033 (121.3 Mb) TX bytes:9415968 (8.9 Mb)
Interrupt:10 Base address:0xc000

PPPoE7:/etc/sysconfig/network #
煮一下 eth1 的硬件地址,现在你就能知道哪一个 ifcfg-eth-id-xx:xx:xx:xx:xx:xx 文件是 eth1 的配置文件,用文本编辑器打开它,内容大致如下:
BOOTPROTO='static'
BROADCAST='192.168.1.255'
IPADDR='192.168.1.1'
MTU=''
NAME='Realtek RT8139'
NETMASK='255.255.255.0'
NETWORK='192.168.1.0'
REMOTE_IPADDR=''
STARTMODE='auto'
UNIQUE='rBUF.IQxIdIhhuH7'
USERCONTROL='no'
_nm_name='bus-pci-0000:00:09.0'

删掉 broadcast 地址,留空;删除 ipadd 行, network netmask 留空;把它们修改为类似这样:
BOOTPROTO='static'
BROADCAST=''
MTU=''
NAME='Realtek RT8139'
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
UNIQUE='JNkJ.IQxIdIhhuH7'
USERCONTROL='no'
_nm_name='bus-pci-0000:00:0a.0'

现在我们可以重新启动所有的网络接口,包括连接 internet eth0 和连接客户端的 eth1 ,你可以输入这个命令 /etc/rc.d/network restart ,这样你的网络就会重新启动,然后输入 ifconfig 你会看到类似内容:
PPPoE7:/etc/sysconfig/network # ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:BF:43:66:05
inet addr:65.122.24.7 Bcast:65.122.24.255 Mask:255.255.255.0
inet6 addr: fe80::250:bfff:fe43:6605/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1570208 errors:0 dropped:0 overruns:0 frame:0
TX packets:58630 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:127738167 (121.8 Mb) TX bytes:9425522 (8.9 Mb)
Interrupt:10 Base address:0xc000

eth1 Link encap:Ethernet HWaddr 00:50:BF:43:51:47
inet6 addr: fe80::250:bfff:fe43:5147/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:69 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6348 (6.1 Kb) TX bytes:258 (258.0 b)
Interrupt:11 Base address:0xc000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:646 errors:0 dropped:0 overruns:0 frame:0
TX packets:646 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:46470 (45.3 Kb) TX bytes:46470 (45.3 Kb)

PPPoE7:/etc/sysconfig/network #
请注意 eth0 已经起用,并且有一个 ipv4 的地址,或许你的 eth0 不像我这个有 ipv6 的地址,但那没关系;注意 eth1 也起用了,并且没有 ipv4 的地址和掩码。

4.5 IP
转发
现在我们开始转向 ipv4 的转发,用文本编辑器编辑 /etc/sysconfig/sysctl 文件,你会看到有一个参数是 IP_FORWARD ,其默认值是 no ,改为 yes ,然后存盘退出。
恭喜你,重启系统然后配置你的 RADIUS 服务器,它需要从这台主机获取预期服务的回应,它需要知道你放在 etc/ppp/servers 文件中的密码。

5.0
故障检测
重启系统后你可以试着从客户端发出一个 pppoe 连接请求。即便仅仅使用默认设置, pppoe 服务器和 pppd 守护进程也会产生大量而全面的日志信息。可以从 /var/log/messages 文件中发现这些信息。可以通过修改 /etc/ppp/options 文件增减日志的登记,比如你可以从中找到并在日志中添加 “debug” 的日志。
如果你发现你可以从客户端建立起 pppoe 的连接,但却不能上 internet ,请检查 /proc/sys/net/ipv4/ip_forward 的值。如果该值为 1 ,说明你配置了 ipv4 的转发,是 0 说明没配置。检查你的防火墙,建议你在一切调试完毕前关闭防火墙。在 suse 系统中,防火墙中的 ip_forward 优先级要高于 /etc/sysconfic/sysctl

6.0
其他参考
这里有一个链接,包含一个我的 /etc/ppp 目录的压缩包,其中包含了一些允许对每个用户进行基础流量×××的设置。有一些修改对于你们建立自己的系统可能是有用的。位置是这里: [url]http://www.freeantennas.com/my-etc-ppp.tar.gz[/url]

7.0
关于作者:
我是 Michael J. Erskine 1990 年毕业于 University of Texas A&M ,计算机学士学位。我对 pppoe 的兴趣产生于两三年前,当时我想给我们的 isp dsl 系统再结合一个 pppoe 的终端连接能力。但是我找到了为 linux 所写的 pppoe howto ,但是找了很久也没找到为 freebsd 所写的 howto 。这让我多花了 1 周的时间才建起我的第一个 pppoe server 。我想有了这个 howto ,一个有经验的 linux 管理员,能够只花一个下午的时间就建立起一个 pppoe server

8.0
版权信息
参考公布的 "GNU Copyleft"

       
9.0
待办事项 To Do List (这个就不翻了)
   1.      Finish DRAFT document and prepare to release.
   2.      HTML formatting and document cleanup.
   3.      Rework pppoe-up script to fall in line with the Linux standards.
   4.      Prepare a section upon managing the PPPd daemon with RADIUS attributes.
   5.      Modify the Wonder-Shaper script and clean up the scripts used to do traffic shaping so that traffic shaping can be managed via RADIUS attributes by user name.