Networking

SSH

Installation

The client is already installed. To install the server:

wajig install openssh-server

Configuration

Check out ~/.ssh/config. Do it! It’s worth it.

The command ssh -p 2345 -i /var/some_key some_user@some_weird_host_name becomes ssh foo with the following entry:

Host foo
  Hostname some_weird_host_name
  User some_user
  IdentityFile /var/some_key
  Port 2345

Usage

Connect to host notebook:

ssh notebook

File Transfer

In Krusader (File Manager)‘s/Dolphin’s/<your-graphical-filemanager-name-here> address bar, type:

sftp://notebook

To merely copy a file:

scp notebook:myfile .  # copies /home/me/myfile on notebook to current working directory
scp notebook:/etc/passwd .  # copies /etc/passwd on notebook to current working directory

Authentication

Either with username/password or through public key encryption. The latter is very easy to setup and even lets you skip the password prompt (if you choose an empty password).

Assumption: working on desktop, connecting to notebook:

ssh-keygen  # only if you haven't done it already
            # leave default
ssh-copy-id notebook
ssh notebook

If you chose an empty password and desktop gets compromised, then notebook will be too.

Mounting SSH

Prerequisites:

sshfs

Mounting:

sshfs remotehost: /local/dir/

Unmounting:

fusermount -u /local/dir/

See this Ubuntu wiki page for more details.

List Open Ports

... excluding sockets:

netstat --numeric-hosts --protocol=inet

We use --numeric-hosts because dns lookups can be quite slow.

Netstat Lines Explained

I’m usually interested in all (-a) numeric (-n) TCP (-t) connections and the corresponding processes (-p). ‘tanp’ sounds nicer than ‘atnp’.

netstat -tanp

Just nginx listening on all addresses (0.0.0.0) on port 80:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      9111/nginx -g daemo     nginx.

What’s rpcbind? Basically a multiplexer for kernel-based services like NFS:

tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      31994/rpcbind           needed for nfs

No pid? Dafuq? rpcinfo -p tells us more:

tcp        0      0 0.0.0.0:48660           0.0.0.0:*               LISTEN      -

rpcinfo -p:

program vers proto   port  service

100021    3   tcp  48660  nlockmgr
100021    4   tcp  48660  nlockmgr
100021    1   tcp  48660  nlockmgr
[...]

Lab Setup with NAT, DHCP, DNS

Using Virtualbox to set up multiple boxes in a LAN.

When adding a new box to the network and setting hostname newbee, then newbee should be reachable by hostname and fqdn, e.g.:

ping newbee
ping newbee.athome

Domain name is “athome”.

NAT, DHCP and DNS

Both on the same box via dnsmasq.

NAT:

iptables -t nat -I POSTROUTING -j MASQUERADE
iptables-save > /etc/iptables.rules

cat <<EOF > /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

iface rename3 inet static
address 10.2.2.254
netmask 255.255.255.0
pre-up iptables-restore < /etc/iptables.rules
EOF

echo 1 > /proc/sys/net/ipv4/ip_forward

DHCP, DNS:

apt-get install dnsmasq

cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

cat <<EOF > /etc/dnsmasq.conf
interface=rename3
dhcp-authoritative
dhcp-range=10.2.2.1,10.2.2.240,255.255.255.0,10m
local=/athome/
domain=athome
address=/nat.athome/10.2.2.254
expand-hosts
EOF

service dnsmasq restart

Forward connections to port 80 on NAT to port 80 on 10.2.2.223:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.2.2.223:80

Rsyslog

On logging.athome:

mkdir /var/log/hosts
chown syslog\: /var/log/hosts

cat <<'EOF' > /etc/rsyslog.d/60-per-host.conf
$template DynFile,"/var/log/hosts/%HOSTNAME%.log"

# question mark: use file template
# minus: don't sync after every write (faster at expense of data integrity)
#*.* -?DynFile
*.* ?DynFile
EOF

service rsyslog restart

tail -F /var/log/hosts/nat.log

On nat.athome:

cat <<'EOF' > /etc/rsyslog.d/70-centralized.conf
*.* @logging.athome
EOF

service rsyslog restart

logger 'Hello world from nat!'

From my OpenWRT Config

