Brian Rogers N1URO – Silent Key

Mail of Brian Webster N2KGC – President EastNet Amateur Radio Network

It is with great sadness that I pass along the news that Brian Rogers N1URO
is now a silent key. He passed on Tuesday evening January 4th, 2022.

Brian was the author of the URONode packet radio software and past president
of the Eastnet Amateur Radio Network ( He
was an avid packet user and contributor to various software packages, not
just his own. He was also the AmprNet coordinator for the states of MA, NH,
VT, PA, MD, DE, CT, RI and ME.

Professionally his was an IT consultant and ran his company Network
Continuum Connecticut (

He was a mentor to many who wanted to operate packet nodes or set up an station. He had a broad knowledge of many other node operating
systems, keeping nodes of all types running at his QTH. He was a wealth of
detailed knowledge and will be missed immensely.

Side Note

This is very sad news. I have been in regular contact with him over the
years. He was always willing to help you with packet/amprnet related
things. He always had his own opinion on certain things, and he
couldn’t be changed. I didn’t always appreciate this. He will be
missed, packet land is a bit more empty.

Till next time.

N1URO to PI1LAP ttl 25 cct=01F0 <DISC REQ>
04:55:35T PI1LAP>N1URO Port=7 <RR R F R5>
04:55:35T PI1LAP>N1URO Port=7 <I C P S7 R5> NET/ROM
PI1LAP to N1URO ttl 25 cct=035D <DISC ACK>

73 Niels PD9Q

Uronode 2.11

Brian N1URO, has released Uronode 2.11 (Mar 03, 2020)


03/03/2020 v2.11
Changed node.h to reflect current version.

Note: The system has been behaving as best as it can be expected considering
it`s a front-end to the linux protocol stacks. As long as there can be an
ax# or sp# interface, it can attach to it and work the protocol(s) the user
wishes to use. There`s still the 2-line patch that the kernel maintainers 
need to add to ax25.ko so that netrom will continue to properly function
however that`s not the issue of URONode, it`s the kernel ax25 module.

Made a couple of changes in gateway.c where the color schema wasn`t properly
resetting the netrom prompt only in regards to aborting ping or a connect
request. This is now fixed.

Made changes in system.c where it wasn`t displaying the user being on IPv6
properly. While at it, I changed how it handles the user when they`re on
IPv4 in the lastlog and loggedin databases.

Changed user.c to reflect incoming session is via IPv6 which also fixes the
output of nodeusers so that instead of displaying ??????? it now shows that
Telnet6 is being used as the incoming protocol. This one was really getting
under my skin. Now I can rest in peace (as per QST 2/2020 haha!)

----------- Note on SystemD --------
In uronode.socket, you`ll notice the line:
This tells SystemD to listen on TCP socket 3694 for any IPv4 ONLY incoming
connection. If you wish to filter JUST your amprnet and IPv4 localhost
IPs make a line for each changing to and another for
your amprnet IP. This will by default filter any commercial IP requests
to URONode. If you want SystemD to try IPv6 *first*, don`t enter in any
IP schemas and just list the port number. SystemD by default appears to
use IPv6 prior to IPv4.

You can verify the above by running systemctl status uronode.socket:
systemctl status uronode.socket
● uronode.socket - URONode Server Activation Socket
   Loaded: loaded (/usr/lib/systemd/system/uronode.socket; enabled)
   Active: active (listening) since Mon 2016-03-07 15:30:39 EST; 6min ago
   Listen: (Stream)
 Accepted: 3; Connected: 1

----------- Wish-list: -----------
Original Development Information (aka Disclaimer): URONode was developed 
on an IBM eSeries 330 eServer with dual 1.2GHz CPUs The OS is Debian 
Linux 4 using kernel 2.4.27, libax25 v0.0.11, ax25-tools v0.0.8 and 
ax25-apps v0.0.6. This software comes with absolutely NO guarantees so 
crash n burn at your own risk. We all may be surprised and find out that 
it actually DOES something useful! URONode may not run 100% depending on 
environmental conditions specific to your system.

URONode is GLPv2 code, and tested by it`s main author on the following 
platforms: Raspberry Pi ver. B, Debian 7.7 on a Core-i3, Ubuntu 
12.0.4LTS on a Core-i3, Fedora ver. 21

Source Link

Small BUG in uronode 2.9

Mario YO2LOJ has found a small bug in the source code of UROnode.

Thanks to Marius YO2LOJ for a patch in do_ports within command.c where there is a possibility that the interface count may return NULL and the function will generate an exception in libc for the routine causing the node to segment fault out and disconnect the user from the node.

To patch the bug you need to edit the command.c in the source code of UROnode.
On line 398 you will find this line.

   if (strcmp(ax->dest_addr, "*")!=0 && strcmp(ax25_config_get_name(ax->dev), cp)==0) n++;

You have to replace it with this.

   if (strcmp(ax->dest_addr, "*")!=0 && 
ax25_config_get_name(ax->dev) && strcmp(ax25_config_get_name(ax->dev), cp)==0) n++;

After that you can recompile the source.

Or you can download a complet command.c here.

Uronode nodesearch 2.2 released

Brian N1URO has released a new version of Nodesearch 2.2

Change is that now users can search a netrom node
by alias. This idea was taken from a recent change in JNOS. Ex:

Which node are you looking for (no * please): NOS
Searching NetRom nodes for NOS …
NodeSearch v2.2 by N1URO for URONode.

For now it’s only on the ftp server of N1URO

Uronode update version 2.9

Brian N1URO has released uronode-2.9 on 2018-05-28

Download add

I have released URONode 2.9 on both my FTP server and on SourceForge
(both git and svn). The changelog for this release is as follows:

27/05/2018 v2.9
Changed the abort message from "Connection Aborted" to just "Aborted".
The madness in the logic is that FBB and other PBBS scripts may only
read "Connect" and send their next command in their sequence and thus
causing a bit of a loop.

Changed version number in node.h
Changed this file.

I noticed that an IPv6 connection did NOT offer EXit as a command.

I also noticed that for an IPv6 connection, when running an external
it did not inform the user that they were being returned to the node
may hint that the plug-in is not returning to the node properly, or is
exiting/forking prior to it's close. This is now fixed.

Mainly for sysop debugging purposes but also for end users, when
executing a
plugin such as NS or tracer, it'll still open with "Executing command"
but now
it will return back to the node prompt with "Command ended.". This lets
the sysop and end user know the command exited properly, like with a
"return 0"

I decided that just having IPv6 as a trailer for IPv6 connects at the
to be a bit vague in display so to keep it a bit more consistant with
it now will show ...:/uronode6 instead.

Fixed the "Sockets:" line in the Status command display. The word
was off by one space throwing all the following column headers off by 1


axMail admin util “spamblock”

There is a spamblock util for axMail. It’s handy to block spam.
Here can you get the program.

Read the INSTALL file carefully. If you do not have the line smtpd_client_restrictions in your you need to add it.

The complete rule is ….

smtpd_client_restrictions = check_client_access hash:/etc/postfix/access

Let test the program.

root@gw:/usr/local/src/spamblock# ./spamblock
What ip or block do you wish to deny?
[info] Adding to your postfix access file....
postfix/postfix-script: refreshing the Postfix mail system
[ ok ] Block for: is in place.

Now let test if you can send mail by postfix.

'pd2lt (@)' op 7-12-2017 7:37
            554 5.7.1 <[]>: 
                           Client host rejected: Access denied

Okay that just work quit well. Have a look in the file /etc/postfix/access     REJECT     REJECT     REJECT     REJECT

Delete the last line if you want to send e-mail. And “postfix reload”

For those running axMail-FAX, I have created an admin script I call
spamblock. This creates a filter list within postfix of who you wish to
connect to you and who NOT to connect to you. 

Especially this time of year spammers are at their worst trying to see
you their grandmother to make a small coin... most of which is simply
junk and abuse of bandwidth YOU pay for. Also, if  you run axMail in a
location who's rules are extremely strict about financial transactions
on ham radio this will also help protect your users as well as yourself
against unlawful communications.

Instructions are in the INSTALL file. I strongly urge  you to add blocks
through whois lookups rather than single IPs as spammers tend to open up
several servers within a data center so capturing their block protects
you that much more. I'm of the mindset that any data center or block
that has a spammer on it doesn't deserve the right to send me junk
mail... and MY expense of bandwidth.


Uronode update version 2.8.1

Brian n1uro just released a minor update. To correct some issues.


12/07/2017 v2.8.1
Spotted and fixed an issue in the D command within router.c that I somehow
introduced in regards to columns not equalling a full 4x4. Locally it
didn't show but remotely it did. When one ran a D command and there were less
than 4 columns a carriage return/new line was not sent making the user's
screen look "stuck" when in fact it was not. Fixed!.. before bugs were
reported :)

Bugs i love bugs.


Flexd and uronode

I had some problems getting the flexnet destinations in uronode. Xnet node is running with various flexnet links. Now I also want uronode to know these flexnet destinations. There appears to be a small secret in the “prompt” that flexd expects. I had a prompt “pi1lap ==>” That is not what flexd expected. Flexd expects a prompt “=>” So now I had to adjust the Xnet prompt to the expectations of flexd. (Tnx Brian n1uro for the hint)
Maybe the “pi1lap =>” prompt will work, I have to test that

There is also something with the buffer size of flexd. See the README.flexd in the source dir.

root@gw:/etc/ax25# cat /usr/local/src/uronode-2.8/README.flexd
If you find that your flexd isn't properly working, scroll down to line 120
where it says:
char  buffer[256], port[14], path[AX25_MAX_DIGIS*10]
and adjust the buffer per your neighbor's screens. The formula is:
2 data frames: 256
3 data frames: 512
4 data frames: 1024

Okay so how muts frames i have, let’s have a look

[3] fm PI1LAP-15 to PI1LAP ctl SABM+
[3] fm PI1LAP to PI1LAP-15 ctl UA-
[3] fm PI1LAP to PI1LAP-15 ctl I00^ pid F0 (211)
(X)net V1.39 Node PI1LAP

That are 2 frames. I had to set the buffer size to 256 and recompile flexd.c

int download_dest(char *gateway, char *fname)
  FILE *tmp;
  char buffer[256], port[14], path[AX25_MAX_DIGIS*10];

Also i have made a change to line 277. Also change to 256 buffer size

    if (FD_ISSET(s, &read_fd)) {
//      if ((n = read(s, buffer, 512)) == -1) break;
	if ((n = read(s, buffer, 256)) == -1) break;

Setup flexd.conf

# /etc/ax25/flexd.conf
# see man flexd.conf

# The callsign-ssid you wish to poll your flex neighbor with:

MyCall          pi1lap-15

# How often do we poll our flex neighbor (in seconds):

PollInterval    300

# The FlexNet node we're to poll:

FlexGate        pi1lap

The prompt for Xnet

root@gw:/etc/ax25# grep prompt /usr/local/xnet/AUTOEXEC.NET
my prompt =>

Let’s give it a try.

[3] fm PI1LAP-15 to PI1LAP ctl SABM+
[3] fm PI1LAP to PI1LAP-15 ctl UA-
[3] fm PI1LAP to PI1LAP-15 ctl I00^ pid F0 (211)
(X)net V1.39 Node PI1LAP

Lap = F6fbb bbs PI8LAP
Jnos = Jnos 2.0k.1 PD2LT
Dx = Cluster Dxspider PI1LAP-4
Uro = Uronode PI1LAP-15

[3] fm PI1LAP-15 to PI1LAP ctl I10^ pid F0 (2)
[3] fm PI1LAP to PI1LAP-15 ctl I11^ pid F0 (236)

BBS     0-0     33  CE8FGC  0-0     33  CX2SA   0-0     34  CX2SA   5-5      5
DB0ERF  0-12     4  DB0ERF 13-13     3  DB0ERF 14-14    30  DB0ERF 15-15    30
DB0RES  0-9      5  DB0RES 10-10     4  DB0ZWI  0-1      6  DB0ZWI  3-3
[3] fm PI1LAP to PI1LAP-15 ctl I12^ pid F0 (236)
DB0ZWI  4-15     4  DH4LAR  1-1      4  DL0HBS  7-7     30  F1ZYS   8-8     10
F3KT    0-10     4  F4DUR   7-7      5  F4DUR   8-8     39  F5ZFC   0-7    132
F8KHI   3-3     39  F8KHI   7-7     39  FGCBBS  0-0     33  HB9CSR  1-1
[3] fm PI1LAP to PI1LAP-15 ctl I13^ pid F0 (236)
HB9CSR  3-3      5  HB9CSR  8-8     40  HB9ON   1-1     39  HB9ON   8-8     34
HB9ON   9-9     34  HB9ON  10-10     4  HB9ON  14-14     5  HG0PLA  0-0      5
HG6PGA  0-0    109  HG8IT   0-0     35  HG8LXL  0-0     31  HG8PCS  0-0

Uronode d
FlexNet Destinations:
BBS     0-0     34  CE8FGC  0-0     34  CX2SA   0-0     35  CX2SA   5-5      5
DB0ERF  0-12     5  DB0ERF  13-13    4  DB0ERF  14-14   31  DB0ERF  15-15   31
DB0RES  0-9      6  DB0RES  10-10    5  DB0ZWI  0-1      7  DB0ZWI  3-3      6
DB0ZWI  4-15     5  DH4LAR  1-1      5  DL0HBS  7-7     31  F1ZYS   8-8      6
F3KT    0-10     4  F4DUR   7-7      5  F4DUR   8-8     39  F5ZFC   0-7    116
F8KHI   3-3     39  F8KHI   7-7     39  FGCBBS  0-0     34  HB9CSR  1-1     41

Yes, all looks okay.

The flexnet destinations are saved in “/usr/local/var/ax25/flex” on a debian wheezy system.

Bind bpq to ax25 interface

I’m using uronode as front end node, but i’m also like to connect to different packet software.
This time it’s linbpq. Lets go…..

First of all bpq32.cfg
Change the comport to COMPORT=/dev

 ID=Link Local


root@gw:/usr/local/linbpq# cat /etc/ax25/axports
ax1     PI1LAP-9        19200   256     2       Linbpq pi1lap-9

Now the linbpq start file


# Link local pi1lap-9
        echo "Starting ax1 "
        if grep ax1 /etc/ax25/axports ; then
        kissnetd -p 2 > "$tmpfile" &
        sleep 2
        attachthem () {
                read PTS1 PTS2
                kissattach -l $PTS1 ax1 || return=$rc_failed
                ifconfig ax1 netmask up
                sleep 1
                sed -i "s,COMPORT=/dev/.*$,COMPORT=$PTS2," /usr/local/linbpq/bpq32.cfg

        tail -n 1 $tmpfile | attachthem
        rm $tmpfile
        sleep 3
               echo  "Error ax1 not found in the file axports"
        echo "$1 $return"

cd /usr/local/linbpq
sudo ./linbpq  >/dev/tty4

Ok let’s look it ok now

ps ax | grep kissattach

root@gw:/usr/local/linbpq# ps ax | grep kissattach
 5910 ?        S      0:00 kissattach -l /dev/pts/16 ax1
 6504 pts/19   S+     0:00 grep kissattach

Now have a look in bpq32.cfg

root@gw:/usr/local/linbpq# grep COMPORT=/dev bpq32.cfg

Here you see there is a PTS couple /dev/pts/16 and /dev/pts/17

So we are good to go. r
Link Intface Callsign  Qual Nodes Lock  QSO
---- ------- --------- ---- ----- ----  ---
>    ax1     PI1LAP-9   203     2         0

The route to pi1lap-9 is there in uronode. Let’s try a connect. c pi1lap-9
Trying LAPBPQ:PI1LAP-9... <Enter> aborts.
Virtual circuit established to LAPBPQ:PI1LAP-9
Connected to PI1LAP-9.
Packet/Switch Node, Kortgene JO11VN

PI1LAP-5 PI1LAP-9 S=5 P=1 T=3 V=2


URONode ipv6 ready

URONode van Brian N1URO is ipv6 ready.
Dit wou ik natuurlijk even uitproberen. Nu was ik nog niet zo veel met ipv6 bezig geweest dus het was even uitzoeken hoe het moest. Het viel allemaal wel weer mee 🙂

Eerst moet de nieuwste versie van uronode geïnstalleerd worden (versie 2.7)
Verder moet er een regel aangepast worden in /etc/inetd.conf

Hier onder hebben we de (tcp6) toegevoegd. kill -HUP inetd

uronode  stream  tcp6,tcp     nowait  root    /usr/local/sbin/uronode  uronode

Maak je gebruikt van xinetd, dan ziet het er zo uit.

service uronode
        disable         = no
        socket_type     = stream
        protocol        = tcp
        flags           = IPv6
        user            = root
        server          = /usr/local/sbin/uronode
        wait            = no
        instances       = 20

Hier wordt de “flags = IPv6” toegevoegd.

Nu moest ik nog wat aanpassingen doen aan me router en firewall om het werkend te krijgen. Dit is natuurlijk voor een ieder verschillend.
Verder heb ik bij me hosting provider nog een AAAA record aan gemaakt in de DNS server zodat je dat langen ipv6 adres niet hoeft te onthouden.
Nu wordt het mooi omgezet naar een ipv6 adres  2a02:f6d:2d:0:212:3fff:fe2b:c66f

telnet -6 3694
Trying 2a02:f6d:2d:0:212:3fff:fe2b:c66f...
Connected to
Escape character is '^]'.
( login: pd2lt
*** Password required! If you don't have a password please email for a password you wish to use.
[URONode v2.7]
Welcome pd2lt to the packet shell.
       _ _ _
 _ __ (_) | | __ _ _ __
| '_ | | | |/ _` | '_ 
| |_) | | | | (_| | |_) |
| .__/|_|_|_|__,_| .__/
|_|               |_|

SystemD -

Werkt dus uit de kunst.