---
date: 2013-03-25
title: Writeable TFTP Server On CentOS
category: linux
---

Well this caught me out for an embarassingly long time. There are
[loads](https://blog.penumbra.be/tag/tftp/)
[of](https://www.question-defense.com/2008/11/13/linux-setup-tftp-server-on-centos)
[examples](https://wiki.centos.org/EdHeron/PXESetup) of setting up a
TFTP server on the web. The vast majority of them assume that you are
using them read-only for PXE booting.

I needed to make it writeable so that it could be used for storing
switch/router backups. It is trivially simple once you have read the man
page (pro tip: RTFM).

I am doing this on RHEL6, it should be fine on Centos, Scientific Linux
or Fedora as is. Any other distro it will require some modification.
First install it (install the client as well to test at the end:

    yum install tftp tftp-server xinetd
    chkconfig xinetd on

Now edit the file \`/etc/xinetd.d/tftp to read:

    service tftp
    {
        socket_type = dgram
        protocol    = udp
        wait        = yes
        user        = root
        server      = /usr/sbin/in.tftpd
        server_args = -c -s /var/lib/tftpboot
        disable     = no
        per_source  = 11
        cps         = 100 2
        flags       = IPv4
    }

There are 2 changes to this file from the defaults. The `disable` line
enables the service. Normally that is where you leave it. However, you
cannot upload to the server in this case without pre-creating the files.

The second change adds a `-c` flag to the `server_args` line. This tells
the service to create the files as necessary.

It still will not work though. You need to tweak the filesystem
permissions and SELinux:

    chmod 777 /var/lib/tftpboot
    setsebool -P tftp_anon_write 1

Of course you'll also need to open up the firewall. So add the
following line to `/etc/sysconfig/iptables`:

    -A INPUT -m state --state NEW -m udp -p udp -m udp --dport 69 -j ACCEPT

If your IPtables set up is what comes out of the box, there will be a
similar line to allow SSH access (tcp:22), I would add this line just
after that one. If you have something more complicated, then you will
probably know how to add this one as well anyway.

You should now be able to upload something to the server

    echo "stuff" > test
    tftp localhost -c put test

Your test file should now be in `var/lib/tftpboot`.

One final note with regards to VMware. This does not work if you are
using the VMXNET3 adapter, so make sure you are using the E1000. GETs
will work and the file will be created, but no data will be put on the
server. To annoy you even more, the test PUTting to localhost will work,
but PUTs from a remote host will not.

It has been noted in the VMware forums
[here](https://communities.vmware.com/thread/215456)