root@wrt:~# cat /etc/config/dhcp

config 'dnsmasq'
        option 'domainneeded' '1'
        option 'boguspriv' '1'
        option 'localise_queries' '1'
        option 'local' '/lan/'
        option 'domain' 'lan'
        option 'expandhosts' '1'
        option 'authoritative' '1'
        option 'readethers' '1'
        option 'leasefile' '/tmp/dhcp.leases'
        option 'resolvfile' '/tmp/resolv.conf.auto'
        option 'rebind_protection' '0'
        list 'server' '10.1.1.1'

config 'dhcp' 'lan'
        option 'interface' 'lan'
        option 'netmask' '255.255.255.0'
        option 'start' '10'
        option 'limit' '90'
        option 'leasetime' '168h'
        list 'dhcp_option' '3,10.1.1.1'

config 'dhcp' 'wan'
        option 'interface' 'wan'
        option 'ignore' '1'

config 'host'
        option 'name' 'enterprise'
        option 'mac' 'XX:XX:XX:XX:XX:XX'
        option 'ip' '10.1.1.3'

config 'host'
        option 'name' 'nas'
        option 'mac' 'XX:XX:XX:XX:XX:XX'
        option 'ip' '10.1.1.4'

config 'host'
        option 'name' 'fiddlers'
        option 'mac' 'XX:XX:XX:XX:XX:XX'
        option 'ip' '10.1.1.6'

config 'host'
        option 'name' 'locutus'
        option 'mac' 'XX:XX:XX:XX:XX:XX'
        option 'ip' '10.1.1.5'

list 'dhcp_option' '3,10.1.1.1' means use router 10.1.1.1 http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_options. Could have used option name here instead...

Sources

http://askubuntu.com/questions/224982/isc-dhcp-battling-to-get-the-host-name-from-the-dhcp-script Sure, if you want to make something simple with the right tool complex with a tool that’s made to do something slightly different.

http://superuser.com/questions/410053/how-can-i-set-up-a-local-domain-so-that-everyone-on-my-local-network-can-view Not needed. See comment about IGNORE_RESOLVCONF in /etc/default/dnsmasq

http://askubuntu.com/questions/140126/how-do-i-configure-a-dhcp-server Dnsmasq fulfills all my DHCP needs, i.e. a subnet on a specific interface. It even can do PXE and other funny stuff. :>

iptables

Enable port forwarding:

sudo vim /etc/sysctl.conf  # set net.ipv4.ip_forward = 1
sudo sysctl -p /etc/sysctl.conf

Local port redirect (listen on privileged port 80 and redirect to unprevileged port 9080):

from_port=80
to_port=9080
sudo iptables -t nat -A PREROUTING -p tcp --dport $from_port -j REDIRECT --to-ports $to_port
# so we can connect from localhost in the same way
sudo iptables -t nat -A OUTPUT -p tcp -d 127.0.0.0/8 --dport $from_port -j REDIRECT --to-port $to_port

Remember to save those:

sudo iptables-save > /etc/iptables.rules

Add them to your interface in /etc/network/interfaces, e.g.:

auto eth0
iface eth0 inet static
address ...
netmask ...
gateway ...
dns-nameservers ...
pre-up iptables-restore < /etc/iptables.rules

Sources:

Remote Port-Forwarding

internet --eth0--> [4444]me --eth1--> [80]target
::

my_port=4444 target_ip=192.168.56.2 target_port=80

# accept forwarding for $target_ip in both directions iptables -I FORWARD -s $target_ip -m tcp -p tcp –sport $target_port -j ACCEPT iptables -I FORWARD -d $target_ip -m tcp -p tcp –dport $target_port -j ACCEPT iptables -L FORWARD –line-numbers

iptables -t nat -I PREROUTING -m tcp -p tcp –dport $my_port -j DNAT –to-destination $target_ip:$target_port iptables -t nat -I PREROUTING -L iptables -t nat -I POSTROUTING -d $target_ip -o eth1 -j MASQUERADE iptables -t nat -I POSTROUTING -L

Burn all Bridges

After playing with virt-manager I had many bridge devices. Get rid of them:

for b in $(ls /sys/devices/virtual/net/ | grep ^br); do
    sudo ip link delete $b;
done