wiki:iptables:tun0_to_tun2
Это старая версия документа!
Содержание
Проброс TCP трафика через SSH
Конфигурация ssh
В файле /etc/ssh/sshd_config добавляем директивы для туннеля
nano etc/ssh/sshd_config X11Forwarding yes PermitTunnel yes
Создание туннеля ssh
Для создания туннеля используется скрипт tun.sh.
#!/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<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> 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<link> 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<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> 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<link> 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
wiki/iptables/tun0_to_tun2.1743695697.txt.gz · Последнее изменение: 2025/04/03 18:54 — Diman