{"id":721,"date":"2012-10-08T00:57:32","date_gmt":"2012-10-07T22:57:32","guid":{"rendered":"http:\/\/diablo.craem.net\/wordpress\/?p=721"},"modified":"2012-10-08T00:57:32","modified_gmt":"2012-10-07T22:57:32","slug":"freeradius-mysql-pptpd-en-debian","status":"publish","type":"post","link":"https:\/\/diablo.craem.net\/?p=721","title":{"rendered":"FreeRadius + Mysql + PPTPD en Debian."},"content":{"rendered":"<p>Siguiendo al post anterior, ahora toca crear el servidor PPTPD, para por ejemplo, lanzar la vpn desde nuestro android.<br \/>\nPrimero comprobamos si tenemos en el Kernel de nuestro linux, el soporte para MPPE, para ello:<br \/>\n<code><br \/>\n# modprobe ppp-compress-18 && echo OK<br \/>\n<\/code><br \/>\nSi sale OK, pues eso, ha ido bien&#8230;. \u00c2\u00bf y qu\u00e9 es eso de MPPE ?, pues nada, un protocolo de micro$oft para encriptar datos, l\u00e9ase:<br \/>\n<strong>https:\/\/en.wikipedia.org\/wiki\/Microsoft_Point-to-Point_Encryption<\/strong><br \/>\nY ojo, que tiene su propia RFC  (O_o).<br \/>\nAhora, instalamos el server pptpd en nuestro querido debian:<br \/>\n<code><br \/>\n# apt-get install pptpd<br \/>\n<\/code><br \/>\nAntes de empezar a configurar, hemos de tener claro:<br \/>\n1\u00ba) Pool de Ip&#8217;s que les asignaremos a los usuarios<br \/>\n2\u00ba) Dentro del Pool, las opciones de dns y dem\u00e1s que querremos usar para los clientes<br \/>\nEditamos el fichero <em>\/etc\/pptpd.conf<\/em> y lo vamos dejando tal que:<br \/>\n<code><br \/>\nlocalip 192.168.2.13<br \/>\nremoteip 192.168.100.234-240<br \/>\n<\/code><br \/>\nDonde <em>localip<\/em>, que con gran ojo avizor, deducimos que es la ip de nuestro servidor y, el que tenga la suerte de poder ponerle la ip p\u00fablica directamente, pues eso que se lleva.<br \/>\nLa <em>remoteip<\/em>, ser\u00e1 el pool de IP&#8217;s que asignaremos a los usuarios remotos.<br \/>\nGuardamos los cambios, reinciamos el daemon pptpd y seguimos configurando y instalamos el paquete <em>libradiusclient-ng2<\/em>, que ser\u00e1 el responsable de la relaci\u00f3n entre pptpd y freeradius&#8230; para ello:<br \/>\n<code><br \/>\napt-get install libradiusclient-ng2<br \/>\n<\/code><br \/>\nY renombramos la carpeta para que quede m\u00e1s elegante:<br \/>\n<code><br \/>\nmv \/etc\/radiusclient-ng\/ \/etc\/radiusclient\/<br \/>\n<\/code><br \/>\nCreamos un fichero, que ya explicaremos la funci\u00f3n:<br \/>\n<code><br \/>\necho \"\" > \/etc\/radiusclient\/port-id-map<br \/>\n<\/code><br \/>\nAhora editaremos el fichero <em>radiusclient.conf<\/em><br \/>\n<code><br \/>\n# nano \/etc\/radiusclient\/radiusclient.conf<br \/>\n<\/code><br \/>\nY lo dejamos tal que:<br \/>\n<code><br \/>\n# General settings<br \/>\n# specify which authentication comes first respectively which<br \/>\n# authentication is used. possible values are: \"radius\" and \"local\".<br \/>\n# if you specify \"radius,local\" then the RADIUS server is asked<br \/>\n# first then the local one. if only one keyword is specified only<br \/>\n# this server is asked.<br \/>\n<strong>auth_order      radius<\/strong><br \/>\n# maximum login tries a user has<br \/>\nlogin_tries     4<br \/>\n# timeout for all login tries<br \/>\n# if this time is exceeded the user is kicked out<br \/>\nlogin_timeout   60<br \/>\n# name of the nologin file which when it exists disables logins.<br \/>\n# it may be extended by the ttyname which will result in<br \/>\n# a terminal specific lock (e.g. \/etc\/nologin.ttyS2 will disable<br \/>\n# logins on \/dev\/ttyS2)<br \/>\nnologin \/etc\/nologin<br \/>\n# name of the issue file. it's only display when no username is passed<br \/>\n# on the radlogin command line<br \/>\nissue   \/etc\/radiusclient\/issue<br \/>\n# RADIUS settings<br \/>\n# RADIUS server to use for authentication requests. this config<br \/>\n# item can appear more then one time. if multiple servers are<br \/>\n# defined they are tried in a round robin fashion if one<br \/>\n# server is not answering.<br \/>\n# optionally you can specify a the port number on which is remote<br \/>\n# RADIUS listens separated by a colon from the hostname. if<br \/>\n# no port is specified \/etc\/services is consulted of the radius<br \/>\n# service. if this fails also a compiled in default is used.<br \/>\n<strong>authserver      localhost:1812<\/strong><br \/>\n# RADIUS server to use for accouting requests. All that I<br \/>\n# said for authserver applies, too.<br \/>\n#<br \/>\n<strong>acctserver      localhost:1812<\/strong><br \/>\n# file holding shared secrets used for the communication<br \/>\n# between the RADIUS client and server<br \/>\n<strong>servers         \/etc\/radiusclient\/servers<\/strong><br \/>\n# dictionary of allowed attributes and values<br \/>\n# just like in the normal RADIUS distributions<br \/>\ndictionary      \/etc\/radiusclient\/dictionary<br \/>\n# program to call for a RADIUS authenticated login<br \/>\nlogin_radius    \/usr\/sbin\/login.radius<br \/>\n# file which holds sequence number for communication with the<br \/>\n# RADIUS server<br \/>\nseqfile         \/var\/run\/radius.seq<br \/>\n# file which specifies mapping between ttyname and NAS-Port attribute<br \/>\nmapfile         \/etc\/radiusclient\/port-id-map<br \/>\n# default authentication realm to append to all usernames if no<br \/>\n# realm was explicitly specified by the user<br \/>\n# the radiusd directly form Livingston doesnt use any realms, so leave<br \/>\n# it blank then<br \/>\ndefault_realm<br \/>\n# time to wait for a reply from the RADIUS server<br \/>\nradius_timeout  10<br \/>\n# resend request this many times before trying the next server<br \/>\nradius_retries  3<br \/>\n# local address from which radius packets have to be sent<br \/>\n# bindaddr 0.0.0.0<br \/>\n# LOCAL settings<br \/>\n# program to execute for local login<br \/>\n# it must support the -f flag for preauthenticated login<br \/>\nlogin_local     \/bin\/login<br \/>\n<\/code><br \/>\nDefiniremos nuestros servidores radius (modificando lo que est\u00e1 en negrita), con lo que toque.<br \/>\nAhora definiremos la pre-shared key para los servidores radius:<br \/>\n<code><br \/>\nnano \/etc\/radiusclient\/servers<br \/>\n<\/code><br \/>\ny colocamos nuestros datos:<br \/>\n<code><br \/>\n#Server Name or Client\/Server pair              Key<br \/>\n#----------------                               ---------------<br \/>\nip.de.nuestro.radius_server                     misuperclavemolona<br \/>\n<\/code><br \/>\nEditamos el fichero <em>pptpd-options<\/em><br \/>\n<code><br \/>\nnano \/etc\/ppp\/pptpd-options<br \/>\n<\/code><br \/>\nPor ahora, nos vamos a centrar en pap \/ spap&#8230; una vez nos funcione, buscaremos otros m\u00e9todos m\u00e1s seguros:<br \/>\n<code><br \/>\n###############################################################################<br \/>\n# $Id: pptpd-options 4643 2006-11-06 18:42:43Z rene $<br \/>\n#<br \/>\n# Sample Poptop PPP options file \/etc\/ppp\/pptpd-options<br \/>\n# Options used by PPP when a connection arrives from a client.<br \/>\n# This file is pointed to by \/etc\/pptpd.conf option keyword.<br \/>\n# Changes are effective on the next connection.  See \"man pppd\".<br \/>\n#<br \/>\n# You are expected to change this file to suit your system.  As<br \/>\n# packaged, it requires PPP 2.4.2 and the kernel MPPE module.<br \/>\n###############################################################################<br \/>\n# Authentication<br \/>\n# Name of the local system for authentication purposes<br \/>\n# (must match the second field in \/etc\/ppp\/chap-secrets entries)<br \/>\n<strong>name minombrechulo-del-servidor<\/strong><br \/>\n# Optional: domain name to use for authentication<br \/>\n<strong>domain craem.net<\/strong><br \/>\n# Strip the domain prefix from the username before authentication.<br \/>\n# (applies if you use pppd with chapms-strip-domain patch)<br \/>\n#chapms-strip-domain<br \/>\n# Encryption<br \/>\n# Debian: on systems with a kernel built with the package<br \/>\n# kernel-patch-mppe >= 2.4.2 and using ppp >= 2.4.2, ...<br \/>\n# {{{<br \/>\n<strong>require-pap<br \/>\nrequire-chap<br \/>\nrefuse-mschap<\/strong><br \/>\n# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft<br \/>\n# Challenge Handshake Authentication Protocol, Version 2] authentication.<br \/>\n# refuse-mschap-v2<br \/>\n# Require MPPE 128-bit encryption<br \/>\n# (note that MPPE requires the use of MSCHAP-V2 during authentication)<br \/>\n# refuse-mppe-128<br \/>\n# }}}<br \/>\n# Network and Routing<br \/>\n# If pppd is acting as a server for Microsoft Windows clients, this<br \/>\n# option allows pppd to supply one or two DNS (Domain Name Server)<br \/>\n# addresses to the clients.  The first instance of this option<br \/>\n# specifies the primary DNS address; the second instance (if given)<br \/>\n# specifies the secondary DNS address.<br \/>\n# Attention! This information may not be taken into account by a Windows<br \/>\n# client. See KB311218 in Microsoft's knowledge base for more information.<br \/>\n<strong>ms-dns 8.8.8.8<br \/>\nms-dns 8.8.4.4<\/strong><br \/>\n# If pppd is acting as a server for Microsoft Windows or \"Samba\"<br \/>\n# clients, this option allows pppd to supply one or two WINS (Windows<br \/>\n# Internet Name Services) server addresses to the clients.  The first<br \/>\n# instance of this option specifies the primary WINS address; the<br \/>\n# second instance (if given) specifies the secondary WINS address.<br \/>\n#ms-wins 10.0.0.3<br \/>\n#ms-wins 10.0.0.4<br \/>\n# Add an entry to this system's ARP [Address Resolution Protocol]<br \/>\n# table with the IP address of the peer and the Ethernet address of this<br \/>\n# system.  This will have the effect of making the peer appear to other<br \/>\n# systems to be on the local ethernet.<br \/>\n# (you do not need this if your PPTP server is responsible for routing<br \/>\n# packets to the clients -- James Cameron)<br \/>\n<strong>proxyarp<\/strong><br \/>\n# Debian: do not replace the default route<br \/>\nnodefaultroute<br \/>\n# Logging<br \/>\n# Enable connection debugging facilities.<br \/>\n# (see your syslog configuration for where pppd sends to)<br \/>\n#debug<br \/>\n# Print out all the option values which have been set.<br \/>\n# (often requexsted by mailing list to verify options)<br \/>\n#dump<br \/>\n# Miscellaneous<br \/>\n# Create a UUCP-style lock file for the pseudo-tty to ensure exclusive<br \/>\n# access.<br \/>\nlock<br \/>\n# Disable BSD-Compress compression<br \/>\nnobsdcomp<br \/>\nmtu 1200<br \/>\nmru 1200<br \/>\nplugin radius.so<br \/>\nplugin radattr.so<br \/>\nlcp-echo-failure 50<br \/>\n<\/code><br \/>\nCreamos un NAS en nuestro radius (lo vimos en el post anterior), reiniciamos el servicio pptpd y listo.<br \/>\nProbamos un cliente ( un android, por ejemplo)<br \/>\n<code><br \/>\nStarting PPTP Daemon: pptpd.<br \/>\nroot@radius_lan:\/etc\/ppp# tail -f \/var\/log\/syslog<br \/>\nOct  8 00:51:12 rlan pppd[2488]: Using interface ppp0<br \/>\nOct  8 00:51:12 rlan pppd[2488]: Connect: ppp0 <--> \/dev\/pts\/1<br \/>\nOct  8 00:51:12 rlan pptpd[2486]: GRE: Bad checksum from pppd.<br \/>\nOct  8 00:51:12 rlan pppd[2488]: Deflate (15) compression enabled<br \/>\nOct  8 00:51:12 rlan pppd[2488]: Cannot determine ethernet address for proxy ARP<br \/>\nOct  8 00:51:12 rlan pppd[2488]: local  IP address 192.168.2.94<br \/>\nOct  8 00:51:12 rlan pppd[2488]: remote IP address 192.168.100.234<br \/>\nOct  8 00:51:26 rlan pptpd[2495]: MGR: Maximum of 200 connections reduced to 7, not enough IP addresses given<br \/>\nOct  8 00:51:26 rlan pptpd[2496]: MGR: Manager process started<br \/>\nOct  8 00:51:26 rlan pptpd[2496]: MGR: Maximum of 7 connections available<br \/>\nOct  8 00:51:40 rlan pptpd[2486]: CTRL: EOF or bad error reading ctrl packet length.<br \/>\nOct  8 00:51:40 rlan pptpd[2486]: CTRL: couldn't read packet header (exit)<br \/>\nOct  8 00:51:40 rlan pptpd[2486]: CTRL: CTRL read failed<br \/>\nOct  8 00:51:40 rlan pptpd[2486]: CTRL: Reaping child PPP[2488]<br \/>\nOct  8 00:51:40 rlan pptpd[2498]: CTRL: Client 192.168.2.68 control connection started<br \/>\nOct  8 00:51:40 rlan pptpd[2498]: CTRL: Starting call (launching pppd, opening GRE)<br \/>\nOct  8 00:51:40 rlan pppd[2499]: Plugin radius.so loaded.<br \/>\nOct  8 00:51:40 rlan pppd[2499]: RADIUS plugin initialized.<br \/>\nOct  8 00:51:40 rlan pppd[2499]: Plugin radattr.so loaded.<br \/>\nOct  8 00:51:40 rlan pppd[2499]: RADATTR plugin initialized.<br \/>\nOct  8 00:51:40 rlan pppd[2499]: Plugin \/usr\/lib\/pptpd\/pptpd-logwtmp.so loaded.<br \/>\nOct  8 00:51:40 rlan pppd[2499]: pppd 2.4.5 started by root, uid 0<br \/>\nOct  8 00:51:40 rlan pppd[2499]: Using interface ppp1<br \/>\nOct  8 00:51:40 rlan pppd[2499]: Connect: ppp1 <--> \/dev\/pts\/2<br \/>\nOct  8 00:51:40 rlan pptpd[2498]: GRE: Bad checksum from pppd.<br \/>\nOct  8 00:51:40 rlan pppd[2499]: Deflate (15) compression enabled<br \/>\nOct  8 00:51:40 rlan pppd[2499]: Cannot determine ethernet address for proxy ARP<br \/>\nOct  8 00:51:40 rlan pppd[2499]: local  IP address 192.168.2.13<br \/>\nOct  8 00:51:40 rlan pppd[2499]: remote IP address 192.168.100.234<br \/>\n<\/code><br \/>\nY vemos el log del freeradius:<br \/>\n<code><br \/>\nListening on authentication address * port 1812<br \/>\nListening on accounting address * port 1813<br \/>\nListening on authentication address 127.0.0.1 port 18120 as server inner-tunnel<br \/>\nListening on proxy address * port 1814<br \/>\nReady to process requests.<br \/>\n<strong>rad_recv: Access-Request packet from host 127.0.0.1 port 33461, id=45, length=108<br \/>\n\tService-Type = Framed-User<br \/>\n\tFramed-Protocol = PPP<br \/>\n\tUser-Name = \"angel\"<br \/>\n\tCHAP-Challenge = 0x33c4ad40b662648176b52f85b7b47c47030561884ce3<br \/>\n\tCHAP-Password = 0x679fa22be2a3a09c79e7ff5f047edb60ae<br \/>\n\tCalling-Station-Id = \"192.168.2.68\"<br \/>\n\tNAS-IP-Address = 127.0.1.1<br \/>\n\tNAS-Port = 0<\/strong><br \/>\n# Executing section authorize from file \/etc\/freeradius\/sites-enabled\/default<br \/>\n+- entering group authorize {...}<br \/>\n++[preprocess] returns ok<br \/>\n[chap] Setting 'Auth-Type := CHAP'<br \/>\n++[chap] returns ok<br \/>\n++[digest] returns noop<br \/>\n[suffix] No '@' in User-Name = \"angel\", looking up realm NULL<br \/>\n[suffix] No such realm \"NULL\"<br \/>\n++[suffix] returns noop<br \/>\n[eap] No EAP-Message, not doing EAP<br \/>\n++[eap] returns noop<br \/>\n[files] users: Matched entry DEFAULT at line 172<br \/>\n++[files] returns ok<br \/>\n[sql] \texpand: %{User-Name} -> angel<br \/>\n[sql] sql_set_user escaped user --> 'angel'<br \/>\nrlm_sql (sql): Reserving sql socket id: 3<br \/>\n[sql] \texpand: SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = '%{SQL-User-Name}'           ORDER BY id -> SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = 'angel'           ORDER BY id<br \/>\n[sql] User found in radcheck table<br \/>\n[sql] \texpand: SELECT id, username, attribute, value, op           FROM radreply           WHERE username = '%{SQL-User-Name}'           ORDER BY id -> SELECT id, username, attribute, value, op           FROM radreply           WHERE username = 'angel'           ORDER BY id<br \/>\n[sql] \texpand: SELECT groupname           FROM radusergroup           WHERE username = '%{SQL-User-Name}'           ORDER BY priority -> SELECT groupname           FROM radusergroup           WHERE username = 'angel'           ORDER BY priority<br \/>\nrlm_sql (sql): Released sql socket id: 3<br \/>\n++[sql] returns ok<br \/>\n++[expiration] returns noop<br \/>\n++[logintime] returns noop<br \/>\n[pap] WARNING: Auth-Type already set.  Not setting to PAP<br \/>\n++[pap] returns noop<br \/>\nFound Auth-Type = CHAP<br \/>\n# Executing group from file \/etc\/freeradius\/sites-enabled\/default<br \/>\n+- entering group CHAP {...}<br \/>\n<strong>[chap] login attempt by \"angel\" with CHAP password<br \/>\n[chap] Using clear text password \"password_chulo\" for user angel authentication.<br \/>\n[chap] chap user angel authenticated succesfully<br \/>\n++[chap] returns ok<br \/>\n# Executing section post-auth from file \/etc\/freeradius\/sites-enabled\/default<br \/>\n+- entering group post-auth {...}<br \/>\n[sql] \texpand: %{User-Name} -> angel<br \/>\n[sql] sql_set_user escaped user --> 'angel'<br \/>\n[sql] \texpand: %{User-Password} -><br \/>\n[sql] \t... expanding second conditional<\/strong><br \/>\n[sql] \texpand: %{Chap-Password} -> 0x679fa22be2a3a09c79e7ff5f047edb60ae<br \/>\n[sql] \texpand: INSERT INTO radpostauth                           (username, pass, reply, authdate)                           VALUES (                           '%{User-Name}',                           '%{%{User-Password}:-%{Chap-Password}}',                           '%{reply:Packet-Type}', '%S') -> INSERT INTO radpostauth                           (username, pass, reply, authdate)                           VALUES (                           'angel',                           '0x679fa22be2a3a09c79e7ff5f047edb60ae',                           'Access-Accept', '2012-10-08 00:54:23')<br \/>\nrlm_sql (sql) in sql_postauth: query is INSERT INTO radpostauth                           (username, pass, reply, authdate)                           VALUES (                           'angel',                           '0x679fa22be2a3a09c79e7ff5f047edb60ae',                           'Access-Accept', '2012-10-08 00:54:23')<br \/>\nrlm_sql (sql): Reserving sql socket id: 2<br \/>\nrlm_sql (sql): Released sql socket id: 2<br \/>\n++[sql] returns ok<br \/>\n[sql_log] Processing sql_log_postauth<br \/>\n[sql_log] \texpand: %{User-Name} -> angel<br \/>\n[sql_log] \texpand: %{%{User-Name}:-DEFAULT} -> angel<br \/>\n[sql_log] sql_set_user escaped user --> 'angel'<br \/>\n[sql_log] WARNING: Deprecated conditional expansion \":-\".  See \"man unlang\" for details<br \/>\n[sql_log] \t... expanding second conditional<br \/>\n[sql_log] \texpand: Chap-Password -> Chap-Password<br \/>\n[sql_log] \texpand: INSERT INTO radpostauth                   \t (username, pass, reply, authdate) VALUES                    \t ('%{User-Name}', '%{User-Password:-Chap-Password}',         \t '%{reply:Packet-Type}', '%S'); -> INSERT INTO radpostauth                   \t (username, pass, reply, authdate) VALUES                    \t ('angel', 'Chap-Password',         \t 'Access-Accept', '2012-10-08 00:54:23');<br \/>\n[sql_log] \texpand: \/var\/log\/freeradius\/radacct\/sql-relay -> \/var\/log\/freeradius\/radacct\/sql-relay<br \/>\n++[sql_log] returns ok<br \/>\n++[exec] returns noop<br \/>\n<strong>Sending Access-Accept of id 45 to 127.0.0.1 port 33461<br \/>\n\tFramed-Protocol = PPP<br \/>\n\tFramed-Compression = Van-Jacobson-TCP-IP<\/strong><br \/>\nFinished request 0.<br \/>\nGoing to the next request<br \/>\nWaking up in 4.9 seconds.<br \/>\nInvalid packet code 4 sent to authentication port from client  port 51954 : IGNORED<br \/>\nWaking up in 4.9 seconds.<br \/>\nCleaning up request 0 ID 45 with timestamp +8<br \/>\nReady to process requests.<br \/>\nInvalid packet code 4 sent to authentication port from client  port 51954 : IGNORED<br \/>\nReady to process requests.<br \/>\n<\/code><br \/>\nEnjoy your server \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Siguiendo al post anterior, ahora toca crear el servidor PPTPD, para por ejemplo, lanzar la vpn desde nuestro android. Primero comprobamos si tenemos en el Kernel de nuestro linux, el soporte para MPPE, para ello: # modprobe ppp-compress-18 &#038;&#038; echo OK Si sale OK, pues eso, ha ido bien&#8230;. \u00c2\u00bf y qu\u00e9 es eso de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[20,58,80,150],"class_list":["post-721","post","type-post","status-publish","format-standard","hentry","category-linux","tag-android","tag-debian","tag-freeradius","tag-pptpd"],"_links":{"self":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/posts\/721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=721"}],"version-history":[{"count":0,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/posts\/721\/revisions"}],"wp:attachment":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}