Буквально на днях у меня появилась проблема - через офисный шлюз под управлением 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
Надеюсь что эта информация была полезной.
|