---
# System prepended metadata

title: 'LAN PROJECT Part 1: DNS, DHCP and FTP Servers on Ubuntu 22.04 LTS'

---

# LAN PROJECT Part 1: DNS, DHCP and FTP Servers on Ubuntu 22.04 LTS
[TOC]

## VM Structures
We're using VMware Workstation 16.2.x with the following machines:
![](https://hackmd.io/_uploads/ry2rwQXv3.png)

#### Running on Ubuntu 22.04 LTS server
Download:
https://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso

#### Netplan configuration for ns1 and ftp
```shell
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens32:    ~#Internal Network
      dhcp4: true
    ens34:     #WAN Network
      dhcp4: true
  version: 2
```
#### Netplan configuration for dhcp1
```shell
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens32:
      dhcp4: false
      addresses:
         - 192.168.174.10/24
      nameservers:
        addresses: [192.168.174.20]
        search: [ data.eibanez.cf ]
    ens34:
      dhcp4: true
  version: 2
```
#### Netplan configuration for hosts
```shell
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens32:    ~#Internal Network
      dhcp4: true
  version: 2
```

#### MAC Address
You can check your MAC Address from the machine's Network Adapter -> Advanced Configuration
![](https://hackmd.io/_uploads/rJyoamXPh.png)

Alternatively log in into your machine and run the following command
```shell
ip a
```
![](https://hackmd.io/_uploads/ByE0pXmD2.png)

#### Network planification
dhcp1  ens32: 192.168.174.10 - 00:0C:29:57:59:10
ns1    ens32: 192.168.174.20 - 00:50:56:3C:2F:B8
ftp1   ens32: 192.168.174.30 - 00:0c:29:fb:8e:67
host1  ens32: 192.168.174.10 - 00:50:56:39:A8:2D
host2  ens32: 192.168.174.10 - 00:50:56:3A:C0:CF

## DHCP Server
First let's change our hostname
```shell
sudo hostnamectl set-hostname dhcp1
```

Then we'll update our repositories
```shell
sudo apt update
```

We install the isc-dhcp-server
```shell
sudo apt install isc-dhcp-server
```

Now we can change the configuration file
```shell
sudo nano /etc/dhcp/dhcpd.conf
```

This is what our dhcpd.conf file would look like
```shell
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# Attention: If /etc/ltsp/dhcpd.conf exists, that will be used as
# configuration file instead of this file.
#

# option definitions common to all supported networks...
# option domain-name "eibanez.cf";
# option domain-name-servers ns1.data.eibanez.cf;

default-lease-time 600;
max-lease-time 7200;

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# A slightly different configuration for an internal subnet.

subnet 192.168.174.0 netmask 255.255.255.0 {
  range 192.168.174.100 192.168.174.199;
  option domain-name-servers ns1.data.eibanez.cf;
  option domain-name "data.eibanez.cf";
  option subnet-mask 255.255.255.0;
  option routers 192.168.174.2;
  option broadcast-address 192.168.174.255;
  default-lease-time 600;
  max-lease-time 7200;
}

# Reserving addresses through the MAC address for our machines
host ns1 {
  hardware ethernet 00:50:56:3C:2F:B8;
  fixed-address 192.168.174.20;
}

host dhcp1 {
  hardware ethernet 00:0C:29:57:59:10;
  fixed-address 192.168.174.10;
}

host ftp1 {
  hardware ethernet 00:0c:29:fb:8e:67;
  fixed-address 192.168.174.30;
}

host host1 {
  hardware ethernet 00:50:56:39:A8:2D;
  fixed-address 192.168.174.100;
}

host host2 {
  hardware ethernet 00:50:56:3A:C0:CF;
  fixed-address 192.168.174.101;
}
```

We can check our configuration file using this command
```shell
dhcpd -t -cf /etc/dhcp/dhcpd.conf
```
![](https://hackmd.io/_uploads/HJ3Zb4Xwn.png)

Now we can restart the service and check if it's working
```shell
sudo systemctl enable isc-dhcp-server
sudo systemctl restart isc-dhcp-server.service
sudo systemctl status isc-dhcp-server
```
![](https://hackmd.io/_uploads/Hy4cbEXv3.png)

We can also check our logs using journalctl
```shell
journalctl -u isc-dhcp-server
```

## DNS Server
### Setup of Bind9
First let's change our hostname
```shell
sudo hostnamectl set-hostname ns1
```

Then we'll update our repositories
```shell
sudo apt update
```

To begin the installation process, open the terminal and execute the following command:
```shell

sudo apt install bind9 bind9utils bind9-doc
```
### Configuration files
#### named.conf.options
Let's modify our options file
```shell
sudo nano /etc/bind/named.conf.options
```

We'll uncomment and add the following lines
```shell
options {
        directory "/var/cache/bind";
        recursion yes;                 # enables recursive queries
        allow-recursion { localnets; };# Allow recursion to local network
        listen-on { 192.168.174.20; }; # ns1 private IP address
        allow-transfer { none; };      # disable zone transfers by default
        forwarders {                   # Cloudflare forwarders
            1.1.1.1;
            1.0.0.1;
        };
        dnssec-validation auto;
        listen-on-v6 { any; };
};
```
![](https://hackmd.io/_uploads/S1F5o47w3.png)

#### named.conf.local
Let's modify our local file
```shell
sudo nano /etc/bind/named.conf.local
```

Let's add our primary and reverse zones
```shell
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
# Primary Zone
zone "data.eibanez.cf" {
    type primary;
    file "/etc/bind/zones/db.data.eibanez.cf";          # Zone file path
};

zone "174.168.192.in-addr.arpa" {
    type primary;
    file "/etc/bind/zones/db.174.168.192";              # Reverse zone 192.168.174.0/24 subnet
};
```
![](https://hackmd.io/_uploads/SJcto47D3.png)

### Zone Files
#### /etc/bind/zones Directory
Create the directory:
```shell
sudo mkdir /etc/bind/zones
```

Copy the local file to the zone directory:
```shell
sudo cp /etc/bind/db.local /etc/bind/zones/db.data.eibanez.cf
```

Edit the zone file:
```shell
sudo nano /etc/bind/zones/db.data.eibanez.cf
```

Define the Start of Authority (SOA) using the FQDN of your primary DNS server (ns1). Increment the serial value +1:
```shell
;
$TTL    604800
@       IN      SOA     ns1.data.eibanez.cf. root.data.eibanez.cf. (
                              3         ; Serial
```

We'll delete the last 3 entries as they're the localhost ones.
Specify the NS records that point to your DNS server:
```shell
; name servers - NS records
        IN      NS      ns1.data.eibanez.cf.
```

Add the A records for your DNS server and clients:
```shell
; name servers - A records
ns1.data.eibanez.cf.          IN      A       192.168.174.20

; 192.168.174.0/24 - A records
dhcp1.data.eibanez.cf.        IN      A      192.168.174.10
ftp1.data.eibanez.cf.         IN      A      192.168.174.30
host1.data.eibanez.cf.        IN      A      192.168.174.100
host2.data.eibanez.cf.        IN      A      192.168.174.101
```
![](https://hackmd.io/_uploads/r1WuiN7Dn.png)

#### Reverse Zone File
Copy the example file to create the reverse zone:

```shell
sudo cp /etc/bind/db.127 /etc/bind/zones/db.174.168.192
```

Edit the reverse zone file:
```shell
sudo nano /etc/bind/zones/db.174.168.192
```

Increment the serial value in the SOA record and add FQDN:
```shell
@       IN      SOA     ns1.data.eibanez.cf. root.data.eibanez.cf. (
                              2         ; Serial
```

Add the NS records for your DNS servers:
```shell
; name servers - NS records
        IN      NS      ns1.data.eibanez.cf.
```

Add the PTR records for the IP addresses in your zone (192.168.174.0/24):
```shell
; PTR Records
10      IN      PTR     dhcp1.data.eibanez.cf.          ; 192.168.174.10
20      IN      PTR     ns1.data.eibanez.cf.            ; 192.168.174.20
30      IN      PTR     ftp1.data.eibanez.cf.           ; 192.168.174.30
100     IN      PTR     host1.data.eibanez.cf.          ; 192.168.174.100
101     IN      PTR     host2.data.eibanez.cf.          ; 192.168.174.101
```
![](https://hackmd.io/_uploads/rywJpEmw2.png)

### Final Configuration
To ensure the configuration files are correct, run the following commands:

```shell
sudo named-checkconf
sudo named-checkzone data.eibanez.cf /etc/bind/zones/db.data.eibanez.cf
sudo named-checkzone 174.168.192.in-addr.arpa /etc/bind/zones/db.174.168.192
```
Restart the BIND service:

```shell
sudo systemctl restart bind9
```

Allow Bind9 through UFW Firewall:
```shell
sudo ufw allow Bind9
```
And you should be done!
```shell
sudo systemctl status bind9
```
![](https://hackmd.io/_uploads/Bkb4CE7P3.png)

We can always check our logs with Journalctl
```shell
journalctl -u named
```

## FTP Server
### Initial setup of PROFTPD
Setting our hostname
```shell
sudo hostnamectl set-hostname ftp1
```

Updating our repositories
```shell
sudo apt update
```

Now we can begin the installation
```shell
sudo apt -y install proftpd
```

If we want to implement tls/sftp we'll also install the crypto mod
```shell
sudo apt -y install proftpd-mod-crypto
```

Now we can check if the service is running through systemctl
```shell
sudo systemctl status proftpd
```
![](https://hackmd.io/_uploads/HJuZNumPn.png)

Logs with journalctl
```shell
journalctl -u proftpd
```

Correct configuration syntax with proftpd -t
```shell
proftpd -t
```

### User management
PROFTPD will use the regular UNIX users as the method of authentication.
We can create a new user with this command:
```shell
sudo adduser ftp1
```
![](https://hackmd.io/_uploads/B1jUQO7Dh.png)

We'll log with the user
```shell
su ftp1
```

Place a few things to play with in it's home directory
![](https://hackmd.io/_uploads/r15Em_Xvh.png)

You can quit this user's session with the command:
```shell
exit
```
![](https://hackmd.io/_uploads/Hyx0X_QP3.png)

We can also modify their home directory with this command where **/var/www/** is the path to the new home.
```shell
sudo usermod -m -d /var/www/ username
```

### Use of FTP
We can log from our network using the command:
```shell
ftp ftp1@192.168.174.30
```
You'll be prompted for the password
![](https://hackmd.io/_uploads/SktI4_Xw2.png)

Once inside you can type **help** to get the commands
![](https://hackmd.io/_uploads/Sy_0EuQPn.png)

**dir** or **ls** is used to see what's inside our directory
![](https://hackmd.io/_uploads/BJM3VFXv2.png)

**delete** erases a file
![](https://hackmd.io/_uploads/SyceSY7v2.png)

**cd** to change directories
![](https://hackmd.io/_uploads/r174HK7v2.png)

**put** uploads a file from the host directory
![](https://hackmd.io/_uploads/SJaFHY7w3.png)

**get** downloads a file
![](https://hackmd.io/_uploads/SyPhBK7D3.png)

**exit** to leave ftp

### Auto-signed certificates
To enable FTPS and SFTP we need encryption, we can get an auto-signed certificates through one of these commands:
1. Install SSL in case we don't have it
```shell
sudo apt-get install openssl -y
```
2. **Gencert**
```shell
sudo proftpd-gencert
```
![](https://hackmd.io/_uploads/rydYLK7Ph.png)

or

2. **OpenSSL**
```shell
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt
```

Change the permissions on these files
```shell
sudo chmod 0600 /etc/ssl/private/proftpd.key
sudo chmod 0600 /etc/ssl/certs/proftpd.crt
```

### Configuration files
#### proftpd.conf
This is the general configuration file, we'll modify it using the following command:
```shell
sudo nano /etc/proftpd/proftpd.conf
```

##### Enable TLS
Uncomment this line
```shell
Include /etc/proftpd/tls.conf
```
![](https://hackmd.io/_uploads/H1L0vFQv2.png)

##### Enable SFTP
Uncomment this to enable SFTP:
```shell
Include /etc/proftpd/sftp.conf
```
![](https://hackmd.io/_uploads/By-yuFXD3.png)

##### Anonymous users
We could activate anonymous users uncommenting the following lines:
```shell
 <Anonymous ~ftp>
   User ftp
   Group nogroup
   # We want clients to be able to login with "anonymous" as well as "ftp"
   UserAlias anonymous ftp
   # Cosmetic changes, all files belongs to ftp user
   DirFakeUser on ftp
   DirFakeGroup on ftp

   RequireValidShell off

   # Limit the maximum number of anonymous logins
   MaxClients 10

   # We want 'welcome.msg' displayed at login, and '.message' displayed
   # in each newly chdired directory.
#   DisplayLogin welcome.msg
#   DisplayChdir .message
#
#   # Limit WRITE everywhere in the anonymous chroot
#   <Directory *>
#     <Limit WRITE>
#       DenyAll
#     </Limit>
#   </Directory>
#
#   # Uncomment this if you're brave.
#   # <Directory incoming>
#   #   # Umask 022 is a good standard umask to prevent new files and dirs
#   #   # (second parm) from being group and world writable.
#   #   Umask022  022
#   #   <Limit READ WRITE>
#   #     DenyAll
#   #     </Limit>
#   #       <Limit STOR>
#   #         AllowAll
#   #     </Limit>
#   # </Directory>
#
 </Anonymous>
```
#### sftp.conf
Modify the file
```shell
sudo nano /etc/proftpd/sftp.conf
```

Uncomment these lines
```shell
<IfModule mod_sftp.c>
SFTPEngine     on
Port           2222
SFTPLog        /var/log/proftpd/sftp.log
SFTPHostKey /etc/ssh/ssh_host_rsa_key
</IfModule>
```
#### tls.conf
Modify the file
```shell
sudo nano /etc/proftpd/sftp.conf
```

To get TLS working we have to uncomment these lines
```shell
<IfModule mod_tls.c>
TLSEngine                               on
TLSLog                                  /var/log/proftpd/tls.log
TLSProtocol                             SSLv23
TLSRSACertificateFile                   /etc/ssl/certs/proftpd.crt
TLSRSACertificateKeyFile                /etc/ssl/private/proftpd.key
TLSOptions                              AllowClientRenegotiations
TLSRequired                             on
</IfModule>
```
#### modules.conf
##### TLS Activation
Uncomment these lines
```shell
# Install proftpd-mod-crypto to use this module for TLS/SSL support.
LoadModule mod_tls.c
# Even these modules depend on the previous one
LoadModule mod_tls_fscache.c
LoadModule mod_tls_shmcache.c
```
![](https://hackmd.io/_uploads/B14dcKmPh.png)
##### SFTP Activation
Uncomment these lines
```shell
# Install proftpd-mod-crypto to use this module for SFTP support.
LoadModule mod_sftp.c
LoadModule mod_sftp_pam.c
```

### TLS testing
Once the required configuration files of proftpd.conf, tls.conf and modules.conf have been modified we can restart and check our service
```shell
sudo systemctl restart proftpd.service
sudo systemctl status proftpd.service
```
![](https://hackmd.io/_uploads/rJym3YQP2.png)

Now since we enabled TLSRequired On we won't be able to connect through normal ftp
![](https://hackmd.io/_uploads/BkFeatXw2.png)

We can install ftp-ssl to connect securely 
```shell
sudo apt install ftp-ssl
```

Now we can connect using the command ftp-ssl **server name**
```shell
ftp-ssl ftp1
```

We'll be prompted by the user name and password
![](https://hackmd.io/_uploads/BJrH15Qvh.png)

### SFTP Testing
We'll test our connection with the sftp command:
```shell
sftp ftp1@192.168.174.30
```

We'll accept the key by typing **yes** and enter the password
![](https://hackmd.io/_uploads/rkrPOqXDh.png)

## Hosts
Since we're in a private network we only have to enable dhcp4 in our netplan
```shell
sudo nano /etc/netplan/00-installer-config.yaml
```

And we set dhcp to **true**
```shell
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens32:    ~#Internal Network
      dhcp4: true
  version: 2
```

Now we can check our connection through this command
```shell
ip a
```
![](https://hackmd.io/_uploads/SkCJqqmw2.png)

We can confirm that our DNS is working properly through the following commands
```shell
resolvectl status
```
![](https://hackmd.io/_uploads/BJZLq9Qv3.png)

```shell
nslookup ftp1
```
![](https://hackmd.io/_uploads/B1O4qcQv3.png)

```shell
dig dhc1.data.eibanez.cf
```
![](https://hackmd.io/_uploads/Bk1oq97v2.png)

```shell
host 192.168.174.30
```
![](https://hackmd.io/_uploads/r11Cq9Xwn.png)
