Буквально на днях у меня появилась проблема - через офисный шлюз под управлением 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
Надеюсь что эта информация была полезной.
lastcrowler 2009-02-17 14:54:45 (#)
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