4

У меня есть дроплет Digital Ocean (похожий на экземпляр Amazon EC2) под управлением Ubuntu Server 12.04.3 x64 с установленными как strongswan 5.1.1 (созданный из исходного кода), так и squid 3.4.2 (также созданный из исходного кода).

VPN-серверы strongswan и прокси-сервер squid прекрасно работают по отдельности, с небольшими изменениями в правилах iptables, разумеется, между тестированием.

То, что я хотел бы сделать, это иметь возможность инициировать VPN-соединение с моего компьютера / устройства, и исходящий VPN-трафик автоматически направляется через локальный прокси-сервер squid.

То есть поток трафика должен выглядеть примерно так:

Клиент -> VPN -> Прокси -> Интернет

К сожалению, я не могу найти хороший способ заставить работать такого рода соединение. Друг указал, что цепочка вывода таблицы NAT в iptables может быть моим решением, предложив такое правило:

iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128

Хотя для меня логично, как это могло бы работать, похоже, это не так. Я не вижу никаких пакетов, следующих правилу (периодически проверяя количество входящих / исходящих пакетов с помощью команды iptables-save), когда я пытаюсь загрузить контент при подключении к VPN.

Имейте в виду, я не эксперт по iptables или linux, поэтому, пожалуйста, потерпите меня здесь, если что-то, что я сказал (или что-то, что я говорю), глупо / глупо / очевидно-чертова проблема ;)

Я открыт для любых предложений о том, как решить эту проблему, но удаление компонента не является решением. Мне нужно, чтобы VPN и прокси работали так. Изменение версий любого компонента также не является идеальным, хотя гораздо более выполнимым.

Я предоставил как ipsec.conf, так и squid.conf, а также свой текущий скрипт правил iptables.

PS Если вы заметили, есть некоторые вещи, связанные с использованием RADIUS для аутентификации. Не беспокойся об этом. В настоящее время он не используется и не должен иметь никакого влияния на этот вопрос.

Скрипт iptables:

iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

export WAN=eth0
export vpnclients=10.100.0.0/255.255.0.0

# Allow access to our SSH server from the WAN
iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT

# Add the rules for NAT
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE

iptables-save

ipsec.conf:

config setup
ca ipsec
        cacert=ca.pem
        auto=add

conn %default
        ikelifetime=60m
        keylife=20m
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!
        leftcert=vpn-server.crt
        leftauth=pubkey
        rightsendcert=never
        leftsendcert=always
        eap_identity=%identity%
        leftfirewall=yes
        auto=add

conn ikev1
        keyexchange=ikev1
        rightauth=pubkey
        rightauth2=xauth
        rightsourceip=10.100.0.0/16
        right=%any
        rightid=%any
        rightdns=8.8.8.8,8.8.4.4
        leftsourceip=<my_server_ip>
        leftsubnet=0.0.0.0/1,128.0.0.0/1,::/1,8000::/1

conn ikev2
        keyexchange=ikev2
        rightsourceip=10.100.0.0/16
        right=%any
        rightid=%any
        rightauth=eap-radius

squid.conf:

#dummy name used
cache deny all
forwarded_for off

#for debugging, enable in production
strip_query_terms off

cache_effective_user proxy
cache_effective_group proxy
client_dst_passthru on
host_verify_strict off
http_port 3130 intercept
http_port 3128
https_port 3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/dev/squid.pem

always_direct allow all
ssl_bump server-first all

# the following two options are unsafe and not always necessary:
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

# Change these to your local DNS servers
dns_nameservers 8.8.8.8 8.8.4.4
coredump_dir /var/cache/squid

http_access allow all
http_reply_access allow all

1 ответ1

1

У меня была точно такая же проблема, и спустя почти 1 день я смог решить эту проблему. Это решение для тех, кто читает это в будущем.

Цель: То же, что и ОП, которого я пытался достичь

Клиент -> VPN -> Прокси -> Интернет

Настройка: Ubuntu 16.04

VPN: L2TP с использованием xl2tpd и pptpd, а также strongswan для шифрования. Настройка VPN и прокси-сервер Squid находятся на одном компьютере.

Private IP Pool для раздачи IP-адресов клиентам: 172.21.118.0/24

Как и ожидалось в OP, вам необходимо запустить -j REDIRECT --to-port 3128 для таблицы nat (PREROUTING или OUTPUT).

Зондирование и регистрация различных таблиц, вот путь, по которому следует каждый пакет, исходящий из 172.21.118.0/24:

mangle PREROUTING -> nat PREROUTING -> mangle FORWARD -> фильтр FORWARD -> mangle POSTROUTING -> nat POSTROUTING

Я понял, как это работает, используя отличную иллюстрацию жизненного цикла пакета iptables:

Источник: http://64-bit.de/dokumentationen/netzwerk/e/002/DE-IPTABLES-HOWTO-3.html

Как оказалось, эта настройка не отправляет ничего в цепочке OUTPUT, поэтому единственное место для перенаправления порта - цепочка PREROUTING.

Решение просто:

iptables -t nat -I PREROUTING  -i ppp0 -s 172.21.118.1/24 -j REDIRECT --to-ports 3128

Также не забудьте SNAT на ваш публичный IP для того, чтобы выйти в интернет:

iptables -t nat -A POSTROUTING -j SNAT -s 172.21.118.2/24 --to-source ${IP} -o eth0
#Alternatively but slower:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

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