ACCEL-PPP.CONF(5)
๐ ACCEL-PPP.CONF โ the accel-ppp.conf(5) page, but make it make sense โจ
okay bestie, sit down, grab a strawberry ๐, because this is the file that runs the whole VPN daemon situation, and we're gonna read it together. it's giving "manual page" but it's giving "group chat study session" too. let's go ๐
๐ธ NAME ๐ธ
accel-ppp.conf โ the config file for the ACCEL-PPP VPN daemon. yes, that's the whole name section, short and iconic ๐
๐ฆ DESCRIPTION ๐ฆ
so accel-pppd(8) reads its options from this file, and usually that file lives at /etc/accel-ppp.conf. that's the one, that's the main character โจ
the config file is built out of sections, and they look exactly like this:
[section1]
name1=val1
name2=val2
name3
[section2]
....
so you got your section name in brackets, then a lil pile of name=val lines under it, and sometimes just a bare name with no value at all (a flag, a vibe, no explanation needed). lowkey the whole file is just that pattern repeated until it becomes a whole daemon ๐
๐ SECTIONS ๐
๐ [modules] ๐
this section is just... the list of modules to load. pick your fighters, assemble your team ๐ซถ
log_fileโ a logging target that logs messages to files. it supports per-session/per-user features, so it's fancy like that ๐log_syslogโ a logging target that logs messages to syslog.log_tcpโ a logging target that logs messages over TCP/IP.log_pgsqlโ a logging target that logs messages to PostgreSQL.pptpโ the PPTP controlling connection handling module.pppoeโ the PPPoE discovery stage handling module.sstpโ the SSTP controlling connection handling module.auth_papโ the PAP authentication module.auth_chap_md5โ the CHAP (md5) authentication module.auth_mschap_v1โ the Microsoft CHAP (version 1) authentication module.auth_mschap_v2โ the Microsoft CHAP (version 2) authentication module.radiusโ the RADIUS interaction module.ippoolโ the IPv4 address assigning module.ipv6poolโ the IPv6 address assigning module.ipv6_dhcpโ the IPv6 DHCP module.sigchldโ a helper module to manage child processes, and it's required bypppd_compat. no sigchld, no compat, that's the rule ๐ฅpppd_compatโ this module starts pppd compatibleip-up/ip-downscripts andip-changeto handle RADIUS CoA request.connlimitโ this module limits connection rate from a single source. one-at-a-time energy, respectfully ๐
๐ [core] ๐
configuration of the core module. the main character of main characters.
log-error=pathโ path to file for core module error logging.thread-count=nโ number of working threads. the optimal value is the number of processors/cores, so match your hardware, don't fight it โจ
๐ง [common] ๐ง
common params for all connection types. everyone shares these, no exceptions ๐
single-session=replace|denyโ specifies whether accel-ppp should control the sessions count. if this option is absent, session count control is turned off entirely. if it'sreplacethen accel-ppp will terminate the first session when a second one is authorized. if it'sdenythen accel-ppp will deny the second session authorization. choose your chaos ๐ญsingle-session-ignore-case=0|1โ specifies whether accel-ppp should ignore the case when comparing username within single-session validation (default0).sid-case=upper|lowerโ specifies in which case to generate the session identifier (defaultlower).sid-source=urandom|seqโ specifies the method used to assign session id (defaulturandom).urandomโ assign session id by random methodseqโ assign session id by sequence method
seq-file=pathโ path to file for sessions sequence number. the start sequence number may be set there (default/var/lib/accel-ppp/seq).max-sessions=nโ specifies maximum concurrent sessions which server may processed (default0, disabled).max-starting=nโ specifies maximum concurrent session attempts which server may processed (default0, disabled).check-ip=0|1โ specifies whether accel-ppp should check if IP already assigned to other client interface (default0). this check is global (not VRF-aware); withcheck-ip=1the same IPv4/IPv6 address will be rejected even if sessions are in different VRFs/netns. withcheck-ip=0overlapping addresses can be assigned (useful for isolated VRFs, but take care with overlapping pools ๐จ). this setting can be overridden by module-specificcheck-ipoptions (e.g., in the[ppp]section).nl-snd-buffer=nโ specifies netlink maximum send buffer size (theSO_SNDBUFoption) (default32768).nl-rcv-buffer=nโ specifies netlink maximum receive buffer size (theSO_RCVBUFoption) (default1048576).session-timeout=nโ specifies max sessions time in seconds, and after this time the session will be terminated. this timeout can be redefined with the radius attributeSession-Timeout. a0value means infinite timeout, aka "we live here now" ๐ซถ
๐ธ [ppp] ๐ธ
PPP module configuration. this is the big one, stay with me bestie ๐
verbose=nโ ifnis not zero, the ppp module will produce verbose logging. chatty king ๐min-mtu=nโ minimum acceptable MTU. if the client tries to negotiate less than the specified MTU then it will be NAKed, or disconnected if it rejects the greater MTU.mtu=nโ MTU which will be negotiated if the client's MRU will not be acceptable.mru=nโ preferred MRU.accomp=allow|deny|nโ Address/Control compression negotiation.allowโ prefer in send and don't deny in receive directionsdenyโ disable in both directions, this is the default behavior
pcomp=allow|deny|nโ Protocol field compression negotiation.allowโ prefer in send and don't deny in receive directionsdenyโ disable in both directions, this is the default behavior
ccp=nโ disable CCP negotiation if this parameter is zero.ccp-max-configure=nโ specifies the maximum number of CCP Configure-Request packets sent without receiving a valid Configure-Ack, Configure-Nak or Configure-Reject before assuming the peer is unable to respond (default10).mppe=require|prefer|denyโ specifies mppe negotiation preference.requireโ ask client for mppe, and if it rejects, drop the connectionpreferโ ask client for mppe, and if it rejects, don't fail.denyโ deny mppe.- the default behavior is to not ask the client for mppe, but allow it if the client wants it. and heads up ๐
: RADIUS may override this option via the
MS-MPPE-Encryption-Policyattribute.
max-configure=nโ specifies the maximum number of LCP/IPCP Configure-Request packets sent without receiving a valid Configure-Ack, Configure-Nak or Configure-Reject before assuming the peer is unable to respond (default10).max-failure=nโ specifies the maximum number of LCP/IPCP Configure-Nak returned before starting to send Configure-Reject (default10).max-terminate=nโ specifies the maximum number of Terminate-Request packets sent without receiving a Terminate-Ack before assuming the peer has disconnected (default2).max-mtu=nโ specifies the absolute maximum MTU value that can be negotiated.check-ip=0|1โ specifies whether to check if the assigned IP address is already in use by another session (this overrides the[common]check-ipfor PPP sessions).ipv4=deny|allow|prefer|requireโ specify the IPv4 (IPCP) negotiation algorithm:denyโ don't negotiate IPv4.allowโ negotiate IPv4 only if the client requests it.preferโ ask the client for IPv4 negotiation, don't fail if he rejects.requireโ require IPv4 negotiation.
ipv6=deny|allow|prefer|requireโ parameters are same as above. copy-paste energy, but for v6 ๐ฆipv6-intf-id=x:x:x:x|randomโ specify fixed or random interface identifier for IPv6.ipv6-peer-intf-id=x:x:x:x|random|ipv4|calling-sidโ specify peer interface identifier for IPv6.ipv4โ calculate interface identifier from IPv4 address, for example192:168:0:1.calling-sidโ calculate interface identifier from Calling-Station-Id.
ipv6-accept-peer-intf-id=0|1โ specify whether to accept the peer's interface identifier.lcp-echo-interval=nโ if this option is given and greater than0then the lcp module will send echo-request everynseconds.lcp-echo-failure=nโ specifies the maximum number of echo-requests that may be sent without a valid echo-reply, and if it exceeds, the connection will be terminated ๐lcp-echo-timeout=secโ specifies timeout in seconds to wait for any peer activity. if this option is specified it turns on adaptive lcp echo functionality andlcp-echo-failureis not used.unit-cache=nโ specifies number of interfaces to keep in cache. it means don't destroy the interface after the corresponding session is destroyed โ instead place it in cache and use it later for new sessions repeatedly. this should reduce kernel-level interface creation/deletion rate lack โจunit-preallocate=0|1โ if set to1then allocate the ppp unit (interface) before authorization, soNas-PortandNas-Port-Idwould be defined in the Access-Request phase. pre-planning, we love to see it ๐ซถ
๐
[auth] ๐
contains authentication params. get in, get verified, get out.
timeout=nโ ifnis not zero, specifies timeout in seconds to wait for PAP, CHAP, Microsoft CHAP v1/v2 authentication.interval=nโ ifnis not zero, specifies timeout in seconds to restart CHAP and Microsoft CHAP v1/v2 authentication.max-failure=nโ ifnis not zero, specifies maximum number of CHAP and Microsoft CHAP v1/v2 authentication failures.any-login=0|1โ if set to1it allows passing PAP, CHAP and Microsoft CHAP v1 authentication with any login. yes, any. wild, but that's what it says ๐ญnoauth=0|1โ if set to1it skips any PPP and IPOE authentication. straight in, no questions asked ๐challenge-name=nameโ specifies challenge name for CHAP authentication.
okay that's part 1 bestie, don't go anywhere, there's more coming ๐
๐ฆ [ipoe] ๐ฆ
bestie this whole section is the DHCP/IPoE girlies, she does a LOT, ok? let's go option by option, no skips ๐
verbose=nโ ifnisn't zero, the ipoe module will be out here producing verbose logging. chatty queen โจusername=ifname|lua:functionโ tells accel-ppp how to figure out the username of a user. Ifusername= ifname, then the interface name the packet arrived from gets used as the username. Ifusername= lua:username, then a lua function namedusernamegets called to build the username out of the dhcp packet fields. ๐password=username|csid|empty|<string>โ how to generate the password, pick your fighter:password= usernameโ password is literally the same as the usernamepassword= emptyโ password is an empty string (yes, really)password= csidโ password is the same asCalling-Station-Id- or you just hardcode a fixed password in
<string>๐
session-timeout=nโ max session time in seconds. After this time the session gets terminated, periodt. Can be redefined with the radius attributeSession-Timeout.idle-timeout=nโ timeout in seconds to wait for ANY packet from the client. After this time the session is terminated if the client don't send anything. Often used withmode=L3. ๐lease-time=nโ lease time in seconds to be sent to the dhcp client.renew-time=nโ lease renew time (option 58) in seconds to send to the dhcp client.rebind-time=nโ lease rebind time (option 59) in seconds to send to the dhcp client.max-lease-time=nโ max lease time in seconds. After this time the session gets terminated if the client won't renew it. no renewals, no vibes ๐ญunit-cache=nโ number of interfaces to keep in cache. Meaning: don't destroy the interface after its session is destroyed, instead pop it into cache and reuse it later for new sessions over and over. This should reduce the kernel-level interface creation/deletion rate lack. ๐งl4-redirect-table=nโ specifies a table number. If theL4-Redirectradius attribute is received and its value isn't0or'0', accel-ppp adds this rule:ip rule add from client_ip table nl4-redirect-ipset=nameโ name of the ipset list. If theL4-Redirectradius attribute is received and its value isn't0or'0', accel-ppp adds the client's ip to that ipset name.l4-redirect-on-reject=nโ if specified, then when radius rejects access, anip rule add from ip_addr table l4-redirect-tablerule gets created fornseconds. ๐l4-redirect-ip-pool=nameโ if specified, then when radius rejects access and the session is DHCP, the ip gets allocated from the specified pool name.gw-ip-address=x.x.x.x/maskโ address to be used as the server ip address when radius can only assign a client address. In that case, if the client address matches the network and mask, the specified address and mask get used. You can specify multiple such options. ๐shared=0|1โ default value for the per-interfacesharedparameter.mode=L2|L3โ default value for the per-interfacemodeparameter.start=dhcpv4|up|autoโ default value for the per-interfacestartparameter.ifcfg=0|1โ default value for the per-interfaceifcfgparameter.relay=ipv4_addressโ default value for the per-interfacerelayparameter.proxy-arp=nโ default value for the per-interfaceproxy-arpparameter.weight=nโ global weight of this server (used for load balancing). โญip-unnumbered=0|1โ default value for the per-interfaceip-unnumberedparameter. Ifip-unnumbered=1, accel-ppp will always assign a/32mask. Default value is1.agent-remote-id=stringโ the DHCP option 82 sub-option 2 to be inserted by the DHCP Relay. The purpose of the sub-option is documented in section 3.2 of RFC3046. If neither the link-selection option nor this option is present, option 82 is not inserted by the DCHP Relay Agent.link-selection=ipv4_addressโ option 82 sub-option 5 as per RFC3527, to be added by the dhcp relay. The value stands for the subnet the DHCP server should select to associate the request to a specific subnet. The purpose of the sub-option is documented in RFC3527. If neither theagent-remote-idoption nor this option is present, option 82 is not inserted by the DCHP Relay Agent. ๐interface=[re:]name[,mode=L2|L3][,shared=0|1][,start=dhcpv4|up|auto][,range=x.x.x.x/mask][,ifcfg=0|1] [,relay=x.x.x.x] [,giaddr=x.x.x.x] [,src=x.x.x.x] [,proxy-arp=0|1|2] [,username=ifname|lua:function] [,ipv6=0|1] [,mtu=N] [,weight=N] [,ip-unnumbered=0|1]โ interface to listen for dhcp or unclassified packets on. You may specify multipleinterfaceoptions.- If
nameis prefixed withre:thennameis treated as a regular expression. modesets the client connectivity mode.mode=L2means clients are on the same network as the interface.L3means the clients are behind some router.sharedsays whether the interface is shared by multiple users or is vlan-per-user.startsays which way the session starts (upโ unclassified packet).automeans automatically start a session with username = interface name. Use it together withvlan_mon.rangeis the local range of ip addresses to hand out to dhcp clients. The first IP in the range is the router IP.ifcfgsays whether accel-ppp should add the router IP address and route to the client to the interface, or whether it's explicitly configured.relayis the DHCPv4 relay IP address to pass requests to. If specified,giaddris also needed.giaddris the relay agent IP address.srcis the ip address to use as source when adding a route to the client.proxy-arpsays whether accel-ppp should reply to arp requests. ๐ฅ
- If
local-net=x.x.x.x/maskโ networks from which packets will be treated as unclassified. You may specify multiplelocal-netoptions.proto=nโ number of the protocol used for inserted routes.offer-delay=delay[,delay1:count1[,delay2:count2[,...]]]โ delays (also conditioned on connection count) for sending DHCPOFFER, in ms. The last delay in the list may be-1, which means don't accept new connections. The list must be sorted by count key. ๐ธoffer-timeout=nโ timeout waiting for DHCP-Request from the client, in seconds (default10).vlan-mon=[re:]name[,filter]โ starts vlan monitor on the specified interface (requires thevlan_monkernel module). Thefilterparameter is a list of vlans or ranges of vlans to monitor for, and may look like:
vlan-mon=eth1,2,5,10,20-30
vlan-timeout=nโ time of vlan inactivity before it gets removed, in seconds (default60). A value of0disables removal of inactive vlan. ๐ซถvlan-name=patternโ pattern for the vlan interface name. The pattern may contain these macros:%Iโ name of the pattern interface%Nโ number of vlan%Pโ number of vlan of the parent interface
By default vlan-name=%I.%N.
soft-terminate=0|1โ turns on soft terminate mode. Soft terminate means the session won't be terminated immediately, but when the next lease renewal request is received. so dramatic, so patient ๐check-mac-change=0|1โ if enabled, accel-ppp will terminate the session when it detects a change of the client's mac address (by default it is enabled).calling-sid=mac|ipโ specifies the value of theCalling-Station-Idattribute.
๐ [dns] ๐
dns1=x.x.x.xโ primary DNS to be sent to the peer.dns2=x.x.x.xโ secondary DNS to be sent to the peer.
โจ [wins] โจ
wins1=x.x.x.xโ primary NBNS to be sent to the peer.wins2=x.x.x.xโ secondary NBNS to be sent to the peer.
๐ [ipv6-dns] ๐
dns=IPv6_addressโ IPv6 DNS to be sent to the peer. You may specify up to 3dnsoptions.dnssl=nameโ DNS Search List. You may specify multiplednsanddnssloptions. ๐ฆ
๐ [client-ip-range] ๐
ok so you HAVE to explicitly specify the range of ip addresses from which clients can connect to the server, in one of these forms:
x.x.x.x/mask (for example 10.0.0.0/8)
x.x.x.x-y (for example 10.0.0.1-254)
no range, no entry, bestie ๐ญ
๐ธ [pptp] ๐ธ
Configuration of the PPTP module. let's get into it ๐
bind=x.x.x.xโ if this option is given, the pptp server will bind to the specified IP address.port=nโ if this option is given, the pptp server will bind to the specified port.verbose=nโ if this option is given andnis greater than zero, the pptp module will produce verbose logging.echo-interval=nโ if this option is given and greater than zero, the pptp module will send an echo-request everynseconds.echo-failure=nโ maximum number of echo-requests that may be sent without a valid echo-reply. If it's exceeded, the connection gets terminated. ๐timeout=nโ timeout waiting for a reply from the client, in seconds (default5).mppe=deny|allow|prefer|requireifname=ifnameโ if this option is given, the ppp interface will be renamed usingifnameas a template, i.e.pptp%d=>pptp0.ppp-max-mtu=nโ sets the maximum MTU value that can be negotiated for PPP over PPTP sessions. Default value is1436.session-timeout=nโ max session time in seconds; after this time the session will be terminated. This timeout can be redefined with the radius attributeSession-Timeout. A value of0means infinite timeout. ๐ฅ
โจ [pppoe] โ the PPPoE module, bestie โจ
Okay so this whole block is you telling the PPPoE module how to act. And there's a LOT here, so buckle up. ๐
interface=[re:]ifname[,padi-limit=n]โ tells it which interface to listen on and send discovery packets out of. You can drop multipleinterfaceoptions if you want, she's flexible like that ๐ . Ififnamestarts withre:thenifnamegets treated as a regular expression (iykyk). The optionalpadi-limitparam caps how many PADI packets get replied to on this interface per 1-second window.vlan-mon=[re:]name[,filter]โ starts a vlan monitor on the interface you name (heads up: this needs thevlan_monkernel module, no cap). Thefilterparam is a list of vlans or ranges of vlans to watch for, and it looks like this:
vlan-mon=eth1,2,5,10,20-30
vlan-timeout=nโ how long (in seconds) a vlan can sit inactive before it gets yeeted. Default is60. Set it to0and inactive vlans never get removed. periodt.vlan-name=patternโ the pattern for the vlan interface name. It can use these macros:%Iโ name of pattern interface.%Nโ number of vlan.%Pโ number of vlan of parent interface.
Default is vlan-name=%I.%N.
ac-name=ac-nameโ sets the AC-Name tag value. If you don't set it, the tag just doesn't get sent at all, she ghosts it. ๐service-name=service-nameโ the Service-Name to respond with. If absent, any Service-Name is acceptable and the client's own Service-Name gets sent right back. mutual.accept-any-service=nโ even ifservice-nameis set, she'll still answer with service names, but she'll accept any service name in the PADR request. Super useful when the client is the one picking PPPoE based on the service names it saw in PADO.accept-blank-service=nโ lets her answer a blank Service-Name even when Service-Name is configured. Iconic when you wanna allow only the Service-Names in your config plus the blank one. ๐ฆpado-delay=delay[,delay1:count1[,delay2:count2[,...]]]โ the delays (also conditioned on connection count) before sending PADO, in ms. The last delay in the list can be-1, which means "don't accept new connections". The list has to be sorted by the count key. no skipping, bestie.mac-filter=filename,typeโ the mac-filter filename and its type.typeis eitherallowordeny.called-sid=ifname|mac|ifname:macโ how to represent Called-Station-ID:ifnameโ Called-Station-ID holds the name of the interface that accepted the request.macโ Called-Station-ID holds the mac address of the interface that accepted the request.ifname:macโ Called-Station-Id holds both the name and the mac of the interface.
verbose=nโ if you set this andnis greater than zero, the pppoe module goes full verbose-logging mode. she's chatty. ๐tr101=0|1โ whether to handle TR101 tags.padi-limit=nโ the overall limit of PADI packets to reply to per 1-second period (default0, which means unlimited). Note that per-mac PADI packets get rate-limited to no more than 1 packet per second regardless.mppe=deny|allow|prefer|requireโ MPPE mode, pick one.ifname=ifnameโ if you set this, the ppp interface gets renamed usingifnameas a template, likepppoe%d => pppoe0.session-timeout=nโ max session time in seconds; after this the session gets terminated. This timeout can be redefined with the radius attributeSession-Timeout. A0value means infinite timeout. ๐ip-pool=pool_nameโ the name of the IPv4 pool to use for allocating client addresses.ipv6-pool=pool_nameโ the name of the IPv6 pool to use for allocating client addresses.ipv6-pool-delegate=pool_nameโ the name of the IPv6 prefix delegation pool to use.ifname-in-sid=0|1โ set to1and the interface name gets included in the Session ID.sid-uppercase=0|1โ set to1and the Session ID is generated in UPPERCASE. loud and proud. ๐ฃcookie-timeout=nโ the timeout in seconds for the PPPoE cookie (that's the PADO/PADR stage).
๐ธ [l2tp] โ the L2TP module, she's a whole vibe ๐ธ
Now we're in L2TP territory. Same energy, lots of knobs, let's go. ๐
bind=x.x.x.xโ the IP address to bind to.port=nโ the port to bind to.host-name=stringโ this name gets sent to clients in the Host-Name attribute.hello-interval=nโ interval (in seconds) between sending the Hello control message. It's used for keep-alive on the connection. If the peer doesn't respond to Hello, the connection gets terminated. ๐recv-window=nโ sets the size of the local receive window. Only received messages whose sequence number falls in the range[last-Nr + 1, last-Nr + recv-window]are accepted (wherelast-Nris the sequence number of the last acknowledged message). Minimum is1, maximum is32768, default is16.timeout=nโ timeout (in seconds) to wait for the peer to complete tunnel and session negotiation.rtimeout=nโ timeout (in seconds) to wait for a message acknowledge; if it elapses, the message gets retransmitted. The timeout gets multiplied by two after each retransmission. So ifrtimeoutis1, the first retransmission happens after one second, the second two seconds later, the third four seconds later, and so on, until a reply arrives or the retransmit value is reached. Default is1.rtimeout-cap=nโ the maximum interval between retransmissions. The exponential backoff fromrtimeoutnever grows abovertimeout-cap.rtimeout-capmust be higher thanrtimeoutand, according to RFC 2661, must be no less than8(though accel-ppp doesn't enforce that rule, cheeky). Default is16.retransmit=nโ max number of message retransmissions; exceed it and the connection gets terminated. bye. ๐verbose=nโ if given andnis greater than zero, the l2tp module goes verbose-logging. chatty era.mppe=deny|allow|prefer|requireโ MPPE mode, pick your fighter.secret=stringโ the secret to connect to the server.hide-avps=nโ if given andnis greater than0, attributes sent in L2TP packets get hidden (for the AVPs that support it). sneaky โจdataseq=deny|allow|prefer|requireโ the data sequencing negotiation algorithm:denyโ don't send data packets with sequence numbers.allowโ send data packets with sequence numbers only if the peer requested it.preferโ send data packets with sequence numbers and enable the same for the peer.requireโ send data packets with sequence numbers and enforce the same for the peer.
reorder-timeout=msโ timeout (in milliseconds) to wait for out-of-order packets. If0, don't even try to reorder. ๐use-ephemeral-ports=0|1โ whether an arbitrary source port gets used when replying to a tunnel establishment request. When this is deactivated, the destination port of the incoming request (SCCRQ) is used as the source port for the reply (SCCRP). Default is0.ppp-max-mtu=nโ the maximum MTU value that can be negotiated for PPP over L2TP sessions. Default is1420.ifname=ifnameโ if given, the ppp interface gets renamed usingifnameas a template, likel2tp%d => l2tp0.session-timeout=nโ max session time in seconds; after this the session gets terminated. This timeout can be redefined with the radius attributeSession-Timeout. A0value means infinite timeout. โพ๏ธavp_permissive=0|1โ set to1and she'll ignore the Mandatory (M) bit in unknown Attribute-Value Pairs (AVPs) instead of terminating the connection. forgiving queen. ๐ซถdir300_quirk=0|1โ set to1to enable a workaround for D-Link DIR-300 routers that send packets with Tunnel ID0. we've all been there.ip-pool=pool_nameโ the name of the IPv4 pool to use for allocating client addresses.ipv6-pool=pool_nameโ the name of the IPv6 pool to use for allocating client addresses.ipv6-pool-delegate=pool_nameโ the name of the IPv6 prefix delegation pool to use.
โจ [sstp] โจ
okay bestie, this whole block is the SSTP module config โ Secure Socket Tunneling Protocol, the one that lives on top of HTTPS and looks like regular web traffic to literally everyone ๐ต๏ธโ๏ธ. Set it up right and your tunnel is giving incognito main character energy.
bind=x.x.x.x|ipv6address|unix:pathname|unix:@abstractโ give this one and the sstp server will bind to that exact IP address, or to a unix pathname / abstract socket. pick your fighter ๐ฏport=nโ give this one and the sstp server binds to that port. default is443.verbose=nโ if you set this andnis greater than zero, the sstp module goes full yapper mode and produces verbose logging ๐ขtimeout=nโ how long you're willing to wait for a reply from the client, in seconds. default is60.hello-interval=nโ if this is set and greater than zero, sstp sends an echo-request everynseconds and drops the connection if there's no reply. default is60. it's giving "answer me or i'm leaving" ๐accept=ssl,proxyโ specifies the incoming connection acceptance mode. options are:sslโ enable SSL/TLS support.proxyโ enable PROXY protocol 1 & 2 support.
this is useful when accel-ppp is running behind a load balancer (like HAProxy or Nginx) or a reverse proxy. It allows accel-ppp to receive the original client IP address and port instead of the proxy's IP. The extracted real client IP is then used for:
- connlimit module checks (limiting connections per source IP).
- client-ip-range verification.
- Calling-Station-Id attribute in RADIUS and logs.
ssl-protocol=ssl2|ssl3|tls1|tls1.1|tls1.2|tls1.3โ specifies the enabled SSL/TLS protocols supported by the OpenSSL library ๐ssl-dhparam=pemfileโ specifies a file with DH parameters for DHE ciphers.ssl-ecdh-curve=stringโ specifies a curves for ECDHE ciphers. the value is specified in the format understood by the OpenSSL library.ssl-ciphers=stringโ specifies the enabled ciphers. the ciphers are specified in the format understood by the OpenSSL library.ssl-prefer-server-ciphers=nโ if given andnis greater than zero, server ciphers should be preferred over client ciphers. default is0.ssl-pemfile=pemfileโ specifies a PEM file with the server certificate. Files that contain only the leaf certificate are still supported for backward compatibility. When the file includes the full chain, certificates must be sorted starting with the subject's certificate (actual server certificate), followed by intermediate CA certificates if applicable, and ending at the highest level (root) CA. The leaf certificate (first in the file) is used to compute the initial SHA1 and SHA256 certificate hash. so like, order matters, bestie ๐ssl-keyfile=keyfileโ specifies a file with the secret key in the PEM format for the sstp server. If not set, the secret key will be loaded from thepemfileparameter.cert-hash-proto=sha1,sha256โ specifies hashing methods that can be used to compute the Compound MAC in the Crypto Binding attribute. default issha1andsha256both.cert-hash-sha1=hexstringโ the given hexadecimal value overrides the SHA1 hash computed from thepemfilecertificate, or is used directly for non-ssl mode.cert-hash-sha256=hexstringโ the given hexadecimal value overrides the SHA256 hash computed from thepemfilecertificate, or is used directly for non-ssl mode.host-name=stringโ if given, only an sstp connection to the specified host and with the same TLS SNI will be allowed. no sneaking in through a different door ๐ชhttp-error=deny|allow|http[s]://host.tld[/path]โ specify the http layer error behavior for non-sstp requests:denyโ reset connection without any error response.allowโ respond with http-specific status codes.http[s]://host.tld[/path]โ respond with an http redirect to the specified location. If/pathis not specified, the requested uri will be appended automatically.
default value is allow.
ifname=ifnameโ if given, the ppp interface will be renamed usingifnameas a template, i.esstp%d => sstp0โจppp-max-mtu=nโ set the maximum MTU value that can be negotiated for PPP over SSTP sessions. default value is1452, maximum is4087.ip-pool=pool_nameโ specifies the name of the IPv4 pool to use for allocating client addresses.ipv6-pool=pool_nameโ specifies the name of the IPv6 pool to use for allocating client addresses.ipv6-pool-delegate=pool_nameโ specifies the name of the IPv6 prefix delegation pool to use.sndbuf=nโ specifies the TCP send buffer size (SO_SNDBUF) for the SSTP socket.rcvbuf=nโ specifies the TCP receive buffer size (SO_RCVBUF) for the SSTP socket.session-timeout=nโ specifies max sessions time in seconds; after this time the session will be terminated. This timeout can be redefined with the radius attributeSession-Timeout. A0value means infinite timeout. โณ
โจ [radius] โจ
and now for the RADIUS module, aka the part where accel-ppp goes and asks the big authoritative server "hey is this person allowed in and also can i have their IP pls" ๐. This section is long, she has range, we respect her.
nas-identifier=identifierโ specifies the value to send to the RADIUS server in theNAS-Identifierattribute, and to be matched in DM/CoA requests.nas-ip-address=x.x.x.xโ specifies the value to send to the RADIUS server in theNAS-IP-Addressattribute, and to be matched in DM/CoA requests. Also, the DM/CoA server will bind to that address.gw-ip-address=x.x.x.xโ specifies the address to use as the local address of ppp interfaces ifFramed-IP-Addressis received from the RADIUS server.auth-server=x.x.x.x:port,secretโ specifies IP address, port and secret of the authentication RADIUS server. (obsolete) โ yeah she's old, don't be doing this bestie ๐acct-server=x.x.x.x:port,secretโ specifies IP address, port and secret of the accounting RADIUS server. (obsolete) same energy.server=address,secret[,auth-port=1812][,acct-port=1813][,bind-device=][,req-limit=0][,fail-timeout=0,max-fail=0,][,weight=1][,backup]โ specifies IP address, secret, and ports of the RADIUS server. Here's the breakdown, no skipping:bind-deviceโ device name or VRF to bind the connection. By default, the device name is undefined.req-limitโ number of simultaneous requests to the server (0= unlimited).fail-timeโ if the server doesn't respond, mark it as unavailable for this time (sec).max-failโ number of unreplied requests in a row, after which the server gets marked as unavailable.weightโ specifies weight of the server for multi-server configuration.backupโ mark the server as a backup server, f.e. use this server only when all other servers are failed.
If you want to specify only an authentication or accounting server, then set auth-port/acct-port to zero. You may specify multiple radius servers. stack them like bracelets ๐ซถ
dae-server=x.x.x.x:port,secret[,bind-device=]โ specifies IP address, port to bind, and secret for the Dynamic Authorization Extension server (DM/CoA).bind-deviceโ device name or VRF to bind the connection. By default, the device name is undefined.
dae-allowed=ip[,ip/cidr][,ip[/cidr]...]โ specifies allowed source IPv4 addresses or CIDR ranges for DM/CoA requests. This setting is generally recommended to restrict DM/CoA sources, but it is not required.dm_coa_secret=secretโ (deprecated, usedae-serverinstead) specifies the secret to use in DM/CoA communication.acct-interim-interval=nโ specifies interval in seconds to send accounting information (may be overriden by the radiusAcct-Interim-Intervalattribute).acct-interim-jitter=nโ specifies absolute maximum jitter value in seconds to be applied to the accounting information interval.verbose=nโ if given andnis greater than zero, the radius module produces verbose logging ๐ขinterim-verbose=nโ if given andnis greater than zero, the radius module produces verbose logging of interim radius packets. extra chatty, but specifically about the interim ones.timeout=nโ timeout to wait for a response from the server (sec).max-try=nโ specifies number of tries to sendAccess-Request/Accounting-Requestqueries.acct-timeout=nโ specifies timeout of accounting interim update.acct-delay-time=0|1โ specifies whether the radius client should include theAcct-Delay-Timeattribute in accounting requests (default0).acct-delay-start=nโ specifies delay to send the accounting start packet (defaul0).acct-on=0|1โ specifies whether the radius client should sendAccount-RequestwithAcct-Status-Type=Accounting-Onon startup andAcct-Status-Type=Accounting-Offon shutdown. so it tells on itself when it arrives and when it leaves, iconic honestly ๐attr-tunnel-type=nameโ specifies custom attribute name to be used to send tunnel type (as string).default-realm=realmโ appends the specified realm to the username if there was no realm already.strip-realm=0|1โ strips realm from username; can be used along with thedefault-realmoption for realm substitution.sid-in-auth=0|1โ specifies should accel-ppp generate and sendAcct-Session-Idon theAccess-Requestpacket.nas-port-id-in-req=0|1โ specifies should accel-ppp sendNAS-Port-IdonAccess-RequestandAccounting-Requestpackets (default1).bind=x.x.x.xโ specifies the source IP address for outgoing RADIUS packets.require-nas-identification=0|1โ if enabled, checks that theNAS-IdentifierorNAS-IP-Addressin DM/CoA requests matches the server's configuration.blast-protection=0|1โ if this option is given and1is specified, the radius module will include theMessage-Authenticatorattribute inAccess-Requestpackets. ๐ก๏ธ
๐ [log] ๐
Okay bestie, this one's all about the log and log_file modules โ where your logs go and how loud they get. ๐
log-file=fileโ the path to the file where your general log gets written. ๐log-emerg=fileโ path to the file for emergency messages. For when stuff is lowkey on fire. ๐จlog-fail-file=fileโ path to the file where the log for failed authentication sessions goes. Every rejected bestie gets a lil receipt. ๐log-tcp=x.x.x.x:portโ ship your logs off to the host you name here. โ๏ธsyslog=ident[,facility]โ send logs to the system logger instead. The facility can be:daemon,local0-local7, or a numeric value.copy=nโ if this is given and it's greater than zero, the logging engine will duplicate the session log into the general log. (Super useful when you're not using per-session or per-user logs.) ๐ซถper-session-dir=dirโ the directory for session logs. If you set this, every single session gets logged separately into a file named after its unique session identifier. ๐ธper-user-dir=dirโ the directory for user logs. If you set this, all the sessions belonging to the same user get logged into a file named after the username. โจper-session=nโ if specified andnis greater than zero, each session of the same user gets logged separately into the directory fromper-user-dir, inside a subdirectory named after the user, in a file named after the unique session identifier. Nesting era. ๐ชlevel=nโ sets the log level, and the values are:
0 turn off all logging
1 log only error messages
2 log error and warning messages
3 log error, warning and minimum information messages (use this
level in conjunction with verbose option of other modules if you
need verbose logging)
4 log error, warning and full information messages (use this
level in conjunction with verbose option of other modules if you
need verbose logging)
5 log all messages including debug messages
Heads up: levels3and4are the ones where you wanna pair them with theverboseoption of the other modules if you actually need verbose logging. iykyk. ๐
๐ [log-pgsql] ๐
Config for the log_pgsql module โ yes, we're logging straight into PostgreSQL, main character energy fr. ๐๏ธ
conninfo=conninfoโ the conninfo used to connect to your PostgreSQL server.log-table=tableโ the table that log messages get sent to. This table must contain the following fields:
timestamp timestamp
username text
sessionid text
msg text
๐ [pppd_compat] ๐
Config for the pppd_compat module โ the lil bridge that keeps your old pppd-style scripts vibing. ๐ง
ip-pre-up=fileโ path to theip-pre-upscript, which runs before the ppp interface comes up. Useful for setting up firewall rules before any traffic can pass through the interface. ๐ก๏ธip-up=fileโ path to theip-upscript, which runs when the ppp interface is completely configured and started. ๐ip-down=fileโ path to theip-downscript, which runs when the session is about to terminate. ๐ญip-change=fileโ path to theip-changescript, which runs for RADIUS CoA handling.radattr-prefix=prefixโ the prefix of the radattr files (for example/var/run/radattr, which makes the resulting files/var/run/radattr.pppX).verbose=nโ if specified and greater than zero,pppd_modulewill produce verbose logging. Spill the tea, module. โ
๐ [chap-secrets] ๐
Config for the chap-secrets module.
gw-ip-address=x.x.x.x[/mask]โ the address to use as the local address of ppp interfaces when chap-secrets is used for IP address assignment. The mask is used for IPoE.chap-secrets=fileโ alternate location for the chap-secrets file (the default is/etc/ppp/chap-secrets).encrypted=0|1โ specifies whether chap-secrets is encrypted (read the README, bestie ๐).username-hash=hash1[,hash2]โ the hash chain used to calculate the username hash.hash1,hash2are openssl known digest names (md5,sha1, etc).
๐ [ip-pool] ๐
Config for the ippool module. This is where the addresses live. ๐
gw-ip-address=x.x.x.xโ a single IP address to be used as the local address of ppp interfaces.shuffle=1|0โ whether to shuffle the initial address list. Mix it up a lil. ๐gw=rangeโ the range of local addresses of ppp interfaces, in one of these forms:
x.x.x.x/mask[,name=pool_name][,next=next_pool_name] (for example
10.0.0.0/8)
x.x.x.x-y[,name=pool_name][,next=next_pool_name] (for example
10.0.0.1-254)
tunnel=rangeโ the range of remote addresses of ppp interfaces, in the form:
x.x.x.x/mask[,name=pool_name][,next=next_pool_name]
x.x.x.x-y[,name=pool_name][,next=next_pool_name]
x.x.x.x/mask[,name=pool_name][,next=next_pool_name]orx.x.x.x-y[,name=pool_name][,next=next_pool_name]โ this also specifies the range of remote addresses of ppp interfaces. You can also skip thename=key and just use a shorthand pool name after the comma, like:
10.0.0.0/24,pool1
attr=attributeโ which RADIUS attribute contains the pool name.vendor=vendorโ if the attribute is vendor-specific, put the vendor name here.
โ ๏ธ Note: overlapping ranges in different pools are not de-duplicated. If two pools cover the same address, that IP can be allocated from each pool independently. Use non-overlapping ranges (or a single pool with next= chaining) to avoid duplicate assignments. No cap. ๐ซ
๐ [ipv6-dhcp] ๐
aftr-gw=nameโ the value for the AFTR-Name option that gets returned in DHCPv6 replies, when the client asks for it. ๐ฐ๏ธ
๐ [ipv6-pool] ๐
Config for the ipv6pool module. IPv6 era, we love to see it. ๐
ipv6prefix/mask,prefix_len[,name=pool_name][,next=next_pool_name]โ specifies a pool of addresses by dividing the prefix by networks of the given prefix length. For example:
fc00:0:1::/48,64 - specifies pool of address by dividing prefix
fc00:0:1::/48 to networks with 64 prefix len, e.g:
fc00:0:1:0::/64
fc00:0:1:1::/64
...
fc00:0:1:ffff::/64
delegate=ipv6prefix/mask,prefix_len[,name=pool_name][,next=next_pool_name]โ the range of prefixes to delegate to clients through DHCPv6 prefix delegation (rfc3633). Format is the same as above. ๐gw-ip6-address=ipv6addressโ the gateway address (used only for/128prefixes).attr-prefix=attributeโ which RADIUS attribute contains the delegated prefix pool name.attr-address=attributeโ which RADIUS attribute contains the stateful address pool name.vendor=vendorโ if the attribute is vendor-specific, put the vendor name here.
๐ฆ [connlimit] ๐ฆ
This module limits the connection rate from a single source. Slowing down the spam, one source at a time. โ
limit=count/timeโ the acceptable rate of connections, for examplelimit=1/sorlimit=10/m. โฑ๏ธburst=countโ the burst count. (no extra description given, so that's that ๐ )timeout=nโ the timeout in seconds, after which the module stops checking the rate until the burst number of connections arrives.
๐ [shaper] ๐
This module controls the shaper. Rate limiting, but make it fashion. ๐ฅ
attr=nameโ which RADIUS attribute contains the rate information. Default isFilter-ID.attr-up=nameโ the RADIUS attribute that contains the rate info for upstream.attr-down=nameโ the RADIUS attribute that contains the rate info for downstream.burst-factor=nโ burst gets calculated asratemultiplied byburst-factor. โ๏ธup-burst-factor=nโ the burst factor for upstream.down-burst-factor=nโ the burst factor for downstream.latency=nโ the latency (in milliseconds) parameter of thetbfqdisc.mpu=nโ thempuparameter of thetbfqdisc and policer.r2q=nโ ther2qparameter of the roothtbqdisc.quantum=nโ thequantumparameter ofhtbclasses.moderate-quantum=1|0โ if a fixed quantum isn't specified and this option is specified, the shaper module will check that the quantum value is valid (in the range1000-200000). โfwmark=nโ the fwmark for traffic that won't be passed through the shaper. Slip past the velvet rope. ๐ชup-limiter=police|htbโ the upstream rate limiting method.down-limiter=tbf|htb|clsactโ the downstream rate limiting method.clsactis a policer.leaf-qdisc=qdisc parametersโ in casetbfis used as the down-limiter, orhtbis used as the up-limiter or down-limiter, the specified leaf qdisc can be attached automatically. At present,sfqandfq_codelqdiscs are implemented. Parameters are the same as fortc:
sfq [ limit NUMBER ] [ perturn SECS ] [ quantum BYTES ]
fq_codel [ limit PACKETS ] [flows NUMBER ] [ target TIME ] [
interval TIME ] [quantum BYTES ] [ [no]ecn ]
rate-multiplier=nโ because accel-ppp operates with rates on a kilobit basis, if you're sending rates on a different basis you can use this option to bring your values over to kilobits. ๐งฎrate-limit=download_speed/upload_speedโ specifies whether accel-ppp should set a default rate-limit for clients. The client rate-limit gets overwritten by RADIUS filter attributes or chap-secrets rate-limit params. โจ
โจ [cli] โจ
Okay bestie, this is where you set up the actual command line interface โ like, the lil console you talk to accel-ppp through. Very demure, very powerful. ๐
verbose=nโ the yapper dial. Ifn = 1then the cli module will log the IP address of every single connection. Ifn = 2then it also logs the passed commands. So1is "I see u ๐" and2is "I see u AND I'm reading ur texts". ๐tcp=host:portโ tells the TCP module which IP address and port to listen on for incoming connections. Leavehostempty and it listens on all local interfaces, no cap. Heads up though: if you don't define this option, the module isn't loaded at all. It's giving "if you don't text first, we don't exist". ๐telnet=host:portโ same energy, but for the Telnet module: which IP address and port it listens on for incoming connections. Emptyhost= all local interfaces. And yeah, same rule โ no option defined, no module loaded. Periodt. โจpassword=passwdโ the password the TCP and Telnet modules use to authenticate clients. And if you don't define this option? No authentication is performed. Like, the door is just open. Bestie. Please set a password. ๐ญprompt=promptโ the prompt string the Telnet module shows you. Defaults toaccel-ppp. It's the lil name tag ur terminal wears. ๐history-file=filenameโ the file the Telnet module loads and stores its command history in. Defaults to/var/lib/accel-ppp/history. Your receipts, preserved forever. ๐ซถsessions-columns=column_listโ picks the default set of columns shown by theshow sessionscommand. Defaults to:
ifname,username,calling-sid,ip,rate-limit,type,comp,state,uptime
And here's the full menu of columns you can choose from, queen:
ifnameโ interface nameusernameโ user nameipโ IP addressip6โ IPv6 addressip6-dpโ IPv6 delegated prefixtypeโ connection type[pppoe|ipoe|pptp|l2tp|sstp]stateโ state of sessionuptimeโ uptime (human readable)uptime-rawโ uptime (in seconds)calling-sidโ calling station idcalled-sidโ called station idsidโ session idcompโ compression/encryption methodinbound-ifโ inbound interfaceservice-nameโ PPPoE service namerx-bytesโ received bytes (human readable)tx-bytesโ transmitted bytes (human readable)rx-bytes-rawโ received bytestx-bytes-rawโ transmitted bytesrx-pktsโ received packetstx-pktsโ transmitted packetsnetnsโ network namespacesvrfโ virtual routing and forwarding
And if you typo a column name? Invalid column names are silently discarded. No error, no drama, it just ghosts you. ๐
And that's the whole page, bestie!! ๐ We made it. This iconic lil manual is ACCEL-PPP.CONF(5), dated 23 August 2011 โ yes, she's vintage, she's a classic, she's still serving. Go forth and configure responsibly. Mwah. ๐๐๐ธ
๐ฆ where this page comes from
- alpine 3.24: accel-ppp-doc 1.14.0-r0 ยท GPL-2.0-or-later
- epel 10: accel-ppp 1.14.0-2.el10_2 ยท GPL-2.0-Only OR GPL-2.0-Or-Later OR MIT
- epel 9: accel-ppp 1.14.0-1.el9 ยท GPL-2.0-Only OR GPL-2.0-Or-Later OR MIT
- fedora 43: accel-ppp 1.14.0-1.fc43 ยท GPL-2.0-Only OR GPL-2.0-Or-Later OR MIT
- fedora 44: accel-ppp 1.14.0-1.fc44 ยท GPL-2.0-Only OR GPL-2.0-Or-Later OR MIT
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms