====== Проброс TCP трафика через SSH ======
===== Конфигурация ssh =====
В файле **/etc/ssh/sshd_config** добавляем директивы для туннеля
nano etc/ssh/sshd_config
X11Forwarding yes
PermitTunnel yes
===== Создание туннеля ssh =====
Для создания туннеля используется скрипт tun.sh. В скрипте реализован туннель директивой ssh -w. Можно использовать autossh, который умеет сам контроллировать трафик и состояние туннеля.
#!/bin/sh
. $(dirname "$0")/set.sh
echo -n "Starting SSH-VPN tunnel ..."
echo -n "Loading mod .."
modprobe tun
echo -n "Create tunnel forward ..."
ssh -f ${HOST} -p ${HOST_PORT} "ip link delete tun${TUN_REMOTE}" > /dev/null 2>&1
echo -n "Create tunnel bottom back ..."
ssh -w ${TUN_LOCAL}:${TUN_REMOTE} -f ${HOST} -p ${HOST_PORT} \
"ip addr add ${IP_REMOTE}/${IP_MASK} dev tun${TUN_REMOTE} && ip link set tun${TUN_REMOTE} up && true"
sleep 3
echo -n "add route ..."
ip addr add ${IP_LOCAL}/${IP_MASK} dev tun${TUN_LOCAL}
ip link set tun${TUN_LOCAL} up
#ip route add ${NET_REMOTE} via ${IP_REMOTE}
echo "done."
==== Проброс трафика с tun0 на tun8 и обратно ====
Имеется два интерфейса на сервере - tun0 с локальной сетью (192.168.230.0/24) openvpn клиентов, второй (tun8) - SSH туннель
tun0: flags=4305 mtu 1500
inet 192.168.230.1 netmask 255.255.255.0 destination 192.168.230.1
inet6 fe80::891c:9c90:764a:72de prefixlen 64 scopeid 0x20
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 59021 bytes 48550863 (48.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 20562 bytes 13862348 (13.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tun8: flags=4305 mtu 1500
inet 172.30.8.2 netmask 255.255.255.252 destination 172.30.8.2
inet6 fe80::d121:b3d4:93f8:7a2c prefixlen 64 scopeid 0x20
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 10688 bytes 6206716 (6.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 47834 bytes 47113670 (47.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
==== Маршрутизация трафика ====
Добавляем таблицу маршрутизации для vpn
nano /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 vpn
Проброс трафика будем осуществлять скриптом маршрутизации r.sh
#!/bin/sh
. $(dirname "$0")/set.sh
iptables -F
iptables -t nat -F
iptables -t mangle -F
#iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
#iptables -t nat -A POSTROUTING -o tun8 -j MASQUERADE
iptables -t nat -A POSTROUTING -j MASQUERADE
#iptables -A INPUT -i tun8 -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -A INPUT -i tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun$TUN_OVPN -o tun$TUN_REMOTE -s $NET_LOCAL -j ACCEPT
iptables -A FORWARD -i tun$TUN_REMOTE -o tun$TUN_OVPN -d $NET_LOCAL -j ACCEPT
#ip route del default dev tun$TUN_REMOTE table vpn
#ip route del $NET_LOCAL dev eth0 table vpn
#ip rule del from $NET_LOCAL table vpn
ip route del default table vpn
ip route add default dev tun$TUN_REMOTE table vpn
ip route del $NET_LOCAL dev $ETH_NAME table vpn
ip route add $NET_LOCAL dev $ETH_NAME table vpn
ip rule flush table vpn
ip rule add from $NET_LOCAL table vpn
iptables -L -nv
iptables -L -n -t nat
==== Настройки конфигурации туннеля ====
Настройки сохраняем в файле **set.sh**
#!/bin/bash
HOST=192.168.2.180
HOST_PORT=22
ETH_NAME='ens18'
TUN_OVPN=0 # tun openvpn number here.
TUN_LOCAL=8 # tun device number here.
TUN_REMOTE=8 # tun device number there.
IP_LOCAL=172.30.8.2 # IP local for ssh tunnel
IP_REMOTE=172.30.8.1 # IP remote for ssh tunnel
IP_MASK=30 # Subnet for ssh tunnel
NET_REMOTE=172.16.0.0/12 # Remote subnet for translate from (not used now)
NET_LOCAL=192.168.230.0/24 # openvpn subnet here.
==== Контроль и восстановление работоспособности туннеля ssh ====
Для контроля работы туннеля создадим скрипт **test-tun.sh** Его следует добавить в крон после проверки его работоспособности
#!/bin/bash
. $(dirname "$0")/set.sh
LOG=/var/log/route-test.log
log(){ echo "$(date '+%F %T') $@" >> $LOG; echo "$(date '+%F %T') $@";}
ping -c 3 $IP_REMOTE
if [ $? -eq 0 ]; then
log 'ping success'
else
echo "fail ping" >> $LOG
log 'fail ping'
pid=$(ps ax | grep $IP_REMOTE | head -n1 | awk '{print $1}' | xargs)
kill -9 $pid
log "kill old ssh tun $pid"
sleep 9
log "start new ssh tun"
bash $(dirname "$0")/tun.sh
sleep 2
log "add routes to new ssh tunnel"
bash $(dirname "$0")/r.sh
fi
==== MASQUERADE на целевом сервере ====
Важное замечание: на целевом сервере, где поднимается ssh туннель должно быть разрешен маскарадинг на интерфейсе tun, иначе работать туннель не будет
/etc/sysctl.conf
net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -j MASQUERADE