Содержание
Сервер PPTPD, VPN
/etc/pptpd.conf option /etc/ppp/pptpd-options logwtmp localip 192.168.0.1 remoteip 192.168.0.234-238,192.168.0.245
/etc/ppp/pptpd-options, setup 128-bit MPPE with MS-CHAP v2 name pptpd refuse-eap refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe-128 ms-dns 8.8.8.8 ms-dns 8.8.4.4 proxyarp nodefaultroute lock nobsdcomp # for iOS device compatibility nopcomp noaccomp mtu 1400 mru 1400 default-asyncmap
/etc/sysctl.conf net.ipv4.ip_forward=1 setup iptables in /etc/rc.local and make it persist even after reboot iptables -t nat -A POSTROUTING -j MASQUERADE
PPTPD с одним внешним адресом
Исходные данные: CentOS 6, 1 внешний IP Задача: настроить pptpd для личного использования.
# yum install pptpd
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT iptables -A INPUT -i eth0 -p gre -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
/etc/ppp/ip-up
ifconfig $1 mtu 1492
pptpd.conf
[root@vpngw3 ~]# cat /etc/pptpd.conf #start of custom file logwtmp option /etc/ppp/options.pptpd #localip 185.72.246.227-229 localip 185.72.246.252 remoteip 192.168.246.227-229 ###localip 192.168.246.1-254 ###remoteip 185.72.246.227-229 listen 185.72.246.252 #end of custom file debug
PPTPD с несколькими внешними адресами
Исходные данные: CentOS 5, X внешних IP Задача: Каждому пользователю выдавать закрепленный за ним внешний IP
iptables -t nat -A POSTROUTING -s (IP)/24 -o eth0 -j SNAT --to-source (IP) iptables -t nat -A POSTROUTING -s (IP)/24 -o eth0 -j SNAT --to-source (IP)
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -A INPUT -p gre -j ACCEPT iptables -A INPUT -m tcp -p tcp -—dport 1723 -j ACCEPT
/etc/pptpd.conf
1
/etc/ppp/chap-secrets
[root@vpngw3 ~]# cat /etc/ppp/chap-secrets # Secrets for authentication using CHAP # client server secret IP addres Alice * secret1 192.168.20.20 Bob * secret2 192.168.20.30 Carlos * secret3 192.168.20.40
Сеть
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=static HWADDR=00:16:3E:DA:20:EF IPADDR=185.72.246.252 NETMASK=255.255.255.0 ONBOOT=yes
/etc/sysconfig/network-scripts/ifcfg-eth0:228
DEVICE=eth0:228 ONBOOT=yes IPADDR=185.72.246.228 NETMASK=255.255.255.255 MTU=1400
/etc/sysconfig/network-scripts/ifcfg-eth0:229
DEVICE=eth0:229 ONBOOT=yes IPADDR=185.72.246.229 NETMASK=255.255.255.255 MTU=1400
/etc/sysconfig/network-scripts/ifcfg-eth0:xyz
DEVICE=eth0:xyz ONBOOT=yes IPADDR=185.72.246.xyz NETMASK=255.255.255.255 MTU=1400
iptables
iptables -t nat -A POSTROUTING -s 192.168.20.30 -j SNAT --to-source 185.72.246.x iptables -t nat -A POSTROUTING -s 192.168.20.30 -j SNAT --to-source 185.72.246.y iptables -t nat -A POSTROUTING -s 192.168.20.30 -j SNAT --to-source 185.72.246.z /sbin/iptables -t nat -A POSTROUTING -s 10.45.0.0/24 -o eth0 -j SNAT --to-source PUBLIC_IP1 /sbin/iptables -t nat -A POSTROUTING -s 10.45.1.0/24 -o eth0 -j SNAT --to-source PUBLIC_IP2
===== Бонусы и плюшки
Убрать маршрут по-умолчанию
Опция nodefaultroute
заставляет pppd не устанавливать маршрут по-умолчанию через VPN сервер.
В файл /etc/ppp/pptpd-options
добавляем nodefaultroute
Подключение VPN → Свойства → Сеть → Протокол интернета TCP/IP → Свойства → Дополнительно → Использовать основной шлюз удаленной сети (убрать галочку)
VPN connection → Properties → Networking → TCP/IPv4 → Properties → Advanced → Use default gateway on remote network
MTU
Часть сайтов у вас может отвечать на ping, но при этом в браузере они не открываются. WTF?! MTU!
А помните был такой провайдер MTU Intel :)
Правило Аркадия Паровозова должно (?) всё исправить
iptables -A FORWARD -i ppp+ -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Что делать если на сервере не изменяется размер MTU и остается равным 1396?
Через /etc/pptpd.conf и /etc/ppp/options.pptpd MTU не устанавливается.
Добавить в файл /etc/ppp/ip-up.local
ifconfig $1 mtu 1420
Как ограничить количество подключений для учетной записи (один логин один коннект)
Рабочий скрипт - http://poptop.sourceforge.net/dox/skwok/poptop_ads_howto_12.htm#oneconnection
Создаём два файла
/etc/ppp/auth-up
#!/bin/sh # get the username/ppp line number from the parameters PPPLINE=$1 USER=$2 # create the directory to keep pid files per user mkdir -p /var/run/pptpd-users # if there is a session already for this user, terminate the old one if [ -f /var/run/pptpd-users/$USER ]; then kill -HUP `cat /var/run/pptpd-users/$USER` rm /var/run/pptpd-users/$USER fi # write down the username in the ppp line file echo $USER > /var/run/pptpd-users/$PPPLINE.new
/etc/ppp/ip-up.local
#!/bin/sh REALDEVICE=$1 # Get the username from the ppp line record file USER=`cat /var/run/pptpd-users/$REALDEVICE.new` # Copy the ppp line pid cp "/var/run/$REALDEVICE.pid" /var/run/pptpd-users/$USER # remove the ppp line record file rm "/var/run/pptpd-users/$REALDEVICE.new"
# Reset/Flush iptables iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # Flush end iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT iptables -A INPUT -i eth0 -p gre -j ACCEPT # Allow localhost traffic iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT # Allow server and internal network to go anyway iptables -A INPUT -s 10.0.0.0/24 -m state --state NEW -j ACCEPT iptables -A INPUT -s 199.101.100.10 -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state NEW -j ACCEPT # Allow ssh iptables -A INPUT -p tcp --dport ssh -j ACCEPT
$ uname -srv Linux 2.6.18-407.el5 #1 SMP Wed Nov 11 08:12:41 EST 2015 $ cat /etc/redhat-release CentOS release 5.11 (Final)
MTU
Firewall
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT iptables -A INPUT -i eth0 -p gre -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
# Пропускать все пакеты с интерфейсов ppp*, например ppp0 iptables -A INPUT -i ppp+ -j ACCEPT iptables -A OUTPUT -o ppp+ -j ACCEPT # Пропускать входящие соединения на порт 1723 (PPTP) iptables -A INPUT -p tcp --dport 1723 -j ACCEPT # Пропускать все пакеты GRE iptables -A INPUT -p 47 -j ACCEPT iptables -A OUTPUT -p 47 -j ACCEPT # Включить форвардинг IP iptables -F FORWARD iptables -A FORWARD -j ACCEPT # Включить NAT для интерфейсов eth0 и ppp* iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE iptables -A POSTROUTING -t nat -o ppp+ -j MASQUERADE
#!/bin/bash # hostwelt # 23mar2016 # simple ruleset for pptpd # reset iptables iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # enable forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # basic rules iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t mangle -A FORWARD -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT iptables -A INPUT -i eth0 -p gre -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT #iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ##iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu #iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu #iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 0:65535 -j TCPMSS --clamp-mss-to-pmtu -i ppp+ # vpn pool # localip 192.168.170.241-249 # publicip 185.53.170.241-249 #iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -s 192.168.170.241 -j SNAT --to-source 185.53.170.241 iptables -t nat -A POSTROUTING -s 192.168.170.242 -j SNAT --to-source 185.53.170.242 iptables -t nat -A POSTROUTING -s 192.168.170.243 -j SNAT --to-source 185.53.170.243 iptables -t nat -A POSTROUTING -s 192.168.170.244 -j SNAT --to-source 185.53.170.244 iptables -t nat -A POSTROUTING -s 192.168.170.245 -j SNAT --to-source 185.53.170.245 iptables -t nat -A POSTROUTING -s 192.168.170.246 -j SNAT --to-source 185.53.170.246 iptables -t nat -A POSTROUTING -s 192.168.170.247 -j SNAT --to-source 185.53.170.247 iptables -t nat -A POSTROUTING -s 192.168.170.248 -j SNAT --to-source 185.53.170.248 iptables -t nat -A POSTROUTING -s 192.168.170.249 -j SNAT --to-source 185.53.170.249
ppp0: ppp: compressor dropped pkt
Создаём файл /etc/ppp/ip-up.d/mppefixmtu.sh
#!/bin/sh CURRENT_MTU="`ip link show $1 | grep -Po '(?<=mtu )([0-9]+)'`" FIXED_MTU="`expr $CURRENT_MTU + 4`" ip link set $1 mtu $FIXED_MTU
Ошибка: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=330973
pptpd[xxxxx]: Long config file line ignored
Добавляем пустую строку в конец файла /etc/pptpd.conf
FreeRADIUS
Мониторинг
Better than nothing
Munin
pptpd-monitor
Python скрипт для отображения статистики по VPN сессиям
Обсуждение