FreeBSD PPP协议(转)

FreeBSD PPP协议(转)[@more@]

  通过电话连接使用IP协议有两种协议,一种为SLIP协议,另一种为PPP协议,FreeBSD支持这两种协议,但是SLIP协议已经过时,当前已经很少有ISP使用这种方式提供接入服务了,而PPP协议则成为了标准。

  建立一个PPP连接需要以下过程:

  • 在PPP的两端建立一条物理连接,通常为电话连接,但也有直接电缆连接或虚拟的tunnel连接的形式。具体如何建立连接,例如拨号等,并不属于PPP协议本身的任务。
  • 由PPP的服务器端对客户端进行验证,可以有最简单登录的验证方式、PAP或CHAP等验证方式。由于PAP和CHAP并不在线路上传输口令本身,因此更为安全,不必担心口令会泄露出去。
  • 验证完毕之后,PPP服务器将按照配置,分配给客户IP地址,并将网关地址和其他的一些配置信息传送给客户。如果是Microsoft客户,还可以按照MS的扩展协议分配给客户NetBIOS名字服务器的地址。这样就建立了一条PPP连接。

  FreeBSD对PPP提供了两种不同方式的支持,一种为内核级PPP,它将PPP协议代码编译进内核,并运行一个PPP守护进程pppd,提供对PPP的支持,这是一种传统的方法,但配置起来较困难。另一种为用户级PPP,它使用一个应用程序ppp,通过通用tunnel设备传递PPP数据,配置较为容易。一般情况下可以使用用户级PPP 来建立拨号方式的Internet连接。

  要建立PPP连接,首先要检查串口、modem和电话线连接是否正确。可以使用一些通信软件来帮助进行诊断,例如minicom,如果使用minicom能正常拨号,并在拨ISP的拨号服务器时能出现username和password 提示,就说明串口和modem的配置正确无误。接下来就可以配置PPP连接。

用户级PPP设置

  用户级PPP使用tunnel设备进行PPP数据的传递,因此内核中必须支持相应的tunnel设备,通常为 tun0。缺省内核中支持这个伪设备(pesudo-device tun),/dev目录下也具备相应的设备文件t un0。如果同时需要多个拨号连接,就可以增加内核中支持的伪设备数量和相应的设备文件。

  要使用ppp,还需要设置它的配置文件,这些文件位于/etc/ppp目录中。缺省情况下,/etc/ppp 目录下安装了这些文件的例子:

# ls -l /etc/ppp

 total 21

 drwxr-xr-x  2 root   wheel     512 Aug 17 16:18 .

 drwxr-xr-x  8 root   wheel    1536 Aug 29 18:31 ..

 -rw-r--r--  1 root   wheel    5112 May 20 20:06 ppp.conf.sample

 -rw-r--r--  1 root   wheel    1130 May 20 20:06 ppp.conf.server.sample

 -rw-r--r--  1 root   wheel    1894 May 20 20:06 ppp.deny

 -rw-r--r--  1 root   wheel    1665 May 20 20:06 ppp.dialup.sample

 -rw-r--r--  1 root   wheel    1402 May 20 20:06 ppp.linkdown.sample

 -rw-r--r--  1 root   wheel    1422 May 20 20:06 ppp.linkup.sample

 -rw-r--r--  1 root   wheel    1705 May 20 20:06 ppp.pap.dialup.sample

 -rw-r--r--  1 root   wheel     313 May 20 20:06 ppp.secret.sample

  这些以sample结尾的文件都给出了最常用的配置,因此只需复制生成正确的设置文件,再稍加修改,就能用于使用者自己的拨号连接。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-944739/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-944739/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于LWIP的PPP服务器的示例代码,仅供参考: ```c #include "lwip/opt.h" #include "lwip/sys.h" #include "lwip/pbuf.h" #include "lwip/ppp/ppp.h" #include "lwip/ppp/fsm.h" #include "lwip/ppp/ccp.h" #include "lwip/ppp/mppe.h" #include "lwip/tcpip.h" #include "netif/ppp/pppoe.h" #define PPP_SERVER_NETIF_NAME "ppp0" #define PPP_SERVER_USER "user" #define PPP_SERVER_PASSWORD "password" static struct ppp_netif *pppif; static void ppp_server_link_status_cb(void *ctx, int err_code, void *arg) { LWIP_UNUSED_ARG(ctx); LWIP_UNUSED_ARG(arg); if (err_code == PPPERR_NONE) { printf("PPP link up\n"); } else { printf("PPP link down: %d\n", err_code); ppp_free(pppif); pppif = NULL; } } static void ppp_server_auth_fail_cb(void *ctx, int err_code, void *arg) { LWIP_UNUSED_ARG(ctx); LWIP_UNUSED_ARG(arg); printf("PPP authentication failed: %d\n", err_code); ppp_free(pppif); pppif = NULL; } static int ppp_server_auth_cb(char *user, char *password, void *arg) { LWIP_UNUSED_ARG(arg); if (strcmp(user, PPP_SERVER_USER) == 0 && strcmp(password, PPP_SERVER_PASSWORD) == 0) { return 1; } else { return 0; } } static void ppp_server_output_cb(void *ctx, u_char *data, int len, void *arg) { LWIP_UNUSED_ARG(ctx); struct pbuf *p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM); if (p != NULL) { memcpy(p->payload, data, len); pbuf_realloc(p, len); pppif->input(p, pppif); pbuf_free(p); } } static err_t ppp_server_netif_init(struct netif *netif) { LWIP_UNUSED_ARG(netif); pppif = ppp_netif_create(PPP_SERVER_NETIF_NAME, ppp_server_link_status_cb, ppp_server_auth_fail_cb, ppp_server_auth_cb, ppp_server_output_cb, NULL); if (pppif == NULL) { return ERR_IF; } return ERR_OK; } void ppp_server_init(void) { struct netif ppp_netif; tcpip_init(NULL, NULL); memset(&ppp_netif, 0, sizeof(ppp_netif)); netif_add(&ppp_netif, NULL, NULL, NULL, NULL, ppp_server_netif_init, tcpip_input); netif_set_default(&ppp_netif); netif_set_up(&ppp_netif); } ``` 上述代码中,首先定义了宏`PPP_SERVER_NETIF_NAME`、`PPP_SERVER_USER`和`PPP_SERVER_PASSWORD`,分别表示PPP服务器的网络接口名、用户名和密码。 然后定义了回调函数`ppp_server_link_status_cb`、`ppp_server_auth_fail_cb`和`ppp_server_auth_cb`,分别用于处理PPP连接状态变化、PPP认证失败和PPP认证请求。 接下来定义了回调函数`ppp_server_output_cb`,用于在接收到对端PPP客户端发送的数据时将数据传递给LWIP网络协议栈进行处理。 最后定义了函数`ppp_server_netif_init`,用于初始化PPP服务器的网络接口。 在`ppp_server_init`函数中,首先调用`tcpip_init`函数初始化LWIP协议栈,然后创建一个网络接口并初始化,最后启动网络接口。 需要注意的是,上述代码仅为示例代码,不保证完整性和正确性,实际使用时需要根据具体需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值