2

Я хочу туннелировать две VPN, используя OpenVPN. Таким образом, клиент будет подключаться к первому VPN и будет перенаправлен на второй VPN. (Это все VPS, у меня нет физического доступа к нему, так как это будет важно чуть позже.)

Итак, вот картинка:

Client              VPN1                    VPN2
10.8.0.2[tun0]------10.8.0.1[tun0]
[1.1.1.1][eth0]     10.8.100.2[tun1]----------10.8.100.1[tun0]
                    45.55.45.55[eth0]         186.186.186.186[eth0]------internet

Конфигурация сервера является довольно стандартной конфигурацией:

port 1194
auth-user-pass-verify /etc/openvpn/script/login.py via-env
username-as-common-name
script-security 3
proto udp
dev tun
duplicate-cn
sndbuf 0
rcvbuf 0
vca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0 (or 10.8.100.0 in the VPN2)
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem

Конфигурация клиента также довольно стандартная:

client
dev tun
auth-user-pass login.txt
proto udp
sndbuf 0
rcvbuf 0
remote 45.55.45.55 1194 (or 186.186.186.186 for VPN2)
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-128-CBC
comp-lzo
key-direction 1
verb 3

Итак, для достижения цепочки VPN, я подключаюсь к VPN1 напрямую.

openvpn --config toOpenVPN1.ovpn

Если я подключаюсь таким образом из VPN1 в VPN2, я блокируюсь от сервера VPN1, так как весь трафик перенаправляется на VPN2, а общедоступный IP-адрес VPN1 устанавливается на VPN2. Итак, я отклоняю выдвинутый маршрут, идущий от второго VPN с параметром --route-nopull.

openvpn --config toOpenVPN2.ovpn --route-nopull

Так что, это хорошо связывает. У меня трафик с локального хоста на VPN1, и мой публичный IP-адрес - VPN1. Я также назначил IP-адреса для интерфейсов tunX. Тем не менее, трафик от локального хоста (клиента) до VPN2 по-прежнему отсутствует. Я должен создать маршруты, чтобы заставить это работать. И это было то, что я терплю неудачу.

Поскольку клиенту не нужно заботиться о том, перенаправляется ли его трафик в другое место, я предполагаю, что на его стороне (клиент) не требуется никаких правил конфигурации или правил iptables. То же самое относится и к серверу VPN2, которому не нужно знать, идет ли он от VPN1 или других узлов. Итак, все, что мне нужно для настройки - это конфигурации VPN1.

Прежде всего, я установлю правила iptables следующим образом. Это только позволит трафику проходить.

iptables -A INPUT -i tun1 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o tun1 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -m multiport --dports 6880:7000 -j DROP
iptables -A FORWARD -i tun1 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -d 10.8.100.0/24 -i tun0 -o tun1 -m conntrack --ctstate NEW -j ACCEPT 
iptables -A FORWARD -s 10.8.100.0/24 -d 10.8.0.0/24 -i tun1 -o tun0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE

Теперь я должен создать маршруты для одного узла, увидеть другие:

route add 0.0.0.0/0 dev tun0
route add 0.0.0.0/0 dev tun1
### route from the the first tunnel, through the client's IP
route add -net 10.8.0.0/24 gw 10.8.0.2 dev tun0
### same for the 2nd
route add -net 10.8.100.0/24 gw 10.8.100.1 dev tun1
### route all the traffic to the 2nd VPN
### end server's IP and internet's gateway
route add 186.186.186.186 gw 45.55.45.1
route add default gw 10.8.100.1 dev tun1 <<<<<<<<<<<<<<<<<< got locked out of VPN1 server

Итак, либо я создаю неправильные маршруты, либо правила iptables настроены неправильно, но у меня не может быть трафика, поступающего от одного клиента ко второму VPN. И после многих попыток я всегда блокируюсь от VPN1.

Как будет правильный набор маршрутов для VPN1?

2 ответа2

1

Итак, я понял это. Для этого нужно использовать пользовательские таблицы маршрутизации и правила iptables, чтобы пометить все пакеты, которые вы хотите переслать.

Например, для пересылки одного порта по TCP вы можете использовать что-то вроде:

iptables -t mangle -I PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999

Затем создайте таблицу маршрутизации в /etc/iproute2/rt_tables для помеченных пакетов: скажем, 9999 tableToForward .

Наконец, добавьте два правила для пересылки всех помеченных пакетов в эту таблицу через интерфейс tun1 :

ip route add 0.0.0.0/0 dev tun1 table tableToForward
ip rule add from all fwmark 1 table tableToForward
0

openvpn --config toOpenVPN2.ovpn --route-nopull

работал нормально

два Vpn-сервера, один подключенный к другому через снова openvpn с помощью вышеуказанной команды.

Доступ в интернет работал, без - route-nopull доступ в интернет не работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .