PPTP через NAT на Linux

()

Буквально на днях у меня появилась проблема - через офисный шлюз под управлением Linux больше одного пользователя не могли подключиться к удалённому PPTP-серверу. Проблема стояла достаточно остро и надо было её решать и решение было найдено. Всё оказалось очень просто.

Но обо всё по порядку. Для начала уточним что шлюз выпускал в интернет две локальных сети - 192.168.111.0/255.255.255.0 и 192.168.50.0/255.255.255.0, и кроме NAT на нём был поднят прозрачный прокси (хотя это уже точно отношения к делу не имеет:)).

Сервер работает под управлением Ubuntu Server 7.10. Все правила iptables описываются в скрипте /root/scripts/firewall.sh, который в свою очередь запускается из /etc/rc.local.

Скрипт /root/scripts/firewall.sh имеет примерно такое содержание:

#!/bin/sh

# Flush all tables to default:
iptables -F
iptables -F -t nat

# Setting up default politics:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow established connections:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow all for loopback:
iptables -A INPUT -i lo -s 127.0.0.0/255.0.0.0 -j ACCEPT

# Allow all for local networks
iptables -A INPUT -s 192.168.50.0/255.255.255.0  -j ACCEPT
iptables -A INPUT -s 192.168.111.0/255.255.255.0 -j ACCEPT

# Allow ICMP for all
iptables -A INPUT -p icmp -j ACCEPT


# Nat for local networks:
# 192.168.50.0/24:
iptables -t nat -A PREROUTING -s 192.168.50.0/255.255.255.0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.50.0/255.255.255.0 -j MASQUERADE
iptables -A FORWARD -s 192.168.50.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -d 192.168.50.0/255.255.255.0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 192.168.111.0/24:
iptables -t nat -A PREROUTING -s 192.168.111.0/255.255.255.0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.111.0/255.255.255.0 -j MASQUERADE
iptables -A FORWARD -s 192.168.111.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -d 192.168.111.0/255.255.255.0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Из скрипта убраны лишние правила, не относящиеся к делу. Невооружённым глазом видно что никаких специальных правил для PPTP нет и соответственно он должен работать без проблем, однако не работает.

Вдумчивое чтение документации дало толчок к осознанию проблемы: в случае с PPTP, как и с активным FTP, не достаточно просто подменять заголовки IP-пакетов. Чтобы корректно натить PPTP нужно залезть чуть глубже - в сам IP-пакет и модифицировать заголовки PPTP-пакетов. Эту проблему решает модуль ip_nat_pptp. Проблема решилась добавлением в конец скрипта строки:

/sbin/modprobe ip_nat_pptp

Надеюсь что эта информация была полезной.

Ключевые слова: pptp, nat, linux, ip_nat_pptp, vpn.

Комментарии:

lastcrowler 2009-02-17 14:54:45 (#)

Справедливо для ядер 2.6, если ядро 2.4, то потребуется прописывать следующие правила:

iptables -A INPUT -i ${INT_IFACE} -p 47 -j ACCEPT
iptables -A OUTPUT -o ${INT_IFACE} -p 47 -j ACCEPT
iptables -A FORWARD -p TCP -s ${INT_NET} \
--sport $UNPRIVPORTS --dport 1723 -j ACCEPT
iptables -A FORWARD -p TCP -d ${INT_NET} -m state \
--state ESTABLISHED,RELATED --sport 1723 \
--dport $UNPRIVPORTS -j ACCEPT
iptables -A FORWARD -p 47 -s ${INT_NET} -j ACCEPT
iptables -A FORWARD -p 47 -d ${INT_NET} -j ACCEPT

Anonymous 2010-02-14 07:23:26 (#)

Спасибо, очень выручил!

Anonymous 2010-11-02 21:31:06 (#)

Огромное спасибо!

Anonymous 2011-05-05 18:25:29 (#)

Fedora 13, kern 2.6.34.8
Больше нет модуля ip_nat_pptp
Помогла загрузка модуля ip_gre:
modprobe ip_gre
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE