Shorewall is a gateway/firewall configuration tool. "You describe your firewall/gateway requirements using entries in a set of configuration files. Shorewall reads those configuration files and with the help of the iptables, iptables-restore, ip and tc utilities, Shorewall configures Netfilter and the Linux networking subsystem to match your requirements.".
This is a resume from Basic Two-Interface Firewall.
Shorewall port is part of Kris Collection and sysdoc collection.
$ prt-get depinst shorewall
Get the samples from distribution file;
$ mkdir sample && cd sample $ tar xf ../shorewall-5.0.8.2.tar.bz2 $ cd /srv/ports/work/shorewall-5.0.8.2 $ ls README.txt policy shorewall.conf.annotated interfaces policy.annotated stoppedrules interfaces.annotated rules stoppedrules.annotated masq rules.annotated zones masq.annotated shorewall.conf zones.annotated
Copy files to /etc/shorewall
$ sudo cp Samples/two-interfaces/* /etc/shorewall/
Distribution extracted files are not needed anymore;
$ cd ../../ && rm -fR sample
Tip how to get help about files in /etc/shorewall, for example to get help about file zones call man shorewall-zones. There are Some files have names ending in '.annotated'. You might choose to look at those files instead.
Rules about traffic to allow and what traffic to deny are expressed in terms of zones;
Edit /etc/shorewall/shorewall.conf
############################################################################### # S T A R T U P E N A B L E D ############################################################################### STARTUP_ENABLED=Yes
Show defoult route, last should be your external interface;
# ip route ls
This example assumes enp8s0 is connected to router and wlp7s0 is wireless access point.
Edit /etc/shorewall/interfaces
############################################################################### #ZONE INTERFACE OPTIONS net enp8s0 dhcp,tcpflags,nosmurfs,routefilter,logmartians,sourceroute=0 loc wlp7s0 tcpflags,nosmurfs,routefilter,logmartians
Edit /etc/shorewall/stoppedrules
############################################################################### #ACTION SOURCE DEST PROTO DEST SOURCE # PORT(S) PORT(S) ACCEPT enp3s0 - ACCEPT - enp3s0
Shorewall recognizes the firewall system as its own zone, as can be seen on zones defined by two-interfaces example;
Edit /etc/shorewall/zones
############################################################################### #ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall net ipv4 loc ipv4
Change default /etc/shorewall/policy this example will limit witch connections are allow to and from firewall, default policy will be drop;
############################################################################## #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST loc net ACCEPT info net all DROP warning $FW net DROP warning loc $FW DROP warning $FW loc DROP warning # THE FOLLOWING POLICY MUST BE LAST all all REJECT warning
In Shorewall, both Masquerading and SNAT are configured with entries in the /etc/shorewall/masq file. You will normally use Masquerading if your external IP is dynamic and SNAT if the IP is static.
Since /etc/rc.d/net configured enp8s0 static, change /etc/shorewall/masq so that uses SNAT;
Edit /etc/shorewall/masq
####################################################################################### #INTERFACE:DEST SOURCE ADDRESS PROTO PORT(S) IPSEC MARK # wlp7s0 10.0.0.0/24 192.168.1.254
Destination Network Address Translation are defined in /etc/shorewall/rules;
Example /etc/shorewall/rules file.
$ sudo mkdir /var/log/shorewall
Example of syslog-ng configuration for shorewall;
destination d_shorewall_warn { file ("/var/log/shorewall/warn.log"); }; destination d_shorewall_info { file ("/var/log/shorewall/info.log"); }; filter f_shorewall_warn { level (warn) and match ("Shorewall" value("MESSAGE")); }; filter f_shorewall_info { level (info) and match ("Shorewall" value("MESSAGE")); }; log { source (s_kernel); filter (f_shorewall_warn); destination (d_shorewall_warn); flags(final);}; log { source (s_kernel); filter (f_shorewall_info); destination (d_shorewall_info); flags(final);};