iptables input chain
We willen nu onze firewall afsluiten voor verkeer van zowel binnen als buiten, behalve voor ssh-toegang.
Bovendien will we poort 22 vervangen door poort 10022.
- ssh poort naar 10022
Dit laatste doen we in de config-file vansshd
,/etc/ssh/sshd_config
user@ub164-FW254:/etc/iptables$
head /etc/ssh/sshd_config
# Package generated configuration file # See the sshd_config(5) manpage for details # What ports, IPs and protocols we listen for Port 10022 # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: #ListenAddress 0.0.0.0 Protocol 2 # HostKeys for protocol version 2
Kijk maar even naar de 5de regel (
Port 10022
)
Vervolgens moeten we sshd herstarten en testen:
$ sudo systemctl restart sshd.service
[sudo] password for user: * * * * * * * *
$ sudo systemctl status sshd.service
* ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since ma 2017-11-27 17:00:14 CET; 21s ago Main PID: 3872 (sshd) Tasks: 1 Memory: 732.0K CPU: 11ms CGroup: /system.slice/ssh.service └─3872 /usr/sbin/sshd -D nov 27 17:00:14 ub164-FW254 systemd[1]: Starting OpenBSD Secure Shell server... nov 27 17:00:14 ub164-FW254 sshd[3872]: Server listening on 0.0.0.0 port 10022. nov 27 17:00:14 ub164-FW254 sshd[3872]: Server listening on :: port 10022. nov 27 17:00:14 ub164-FW254 systemd[1]: Started OpenBSD Secure Shell server.
iptables
sluiten voor alles behalve poort 10022
We houden de NAT router open voor NAT-verkeer.
We kunnen dus beginnen met een kopie van ons reeds bestaande NAT-router script.
Het commando
# iptables -vP INPUT DROP
zorgt ervoor dat geen enkel pakket bestemd voor de firewall/router zelf doorkomt. De optie-P
staat voor policy.INPUT
is alles wat toekomt met eindbestemming de machine waarop iptables draait, enDROP
betekent letterlijk laten vallen.
Dit is echter nogal drastisch. Want, ooklocalhost
, op netwerkkaartlo
, kan nu niet meer naar binnen (bij zichtzelf). We lossen dit op met:
# iptables -vA INPUT -i lo -j ACCEPT
We voegen toe (-A) aan deINPUT
regels, dat op de input netwerkkaart lo (-i lo
) alles wordt geaccepteerd (-j ACCEPT
).
Dit commando wordt logisch uitgevoerd na het vorige (DROP
),
en de volgorde is belangrijk: eerst alles dicht doen, en dan enkele uitzonderingen toelaten.
Nu moeten we nog de servicessh
op poort10022
toelaten. Dat doen we als volgt:
# iptables -vA INPUT -p TCP --dport 10022 -j ACCEPT
Aan de INPUT voegen we toe dat het protocol TCP op poort 10022 (-p TCP --dport 10022
)
wordt geaccepteerd (-j ACCEPT
).
Tot slot voeren we nog het volgende uit om sessies door de firewall geinitieerd naar buiten toe terug binnen te laten en om andere draaiende sessies open te laten:
# iptables -vA INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- kort:
iptables -vP INPUT DROP iptables -vA INPUT -i lo -j ACCEPT iptables -vA INPUT -p TCP --dport 10022 -j ACCEPT iptables -vA INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -i interface -p protocol -4 ipv4 -6 ipv6 -s source -d destination -m match // Specifies a match to use, that is, an extension module that tests for a specific property -j the target of the rule; i.e., what to do if the packet matches the target of the rule; i.e., what to do if the packet matches it
- volledige script:
#! /bin/bash # # iptables-script # bvdb ( 02/11/2017 ) ###################################################### # # v = verbose, X = flush tables, F = delete non standard chains # general iptables -vX iptables -vF # nat and masquerading -t refers to table iptables -vt nat -F iptables -vt nat -X # mangling TCP header iptables -vt mangle -F iptables -vt mangle -X # reset policies -P refers to policies iptables -vP OUTPUT ACCEPT iptables -vP FORWARD ACCEPT # turn off routing # echo 0 > /proc/sys/net/ipv4/ip_forward # turn on routing echo 1 > /proc/sys/net/ipv4/ip_forward ###### Dit is heel belangrijk in je script -- ###### dan zie je wat je aan het doen bent: # ##>> my network interfaces: enp0s3 = 10.104.200.254/16 >> buiten ##>> my network interfaces: enp0s8 = 192.168.200.254/24 >> binnen ### implement NAT routing # ## NAT routing - enp0s3 is buiten en een unprotected network # het ip address aan de buitenkant van onze firewall is 10.104.200.254 (outside address) # iptables -vt nat -A POSTROUTING -o enp0s3 -j SNAT --to 10.104.200.254 ## INPUT chain lo + ports 10022 iptables -vP INPUT DROP iptables -vA INPUT -i lo -j ACCEPT iptables -vA INPUT -p TCP --dport 10022 -j ACCEPT iptables -vA INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ### PRINT iptables configuration ### # echo ">>>>> iptables -n -L" iptables -n -L echo "--------------" #echo ">>>>> iptables -S" #iptables -S #echo "--------------" echo ">>>>> iptables -t nat -L" iptables -t nat -L echo "--------------" #echo ">>>>> iptables -t mangle -L" #iptables -t mangle -L #echo "--------------" echo "routing set: " `cat /proc/sys/net/ipv4/ip_forward` echo "=============="
- volledige output
user@ub164-FW254:/etc/iptables$
sudo ./iptables.v-003.nat-in.sh
Flushing chain `INPUT' Flushing chain `FORWARD' Flushing chain `OUTPUT' Flushing chain `PREROUTING' Flushing chain `INPUT' Flushing chain `OUTPUT' Flushing chain `POSTROUTING' Flushing chain `PREROUTING' Flushing chain `INPUT' Flushing chain `FORWARD' Flushing chain `OUTPUT' Flushing chain `POSTROUTING' SNAT all opt -- in * out enp0s3 0.0.0.0/0 -> 0.0.0.0/0 to:10.104.200.254 ACCEPT all opt -- in lo out * 0.0.0.0/0 -> 0.0.0.0/0 ACCEPT tcp opt -- in * out * 0.0.0.0/0 -> 0.0.0.0/0 tcp dpt:10022 >>>>> iptables -n -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination -------------- >>>>> iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- anywhere anywhere to:10.104.200.254 -------------- routing set: 1
... en we testen ...
Ik kan niet meer op de ssh van de binnenste LAN. (ik was de RELATED,ESTABLISHED regel vergeten -- door deze toe te voegen kan de firewall zelf weer SSH gebruiken naar 192.168.200/24) Bijgevolg test ik vanaf het buitennetwerk met een client in 10.104:
user@clt-ub16-nat10-104:~$
ssh -p 10022 10.104.200.254
The authenticity of host '[10.104.200.254]:10022 ([10.104.200.254]:10022)' can't be established. ECDSA key fingerprint is SHA256:ZQq+qHQJMwHScqSRQoXMOHJ9jlDc7+5HX+r8sxTXDVc. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[10.104.200.254]:10022' (ECDSA) to the list of known hosts. user@10.104.200.254's password: Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-101-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage 92 packages can be updated. 0 updates are security updates. Last login: Mon Nov 27 11:08:15 2017 from 10.104.255.254 $
Dit lukte ...
Ik installeer vervolgens eenapache2-server
op de FW (die heb ik straks nodig metsquid
) en test nu met telnet op poort 80 ... maar dit geeft een time out:$ telnet 10.104.200.254 80 Trying 10.104.200.254... telnet: Unable to connect to remote host: Connection timed out
Poort 80 is dus dicht naar de firewall toe ...
Kun je poort 80 openzetten?
## apache2 -- port 80
iptables -vA INPUT -p TCP --dport 80 -j ACCEPT
^^^^ selecteer de onzichtbare tekst hierboven voor een oplossing ^^^^
meer weten: https://www.geeksforgeeks.org/iptables-command-in-linux-with-examples/