1 default: 2 set log Phase Chat LCP IPCP CCP tun command 3 ident user-ppp VERSION 4 set device /dev/cuau0 5 set speed 115200 6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \ 7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT" 8 set timeout 180 9 enable dns 10 11 provider: 12 set phone "(123) 456 7890" 13 set authname foo 14 set authkey bar 15 set timeout 300 16 set ifaddr x.x.x.x/0 y.y.y.y/0 255.255.255.255 0.0.0.0 17 add default HISADDR
章 27. PPP
FreeBSD 支援點對點 (Point-to-Point, PPP) 通訊協定，可透過撥號數據機用來建立網路或網際網路連線。本章將說明如何設定在 FreeBSD 中以數據機為基礎的通訊服務。
如何設定、使用 PPP 連線及排除問題。
如何設定在乙太網路 (Ethernet) 上的 PPP (PPPoE)。
如何設定在 ATM 上的 PPP (PPPoA)。
了解撥號連線及 PPP 的基礎及目的。
27.2. 設定 PPP
FreeBSD provides built-in support for managing dial-up PPP connections using ppp(8). The default FreeBSD kernel provides support for tun which is used to interact with a modem hardware. Configuration is performed by editing at least one configuration file, and configuration files containing examples are provided. Finally,
ppp is used to start and manage connections.
In order to use a PPP connection, the following items are needed:
A dial-up account with an Internet Service Provider (ISP).
A dial-up modem.
The dial-up number for the ISP.
The login name and password assigned by the ISP.
The IP address of one or more DNS servers. Normally, the ISP provides these addresses. If it did not, FreeBSD can be configured to use DNS negotiation.
If any of the required information is missing, contact the ISP.
The following information may be supplied by the ISP, but is not necessary:
The IP address of the default gateway. If this information is unknown, the ISP will automatically provide the correct value during connection setup. When configuring PPP on FreeBSD, this address is referred to as
The subnet mask. If the ISP has not provided one,
255.255.255.255will be used in the ppp(8) configuration file. *
If the ISP has assigned a static IP address and hostname, it should be input into the configuration file. Otherwise, this information will be automatically provided during connection setup.
The rest of this section demonstrates how to configure FreeBSD for common PPP connection scenarios. The required configuration file is /etc/ppp/ppp.conf and additional files and examples are available in /usr/shared/examples/ppp/.
Throughout this section, many of the file examples display line numbers. These line numbers have been added to make it easier to follow the discussion and are not meant to be placed in the actual file.
When editing a configuration file, proper indentation is important. Lines that end in a
In order to configure a PPP connection, first edit /etc/ppp/ppp.conf with the dial-in information for the ISP. This file is described as follows:
- Line 1
defaultentry. Commands in this entry (lines 2 through 9) are executed automatically when
- Line 2
Enables verbose logging parameters for testing the connection. Once the configuration is working satisfactorily, this line should be reduced to:
set log phase tun
- Line 3
Displays the version of ppp(8) to the PPP software running on the other side of the connection.
- Line 4
Identifies the device to which the modem is connected, where COM1 is /dev/cuau0 and COM2 is /dev/cuau1.
- Line 5
Sets the connection speed. If
115200does not work on an older modem, try
- Lines 6 & 7
The dial string written as an expect-send syntax. Refer to chat(8) for more information.
Note that this command continues onto the next line for readability. Any command in ppp.conf may do this if the last character on the line is
- Line 8
Sets the idle timeout for the link in seconds.
- Line 9
Instructs the peer to confirm the DNS settings. If the local network is running its own DNS server, this line should be commented out, by adding a
#at the beginning of the line, or removed.
- Line 10
A blank line for readability. Blank lines are ignored by ppp(8).
- Line 11
Identifies an entry called
provider. This could be changed to the name of the ISP so that
load ISPcan be used to start the connection.
- Line 12
Use the phone number for the ISP. Multiple phone numbers may be specified using the colon (
:) or pipe character (
|) as a separator. To rotate through the numbers, use a colon. To always attempt to dial the first number first and only use the other numbers if the first number fails, use the pipe character. Always enclose the entire set of phone numbers between quotation marks (
") to prevent dialing failures.
- Lines 13 & 14
Use the user name and password for the ISP.
- Line 15
Sets the default idle timeout in seconds for the connection. In this example, the connection will be closed automatically after 300 seconds of inactivity. To prevent a timeout, set this value to zero.
- Line 16
Sets the interface addresses. The values used depend upon whether a static IP address has been obtained from the ISP or if it instead negotiates a dynamic IP address during connection.
If the ISP has allocated a static IP address and default gateway, replace x.x.x.x with the static IP address and replace y.y.y.y with the IP address of the default gateway. If the ISP has only provided a static IP address without a gateway address, replace y.y.y.y with
If the IP address changes whenever a connection is made, change this line to the following value. This tells ppp(8) to use the IP Configuration Protocol (IPCP) to negotiate a dynamic IP address:
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 0.0.0.0
- Line 17
Keep this line as-is as it adds a default route to the gateway. The
HISADDRwill automatically be replaced with the gateway address specified on line 16. It is important that this line appears after line 16.
Depending upon whether ppp(8) is started manually or automatically, a /etc/ppp/ppp.linkup may also need to be created which contains the following lines. This file is required when running
-auto mode. This file is used after the connection has been established. At this point, the IP address will have been assigned and it is now be possible to add the routing table entries. When creating this file, make sure that provider matches the value demonstrated in line 11 of ppp.conf.
provider: add default HISADDR
This file is also needed when the default gateway address is "guessed" in a static IP address configuration. In this case, remove line 17 from ppp.conf and create /etc/ppp/ppp.linkup with the above two lines. More examples for this file can be found in /usr/shared/examples/ppp/.
ppp must be run as
root. To change this default, add the account of the user who should run
ppp to the
network group in /etc/group.
Then, give the user access to one or more entries in /etc/ppp/ppp.conf with
allow. For example, to give
mary permission to only the
provider: entry, add this line to the
allow users fred mary
To give the specified users access to all entries, put that line in the
default section instead.
It is possible to configure PPP to supply DNS and NetBIOS nameserver addresses on demand.
To enable these extensions with PPP version 1.x, the following lines might be added to the relevant section of /etc/ppp/ppp.conf.
enable msext set ns 18.104.22.168 22.214.171.124 set nbns 126.96.36.199
And for PPP version 2 and above:
accept dns set dns 188.8.131.52 184.108.40.206 set nbns 220.127.116.11
This will tell the clients the primary and secondary name server addresses, and a NetBIOS nameserver host.
In version 2 and above, if the
set dns line is omitted, PPP will use the values found in /etc/resolv.conf.
18.104.22.168. PAP 與 CHAP 認證
Some ISPs set their system up so that the authentication part of the connection is done using either of the PAP or CHAP authentication mechanisms. If this is the case, the ISP will not give a
login: prompt at connection, but will start talking PPP immediately.
PAP is less secure than CHAP, but security is not normally an issue here as passwords, although being sent as plain text with PAP, are being transmitted down a serial line only. There is not much room for crackers to "eavesdrop".
The following alterations must be made:
13 set authname MyUserName 14 set authkey MyPassword 15 set login
- Line 13
This line specifies the PAP/CHAP user name. Insert the correct value for MyUserName.
- Line 14
This line specifies the PAP/CHAP password. Insert the correct value for MyPassword. You may want to add an additional line, such as:
16 accept PAP
16 accept CHAP
to make it obvious that this is the intention, but PAP and CHAP are both accepted by default.
- Line 15
The ISP will not normally require a login to the server when using PAP or CHAP. Therefore, disable the "set login" string.
22.214.171.124. 使用 PPP 網路位址轉譯功能
PPP has ability to use internal NAT without kernel diverting capabilities. This functionality may be enabled by the following line in /etc/ppp/ppp.conf:
nat enable yes
Alternatively, NAT may be enabled by command-line option
-nat. There is also /etc/rc.conf knob named
ppp_nat, which is enabled by default.
When using this feature, it may be useful to include the following /etc/ppp/ppp.conf options to enable incoming connections forwarding:
nat port tcp 10.0.0.2:ftp ftp nat port tcp 10.0.0.2:http http
or do not trust the outside at all
nat deny_incoming yes
ppp is now configured, some edits still need to be made to /etc/rc.conf.
Working from the top down in this file, make sure the
hostname= line is set:
If the ISP has supplied a static IP address and name, use this name as the host name.
Look for the
network_interfaces variable. To configure the system to dial the ISP on demand, make sure the tun0 device is added to the list, otherwise remove it.
network_interfaces="lo0 tun0" ifconfig_tun0=
ppp -auto mysystem
This script is executed at network configuration time, starting the ppp daemon in automatic mode. If this machine acts as a gateway, consider including
Make sure that the router program is set to
NO with the following line in /etc/rc.conf:
It is important that the
routed daemon is not started, as
routed tends to delete the default routing table entries created by
It is probably a good idea to ensure that the
sendmail_flags line does not include the
-q option, otherwise
sendmail will attempt to do a network lookup every now and then, possibly causing your machine to dial out. You may try:
The downside is that
sendmail is forced to re-examine the mail queue whenever the ppp link. To automate this, include
!bg in ppp.linkup:
1 provider: 2 delete ALL 3 add 0 0 HISADDR 4 !bg sendmail -bd -q30m
An alternative is to set up a "dfilter" to block SMTP traffic. Refer to the sample files for further details.
All that is left is to reboot the machine. After rebooting, either type:
dial provider to start the PPP session, or, to configure
ppp to establish sessions automatically when there is outbound traffic and start_if.tun0 does not exist, type:
# ppp -auto provider
It is possible to talk to the
ppp program while it is running in the background, but only if a suitable diagnostic port has been set up. To do this, add the following line to the configuration:
set server /var/run/ppp-tun%d DiagnosticPassword 0177
This will tell PPP to listen to the specified UNIX™ domain socket, asking clients for the specified password before allowing access. The
%d in the name is replaced with the tun device number that is in use.
Once a socket has been set up, the pppctl(8) program may be used in scripts that wish to manipulate the running program.
An alternative to
getty is comms/mgetty+sendfax port), a smarter version of
getty designed with dial-up lines in mind.
The advantages of using
mgetty is that it actively talks to modems, meaning if port is turned off in /etc/ttys then the modem will not answer the phone.
Later versions of
mgetty (from 0.99beta onwards) also support the automatic detection of PPP streams, allowing clients scriptless access to the server.
Refer to http://mgetty.greenie.net/doc/mgetty_toc.html for more information on
By default the comms/mgetty+sendfax port comes with the
AUTO_PPP option enabled allowing
mgetty to detect the LCP phase of PPP connections and automatically spawn off a ppp shell. However, since the default login/password sequence does not occur it is necessary to authenticate users using either PAP or CHAP.
This section assumes the user has successfully compiled, and installed the comms/mgetty+sendfax port on his system.
Ensure that /usr/local/etc/mgetty+sendfax/login.config has the following:
/AutoPPP/ - - /etc/ppp/ppp-pap-dialup
mgetty to run ppp-pap-dialup for detected PPP connections.
Create an executable file called /etc/ppp/ppp-pap-dialup containing the following:
#!/bin/sh exec /usr/sbin/ppp -direct pap$IDENT
For each dial-up line enabled in /etc/ttys, create a corresponding entry in /etc/ppp/ppp.conf. This will happily co-exist with the definitions we created above.
pap: enable pap set ifaddr 126.96.36.199 188.8.131.52-184.108.40.206 enable proxy
Each user logging in with this method will need to have a username/password in /etc/ppp/ppp.secret, or alternatively add the following option to authenticate users via PAP from /etc/passwd.
To assign some users a static IP number, specify the number as the third argument in /etc/ppp/ppp.secret. See /usr/shared/examples/ppp/ppp.secret.sample for examples.
27.3. PPP 連線疑難排解
This section covers a few issues which may arise when using PPP over a modem connection. Some ISPs present the
ssword prompt while others present
password. If the
ppp script is not written accordingly, the login attempt will fail. The most common way to debug
ppp connections is by connecting manually as described in this section.
When using a custom kernel, make sure to include the following line in the kernel configuration file:
The uart device is already included in the
GENERIC kernel, so no additional steps are necessary in this case. Just check the
dmesg output for the modem device with:
# dmesg | grep uart
This should display some pertinent output about the uart devices. These are the COM ports we need. If the modem acts like a standard serial port, it should be listed on uart1, or COM2. If so, a kernel rebuild is not required. When matching up, if the modem is on uart1, the modem device would be /dev/cuau1.
Connecting to the Internet by manually controlling
ppp is quick, easy, and a great way to debug a connection or just get information on how the ISP treats
ppp client connections. Lets start PPP from the command line. Note that in all of our examples we will use example as the hostname of the machine running PPP. To start
ppp ON example> set device /dev/cuau1
This second command sets the modem device to cuau1.
ppp ON example> set speed 115200
This sets the connection speed to 115,200 kbps.
ppp ON example> enable dns
ppp to configure the resolver and add the nameserver lines to /etc/resolv.conf. If
ppp cannot determine the hostname, it can manually be set later.
ppp ON example> term
This switches to "terminal" mode in order to manually control the modem.
deflink: Entering terminal mode on /dev/cuau1 type '~h' for help
at OK atdt123456789
at to initialize the modem, then use
atdt and the number for the ISP to begin the dial in process.
Confirmation of the connection, if we are going to have any connection problems, unrelated to hardware, here is where we will attempt to resolve them.
At this prompt, return the prompt with the username that was provided by the ISP.
At this prompt, reply with the password that was provided by the ISP. Just like logging into FreeBSD, the password will not echo.
Shell or PPP:ppp
Depending on the ISP, this prompt might not appear. If it does, it is asking whether to use a shell on the provider or to start
ppp. In this example,
ppp was selected in order to establish an Internet connection.
Ppp ON example>
Notice that in this example the first
p has been capitalized. This shows that we have successfully connected to the ISP.
PPp ON example>
We have successfully authenticated with our ISP and are waiting for the assigned IP address.
PPP ON example>
We have made an agreement on an IP address and successfully completed our connection.
PPP ON example>add default HISADDR
Here we add our default route, we need to do this before we can talk to the outside world as currently the only established connection is with the peer. If this fails due to existing routes, put a bang character
! in front of the
add. Alternatively, set this before making the actual connection and it will negotiate a new route accordingly.
If everything went good we should now have an active connection to the Internet, which could be thrown into the background using CTRL+z If
PPP returns to
ppp then the connection has bee lost. This is good to know because it shows the connection status. Capital P’s represent a connection to the ISP and lowercase p’s show that the connection has been lost.
If a connection cannot be established, turn hardware flow CTS/RTS to off using
set ctsrts off. This is mainly the case when connected to some PPP-capable terminal servers, where PPP hangs when it tries to write data to the communication link, and waits for a Clear To Send (CTS) signal which may never come. When using this option, include
set accmap as it may be required to defeat hardware dependent on passing certain characters from end to end, most of the time XON/XOFF. Refer to ppp(8) for more information on this option and how it is used.
An older modem may need
set parity even. Parity is set at none be default, but is used for error checking with a large increase in traffic, on older modems.
PPP may not return to the command mode, which is usually a negotiation error where the ISP is waiting for negotiating to begin. At this point, using
~p will force ppp to start sending the configuration information.
If a login prompt never appears, PAP or CHAP authentication is most likely required. To use PAP or CHAP, add the following options to PPP before going into terminal mode:
ppp ON example> set authname myusername
Where myusername should be replaced with the username that was assigned by the ISP.
ppp ON example> set authkey mypassword
Where mypassword should be replaced with the password that was assigned by the ISP.
If a connection is established, but cannot seem to find any domain name, try to ping(8) an IP address. If there is 100 percent (100%) packet loss, it is likely that a default route was not assigned. Double check that
add default HISADDR was set during the connection. If a connection can be made to a remote IP address, it is possible that a resolver address has not been added to /etc/resolv.conf. This file should look like:
domain example.com nameserver x.x.x.x nameserver y.y.y.y
Where x.x.x.x and y.y.y.y should be replaced with the IP address of the ISP’s DNS servers.
To configure syslog(3) to provide logging for the PPP connection, make sure this line exists in /etc/syslog.conf:
!ppp *.* /var/log/ppp.log
27.4. 在乙太網路使用 PPP (PPPoE)
本節介紹如何設定在 乙太網路使用 PPP (PPPoE)。
以下有一個可用的的 ppp.conf 範例：
default: set log Phase tun command # you can add more detailed logging if you wish set ifaddr 10.0.0.1/0 10.0.0.2/0 name_of_service_provider: set device PPPoE:xl1 # replace xl1 with your Ethernet device set authname YOURLOGINNAME set authkey YOURPASSWORD set dial set login add default HISADDR
# ppp -ddial name_of_service_provider
ppp_enable="YES" ppp_mode="ddial" ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO ppp_profile="name_of_service_provider"
27.4.1. 使用 PPPoE 服務標籤
有時需要使用服務標籤 (Service Tag) 才能建立連線，服務標籤用來區別不同網路要各自連線的 PPPoE 伺服器。
所需的服務標籤資訊應該會在 ISP 所提供的文件中說明。
最後的手段是嘗試安裝 net/rr-pppoe 套件或 Port。但是請注意，這可能會解除安裝數據機中的程式並使其無法運作，所以請三思而為。只需要安裝數據機所提供的程式，然後由該程式進入 System 選單，基本資料 (Profile name) 的名稱應該會列出來，通常是 ISP 的名稱。
基本資料名稱 (Profile Name) 即服務標籤，會被用在 ppp.conf 中的 PPPoE 設定項目，
set device 的提供商 (Provider) 部份。請參考 ppp(8) 以取得詳細說明，結果應如下：
set device PPPoE:xl1:ISP
別忘記更改 xl1 為乙太網路卡的裝置名稱。
別忘記更改 ISP 為基本資料名稱。
要取得更進一步資訊，請參考 Renaud Waldura 所著的 Cheaper Broadband with FreeBSD on DSL。
27.4.2. 在 3Com™HomeConnect™ ADSL Modem Dual Link 使用 PPPoE
這台數據機並不採用 RFC 2516 所定義的規格。
為了要讓 FreeBSD 能夠與這台裝置通訊，必須設定 sysctl，這可以透過更新 /etc/sysctl.conf 來讓開機時自動設定。
# sysctl net.graph.nonstandard_pppoe=1
不幸的是，由於這是一個全系統的設定，這可能導致一般 PPPoE 客戶端或伺服器無法與 3Com™HomeConnect™ ADSL 數據機同時使用。
27.5. 在 ATM 使用 PPP (PPPoA)
The following describes how to set up PPP over ATM (PPPoA). PPPoA is a popular choice among European DSL providers.
27.5.1. 使用 mpd
The mpd application can be used to connect to a variety of services, in particular PPTP services. It can be installed using the net/mpd5 package or port. Many ADSL modems require that a PPTP tunnel is created between the modem and computer.
Once installed, configure mpd to suit the provider’s settings. The port places a set of sample configuration files which are well documented in /usr/local/etc/mpd/. A complete guide to configure mpd is available in HTML format in /usr/ports/shared/doc/mpd/. Here is a sample configuration for connecting to an ADSL service with mpd. The configuration is spread over two files, first the mpd.conf:
This example mpd.conf only works with mpd 4.x.
default: load adsl adsl: new -i ng0 adsl adsl set bundle authname username (1) set bundle password password (2) set bundle disable multilink set link no pap acfcomp protocomp set link disable chap set link accept chap set link keep-alive 30 10 set ipcp no vjcomp set ipcp ranges 0.0.0.0/0 0.0.0.0/0 set iface route default set iface disable on-demand set iface enable proxy-arp set iface idle 0 open
|1||The username used to authenticate with your ISP.|
|2||The password used to authenticate with your ISP.|
Information about the link, or links, to establish is found in mpd.links. An example mpd.links to accompany the above example is given beneath:
adsl: set link type pptp set pptp mode active set pptp enable originate outcall set pptp self 10.0.0.1 (1) set pptp peer 10.0.0.138 (2)
|1||The IP address of FreeBSD computer running mpd.|
|2||The IP address of the ADSL modem. The Alcatel SpeedTouch™ Home defaults to |
It is possible to initialize the connection easily by issuing the following command as
# mpd -b adsl
To view the status of the connection:
% ifconfig ng0 ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500 inet 220.127.116.11 --> 18.104.22.168 netmask 0xffffffff
Using mpd is the recommended way to connect to an ADSL service with FreeBSD.
27.5.2. 使用 pptpclient
It is also possible to use FreeBSD to connect to other PPPoA services using net/pptpclient.
To use net/pptpclient to connect to a DSL service, install the port or package, then edit /etc/ppp/ppp.conf. An example section of ppp.conf is given below. For further information on ppp.conf options consult ppp(8).
adsl: set log phase chat lcp ipcp ccp tun command set timeout 0 enable dns set authname username (1) set authkey password (2) set ifaddr 0 0 add default HISADDR
|1||The username for the DSL provider.|
|2||The password for your account.|
Since the account’s password is added to ppp.conf in plain text form, make sure nobody can read the contents of this file:
This will open a tunnel for a PPP session to the DSL router. Ethernet DSL modems have a preconfigured LAN IP address to connect to. In the case of the Alcatel SpeedTouch™ Home, this address is
10.0.0.138. The router’s documentation should list the address the device uses. To open the tunnel and start a PPP session:
# pptp address adsl
If an ampersand ("&") is added to the end of this command, pptp will return the prompt.
A tun virtual tunnel device will be created for interaction between the pptp and ppp processes. Once the prompt is returned, or the pptp process has confirmed a connection, examine the tunnel:
% ifconfig tun0 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 inet 22.214.171.124 --> 126.96.36.199 netmask 0xffffff00 Opened by PID 918
If the connection fails, check the configuration of the router, which is usually accessible using a web browser. Also, examine the output of
pptp and the contents of the log file, /var/log/ppp.log for clues.