initial commit
This commit is contained in:
commit
bf583b98d0
12
LICENSE
Normal file
12
LICENSE
Normal file
@ -0,0 +1,12 @@
|
||||
Copyright (C) 2006 by Rob Landley <rob@landley.net>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose
|
||||
with or without fee is hereby granted.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
221
README.md
Normal file
221
README.md
Normal file
@ -0,0 +1,221 @@
|
||||
# Port Forward Opener on OpenBSD
|
||||
|
||||

|
||||
|
||||
This setup allow external users to connect to internal servers through port forwarding.
|
||||
|
||||
Usefull for small offices when:
|
||||
|
||||
- You cannot use vpn
|
||||
- You don't like port knocking
|
||||
|
||||
Let's say a user wants to connect to the server with RDP
|
||||
|
||||
1. The **User** makes a SSH connection to firewall.
|
||||
2. The Firewall allows for a few seconds the IP of the user to connect to the internal server.
|
||||
3. The **User** makes a RDP connection to the internal server
|
||||
3. The Firewall closes SSH connection automatically.
|
||||
|
||||
**It's not ready for production, don't use it if you don't know exactly what you are doing**
|
||||
|
||||
## Addressing Scheme Example
|
||||
|
||||
```
|
||||
|
||||
[Desktop A] [Desktop B] [Desktop C]
|
||||
| | |
|
||||
[DSL]---[Firewall]---[Switch]---+-----+-----+-----+----+
|
||||
| |
|
||||
[Server] [Printer]
|
||||
|
||||
|
||||
|
||||
Address Node Port Forward
|
||||
------------- ------------ ------------------------
|
||||
192.168.1.1 DSL Router
|
||||
192.168.1.2 Firewall WAN 22 < 60022
|
||||
192.168.2.1 Firewall LAN
|
||||
|
||||
192.168.2.11 Desktop A 22 < 60122, 3389 < 63381
|
||||
192.168.2.12 Desktop B 22 < 60222, 3389 < 63382
|
||||
192.168.2.13 Desktop C 22 < 60322, 3389 < 63383
|
||||
|
||||
192.168.2.200 Server 3389 < 63389
|
||||
192.168.2.201 Printer
|
||||
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
```bash
|
||||
pkg_add vim dialog # nothing works properly without vim
|
||||
```
|
||||
|
||||
## Network Settings
|
||||
|
||||
|
||||
:floppy_disk: `vi /etc/hostname.em0`
|
||||
|
||||
```bash
|
||||
dhcp
|
||||
```
|
||||
|
||||
:floppy_disk: `vi /etc/hostname.stge0`
|
||||
|
||||
```bash
|
||||
media 100baseTX
|
||||
mediaopt full-duplex
|
||||
inet 192.168.2.1 0xffffff00
|
||||
```
|
||||
|
||||
:floppy_disk: `vi /etc/mygate`
|
||||
|
||||
```bash
|
||||
192.168.1.1
|
||||
```
|
||||
|
||||
:floppy_disk: `vi /etc/resolv.conf`
|
||||
|
||||
```bash
|
||||
nameserver 9.9.9.9
|
||||
nameserver 1.1.1.1
|
||||
```
|
||||
|
||||
## DHCP Server
|
||||
|
||||
:floppy_disk: `vi /etc/dhcpd.conf`
|
||||
|
||||
```bash
|
||||
option domain-name "taxstudio";
|
||||
option domain-name-servers 9.9.9.9;
|
||||
|
||||
subnet 192.168.2.0 netmask 255.255.255.0 {
|
||||
option routers 192.168.2.1;
|
||||
range 192.168.2.11 192.168.2.19;
|
||||
}
|
||||
```
|
||||
|
||||
:floppy_disk: `vi /etc/dhcpd.interfaces`
|
||||
|
||||
```bash
|
||||
stge0
|
||||
```
|
||||
|
||||
Test server `dhcpd -d -c /etc/dhcpd.conf`
|
||||
|
||||
Start DHCP server at boot
|
||||
|
||||
```bash
|
||||
rcctl set dhcpd flags stge0
|
||||
rcctl enable dhcpd
|
||||
rcctl start dhcpd
|
||||
```
|
||||
|
||||
Show leases
|
||||
|
||||
```bash
|
||||
cat /var/db/dhcpd.lease
|
||||
```
|
||||
|
||||
|
||||
## Firewall
|
||||
|
||||
Port forwarding
|
||||
|
||||
```bash
|
||||
sysctl net.inet.ip.forwarding=1
|
||||
echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf
|
||||
sysctl | grep ip.forwarding
|
||||
```
|
||||
|
||||
Rules
|
||||
|
||||
:floppy_disk: `vi /etc/pf.conf`
|
||||
|
||||
```bash
|
||||
wan = em0
|
||||
lan = stge0
|
||||
|
||||
#----------------------------------
|
||||
# Defaults
|
||||
#----------------------------------
|
||||
pass out keep state
|
||||
|
||||
set skip on lo
|
||||
set block-policy return
|
||||
set reassemble yes
|
||||
|
||||
block in all
|
||||
block return
|
||||
|
||||
match in on $wan scrub (no-df max-mss 1440)
|
||||
match out on $wan scrub (random-id)
|
||||
|
||||
antispoof quick for { $wan lo0 }
|
||||
|
||||
#----------------------------------
|
||||
# Input
|
||||
#----------------------------------
|
||||
pass quick on $lan
|
||||
pass in quick proto tcp to $wan port 22 keep state
|
||||
pass in quick on $lan
|
||||
|
||||
#----------------------------------
|
||||
# Output
|
||||
#----------------------------------
|
||||
pass out on $lan inet keep state
|
||||
|
||||
#----------------------------------
|
||||
# NAT
|
||||
#----------------------------------
|
||||
match out on $wan from !($wan) nat-to ($wan)
|
||||
|
||||
# Allow outgoing traffic for LAN and the gateway
|
||||
pass out quick keep state
|
||||
pass in on { $lan } inet
|
||||
```
|
||||
|
||||
Enable
|
||||
|
||||
```bash
|
||||
pfctl -d
|
||||
pfctl -f /etc/pf.conf
|
||||
pfctl -e
|
||||
```
|
||||
|
||||
|
||||
## Setup Opener
|
||||
|
||||
Start at boot and listens the port 3000
|
||||
|
||||
```bash
|
||||
echo "/firewall/fw-server.sh" >> /etc/rc.local
|
||||
```
|
||||
|
||||
Add Users
|
||||
|
||||
1. Add user to system
|
||||
|
||||
```bash
|
||||
# fw.sh will executed on user login
|
||||
useradd -d /dev/null -s /firewall/fw.sh jack
|
||||
passwd jack
|
||||
```
|
||||
|
||||
2. Add user to opener
|
||||
|
||||
Add one or more pf rules to user file.
|
||||
|
||||
```bash
|
||||
vi firewall/user/jack
|
||||
```
|
||||
An example to allow user jack to make RDP connections to host 192.168.2.12:
|
||||
|
||||
`pass in proto tcp from IP to $wan port 63389 rdr-to 192.168.2.12 port 3388`
|
||||
|
||||
The `$wan` changes according to the address of the SSH connection that the user makes every time
|
||||
|
||||
## Todo
|
||||
|
||||
- chroot shell
|
||||
- email activity
|
||||
8
etc/dhcpd.conf
Normal file
8
etc/dhcpd.conf
Normal file
@ -0,0 +1,8 @@
|
||||
option domain-name "taxstudio.gr";
|
||||
option domain-name-servers 9.9.9.9;
|
||||
|
||||
subnet 192.168.2.0 netmask 255.255.255.0 {
|
||||
option routers 192.168.2.1;
|
||||
range 192.168.2.11 192.168.2.19;
|
||||
}
|
||||
|
||||
1
etc/dhcpd.interfaces
Normal file
1
etc/dhcpd.interfaces
Normal file
@ -0,0 +1 @@
|
||||
stge0
|
||||
1
etc/hostname.em0
Normal file
1
etc/hostname.em0
Normal file
@ -0,0 +1 @@
|
||||
dhcp
|
||||
4
etc/hostname.stge0
Normal file
4
etc/hostname.stge0
Normal file
@ -0,0 +1,4 @@
|
||||
media 100baseTX
|
||||
mediaopt full-duplex
|
||||
inet 192.168.2.1 0xffffff00
|
||||
|
||||
41
etc/pf.conf
Normal file
41
etc/pf.conf
Normal file
@ -0,0 +1,41 @@
|
||||
wan = em0
|
||||
lan = stge0
|
||||
|
||||
#----------------------------------
|
||||
# Defaults
|
||||
#----------------------------------
|
||||
pass out keep state
|
||||
|
||||
set skip on lo
|
||||
set block-policy return
|
||||
set reassemble yes
|
||||
|
||||
block in all
|
||||
block return
|
||||
|
||||
match in on $wan scrub (no-df max-mss 1440)
|
||||
match out on $wan scrub (random-id)
|
||||
|
||||
antispoof quick for { $wan lo0 }
|
||||
|
||||
#----------------------------------
|
||||
# Input
|
||||
#----------------------------------
|
||||
pass quick on $lan
|
||||
pass in quick proto tcp to $wan port 22 keep state
|
||||
pass in quick on $lan
|
||||
|
||||
#----------------------------------
|
||||
# Output
|
||||
#----------------------------------
|
||||
pass out on $lan inet keep state
|
||||
|
||||
#----------------------------------
|
||||
# NAT
|
||||
#----------------------------------
|
||||
match out on $wan from !($wan) nat-to ($wan)
|
||||
|
||||
# Allow outgoing traffic for LAN and the gateway
|
||||
pass out quick keep state
|
||||
pass in on { $lan } inet
|
||||
|
||||
15
etc/rc.d/dhcpd
Executable file
15
etc/rc.d/dhcpd
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/ksh
|
||||
#
|
||||
# $OpenBSD: dhcpd,v 1.3 2018/01/11 19:52:12 rpe Exp $
|
||||
|
||||
daemon="/usr/sbin/dhcpd"
|
||||
|
||||
. /etc/rc.d/rc.subr
|
||||
|
||||
rc_reload=NO
|
||||
|
||||
rc_pre() {
|
||||
touch /var/db/dhcpd.leases
|
||||
}
|
||||
|
||||
rc_cmd $1
|
||||
15
etc/rc.d/sshd
Executable file
15
etc/rc.d/sshd
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/ksh
|
||||
#
|
||||
# $OpenBSD: sshd,v 1.6 2020/01/25 12:05:08 sthen Exp $
|
||||
|
||||
daemon="/usr/sbin/sshd"
|
||||
|
||||
. /etc/rc.d/rc.subr
|
||||
|
||||
pexp="sshd: ${daemon}${daemon_flags:+ ${daemon_flags}} \[listener\].*"
|
||||
|
||||
rc_reload() {
|
||||
${daemon} ${daemon_flags} -t && pkill -HUP -xf "${pexp}"
|
||||
}
|
||||
|
||||
rc_cmd $1
|
||||
93
etc/ssh/sshd_config
Normal file
93
etc/ssh/sshd_config
Normal file
@ -0,0 +1,93 @@
|
||||
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
|
||||
|
||||
# This is the sshd server system-wide configuration file. See
|
||||
# sshd_config(5) for more information.
|
||||
|
||||
# The strategy used for options in the default sshd_config shipped with
|
||||
# OpenSSH is to specify options with their default value where
|
||||
# possible, but leave them commented. Uncommented options override the
|
||||
# default value.
|
||||
|
||||
#Port 22
|
||||
#AddressFamily any
|
||||
#ListenAddress 0.0.0.0
|
||||
#ListenAddress ::
|
||||
|
||||
#HostKey /etc/ssh/ssh_host_rsa_key
|
||||
#HostKey /etc/ssh/ssh_host_ecdsa_key
|
||||
#HostKey /etc/ssh/ssh_host_ed25519_key
|
||||
|
||||
# Ciphers and keying
|
||||
#RekeyLimit default none
|
||||
|
||||
# Logging
|
||||
#SyslogFacility AUTH
|
||||
#LogLevel INFO
|
||||
|
||||
# Authentication:
|
||||
|
||||
#LoginGraceTime 2m
|
||||
PermitRootLogin yes
|
||||
#StrictModes yes
|
||||
#MaxAuthTries 6
|
||||
#MaxSessions 10
|
||||
|
||||
#PubkeyAuthentication yes
|
||||
|
||||
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
|
||||
# but this is overridden so installations will only check .ssh/authorized_keys
|
||||
AuthorizedKeysFile .ssh/authorized_keys
|
||||
|
||||
#AuthorizedPrincipalsFile none
|
||||
|
||||
#AuthorizedKeysCommand none
|
||||
#AuthorizedKeysCommandUser nobody
|
||||
|
||||
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
|
||||
#HostbasedAuthentication no
|
||||
# Change to yes if you don't trust ~/.ssh/known_hosts for
|
||||
# HostbasedAuthentication
|
||||
#IgnoreUserKnownHosts no
|
||||
# Don't read the user's ~/.rhosts and ~/.shosts files
|
||||
#IgnoreRhosts yes
|
||||
|
||||
# To disable tunneled clear text passwords, change to no here!
|
||||
#PasswordAuthentication yes
|
||||
#PermitEmptyPasswords no
|
||||
|
||||
# Change to no to disable s/key passwords
|
||||
#ChallengeResponseAuthentication yes
|
||||
|
||||
#AllowAgentForwarding yes
|
||||
#AllowTcpForwarding yes
|
||||
#GatewayPorts no
|
||||
#X11Forwarding no
|
||||
#X11DisplayOffset 10
|
||||
#X11UseLocalhost yes
|
||||
#PermitTTY yes
|
||||
#PrintMotd yes
|
||||
#PrintLastLog yes
|
||||
#TCPKeepAlive yes
|
||||
#PermitUserEnvironment no
|
||||
#Compression delayed
|
||||
#ClientAliveInterval 0
|
||||
#ClientAliveCountMax 3
|
||||
#UseDNS no
|
||||
#PidFile /var/run/sshd.pid
|
||||
#MaxStartups 10:30:100
|
||||
#PermitTunnel no
|
||||
#ChrootDirectory none
|
||||
#VersionAddendum none
|
||||
|
||||
# no default banner path
|
||||
#Banner none
|
||||
|
||||
# override default of no subsystems
|
||||
Subsystem sftp /usr/libexec/sftp-server
|
||||
|
||||
# Example of overriding settings on a per-user basis
|
||||
#Match User anoncvs
|
||||
# X11Forwarding no
|
||||
# AllowTcpForwarding no
|
||||
# PermitTTY no
|
||||
# ForceCommand cvs server
|
||||
1
etc/sysctl.conf
Normal file
1
etc/sysctl.conf
Normal file
@ -0,0 +1 @@
|
||||
net.inet.ip.forwarding=1
|
||||
40
firewall/fw-allow.sh
Normal file
40
firewall/fw-allow.sh
Normal file
@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env ksh
|
||||
|
||||
#
|
||||
# Forward Opener (server helper)
|
||||
#
|
||||
# for OpenBSD
|
||||
# by ste.vaidis@gmail.com
|
||||
#
|
||||
|
||||
if [ $# -ne 2 ]; then
|
||||
logger -t "FORWARD" "fw-allow.sh executed without proper arguments: user:$1 ip:$2"
|
||||
exit
|
||||
fi
|
||||
|
||||
USER=$1
|
||||
IP=$2
|
||||
|
||||
logger -t "FORWARD" "Open for user $USER from $IP"
|
||||
|
||||
cat /firewall/user/$USER | sed "s/IP/$IP/g" > /firewall/user/$USER.tmp
|
||||
echo "include '/firewall/user/$USER.tmp'" >> /etc/pf.conf
|
||||
if [[ $? != 0 ]]; then echo "Fail"; fi
|
||||
|
||||
pfctl -f /etc/pf.conf
|
||||
if [[ $? != 0 ]]; then echo "Fail"; fi
|
||||
|
||||
sleep 15
|
||||
if [[ $? != 0 ]]; then echo "Fail"; fi
|
||||
|
||||
sed -i "/$USER/d" /etc/pf.conf
|
||||
if [[ $? != 0 ]]; then echo "Fail"; fi
|
||||
|
||||
pfctl -f /etc/pf.conf
|
||||
if [[ $? != 0 ]]; then echo "Fail"; fi
|
||||
|
||||
logger -t "FORWARD" "Close for user $USER from $IP"
|
||||
|
||||
rm /firewall/user/$USER.tmp
|
||||
|
||||
exit
|
||||
19
firewall/fw-server.sh
Normal file
19
firewall/fw-server.sh
Normal file
@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env ksh
|
||||
|
||||
#
|
||||
# Forward Opener (server)
|
||||
#
|
||||
# for OpenBSD
|
||||
# by ste.vaidis@gmail.com
|
||||
#
|
||||
|
||||
/usr/local/bin/ncat -lk localhost 3000 | (
|
||||
while read c; do
|
||||
USER=$(echo $c | awk {'print $1'})
|
||||
IP=$(echo $c | awk {'print $2'})
|
||||
ps x | grep fw-allow.sh | grep $USER | grep -v grep
|
||||
if [ $? -eq 1 ]; then
|
||||
/firewall/fw-allow.sh $USER $IP
|
||||
fi
|
||||
done
|
||||
)
|
||||
29
firewall/fw.sh
Normal file
29
firewall/fw.sh
Normal file
@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env ksh
|
||||
|
||||
#
|
||||
# Let-Me-In (client)
|
||||
#
|
||||
# for OpenBSD
|
||||
# by ste.vaidis@gmail.com
|
||||
#
|
||||
|
||||
TITLE="OpenBSD Firewall"
|
||||
USER=$(whoami)
|
||||
IP=$(w | grep $USER | awk {'print $3'})
|
||||
|
||||
echo "$USER $IP" | nc -w1 localhost 3000 &
|
||||
|
||||
(
|
||||
items=15
|
||||
processed=0
|
||||
while [ $processed -le $items ]; do
|
||||
pct=$(( $processed * 100 / $items ))
|
||||
echo "XXX\n"
|
||||
echo "\nHello $USER from $IP"
|
||||
echo "\nYou have 15 seconds to connect ($processed)"
|
||||
echo "XXX"
|
||||
echo "$pct"
|
||||
processed=$((processed+1))
|
||||
sleep 1
|
||||
done
|
||||
) | dialog --title "$TITLE" --gauge "\nWait please..." 10 50 0
|
||||
1
firewall/user/bob
Normal file
1
firewall/user/bob
Normal file
@ -0,0 +1 @@
|
||||
pass in log proto tcp to $wan port 60122 rdr-to 192.168.2.11 port 22
|
||||
2
firewall/user/jack
Normal file
2
firewall/user/jack
Normal file
@ -0,0 +1,2 @@
|
||||
pass in proto tcp from IP to $wan port 63389 rdr-to 192.168.2.222 port 3388
|
||||
pass in proto tcp from IP to $wan port 60322 rdr-to 192.168.2.222 port 22
|
||||
BIN
forward_opener.png
Normal file
BIN
forward_opener.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Loading…
x
Reference in New Issue
Block a user