Предположим что WAN интерфейс шлюза настроен на статический IP адресЭтап 1
Настраиваем сетевые интерфейсы
$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
# Wan
auto eth0
iface eth0 inet static
address 192.168.0.205
netmask 255.255.255.0
gateway 192.168.0.1
# Lan
auto eth1
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
$ sudo nano resolv.conf
$ sudo /etc/init.d/networking restart
Этап 2
Установка DNS+DHCP сервера dnsmasq
$ sudo aptitude update
$ sudo aptitude install dnsmasq
$ sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.old
$ sudo nano /etc/dnsmasq.conf
dhcp-range=192.168.1.2,192.168.1.60,12h
interface=eth1
Этап 3
Установка pptpd
$ sudo apt-get install pptpd
$ sudo cp /etc/pptpd.conf /etc/pptpd.conf.old
$ sudo nano /etc/pptpd.conf
Указываем адрес ppp интерфейса - localip и диапазон адресов выдаваемый при подключение - remoteip
$ sudo cat /etc/pptpd.conf | sed '/ *#/d; /^ *$/d'
option /etc/ppp/pptpd-options
logwtmp
localip 192.168.2.1
remoteip 192.168.2.10-70
$ sudo cp /etc/ppp/pptpd-options /etc/ppp/pptpd-options.old
$ sudo nano /etc/ppp/pptpd-options
$ sudo cat /etc/ppp/pptpd-options | sed '/ *#/d; /^ *$/d'
name pptpd
chapms-strip-domain
refuse-pap
refuse-chap
refuse-mschap
ms-dns 192.168.2.1
proxyarp
lock
nobsdcomp
$ sudo nano /etc/ppp/chap-secrets
$ sudo cat /etc/ppp/chap-secrets | sed '/ *#/d; /^ *$/d'
vpnuser1 pptpd pass1 192.168.2.2
vpnuser2 pptpd pass2 192.168.2.3
$ sudo /etc/init.d/pptpd restart
$ sudo netstat -lpan | grep pptpd
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 11111/pptpd
Этап 4A
Настройка netfilter
sudo nano /etc/init.d/iptables
#!/bin/bash
#cat /etc/init.d/iptables
IPT="/sbin/iptables"
START="/bin/bash"
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
NAME="$0"
N="/etc/init.d/$NAME"
if [ ! -f /etc/rc.firewall ]; then
echo "/etc/rc.firewall does not exist"
exit 0
fi
case "$1" in
start|restart)
echo -n "Starting up iptables firewall..."
$START /etc/rc.firewall
echo "done."
;;
stop)
$IPT -t filter -F
$IPT -t filter -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
echo "done."
exit 0;
;;
*)
echo "Usage: $N {start|restart|stop}" >&2
exit 1
;;
esac
exit 0
Делаем исполняемым /etc/init.d/iptables
$ sudo chmod +x /etc/init.d/iptables
добавляем в автозагрузку
$ sudo update-rc.d iptables defaults
Этап 4B
$ sudo nano /etc/rc.firewall
#!/bin/bash
#cat /etc/rc.firewall
# Required to enable IPv4 forwarding.
# Redhat users can try setting FORWARD_IPV4 in /etc/sysconfig/network to true
# Alternatively, it can be set in /etc/sysctl.conf
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/ip_forward
else
$SYSCTL net.ipv4.ip_forward="1"
fi
# This enables SYN flood protection.
# The SYN cookies activation allows your system to accept an unlimited
# number of TCP connections while still trying to give reasonable
# service during a denial of service attack.
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
else
$SYSCTL net.ipv4.tcp_syncookies="1"
fi
iptables -F
iptables -t nat -F
#Установим политики по умолчанию для трафика, не соответствующего ни одному из правил
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Сетевые интерфейсы
export WAN=eth0
export LAN=eth1
#Теперь закроем наши сервисы так, чтобы они могли работать только для LAN
iptables -I INPUT 1 -i ${LAN} -j ACCEPT
iptables -I INPUT 1 -i lo -j ACCEPT
iptables -A INPUT -p UDP --dport bootps -i ! ${LAN} -j REJECT
iptables -A INPUT -p UDP --dport domain -i ! ${LAN} -j REJECT
# Disabling SMB connections from eth0
iptables -A INPUT -i eth0 -p tcp --dport microsoft-ds -j DROP
iptables -A INPUT -i eth0 -p udp --dport microsoft-ds -j DROP
#(Необязательно) Разрешаем доступ к нашему ssh-серверу из интернета
#iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT
#Отбросим все TCP/UDP-пакеты, обращающиеся к привилегированным портам
iptables -A INPUT -p TCP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP
iptables -A INPUT -p UDP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
#В конце добавляем правила для NAT
#eth1
iptables -I FORWARD -i ${LAN} -d 192.168.1.0/24 -j DROP
iptables -A FORWARD -i ${LAN} -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -i ${WAN} -d 192.168.1.0/24 -j DROP
#eth0
iptables -I FORWARD -i ppp+ -d 192.168.2.0/24 -j DROP
iptables -A FORWARD -i ppp+ -s 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -i ${WAN} -d 192.168.2.0/24 -j ACCEPT
#SNAT eth0
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.0.1
Делаем исполняемым
$ sudo chmod +x /etc/rc.firewall
$ sudo /etc/init.d/iptables restart
DIXI
Предположим что WAN интерфейс шлюза настроен как DHCP клиентЭтап 1
Настраиваем сетевые интерфейсы
$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
# Wan
auto eth0
iface eth0 inet dhcp
# Lan
auto eth1
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
повторяем шаги с 2 по 4A
Этап 4B
$ sudo nano /etc/rc.firewall
#!/bin/bash
#cat /etc/rc.firewall
# Required to enable IPv4 forwarding.
# Redhat users can try setting FORWARD_IPV4 in /etc/sysconfig/network to true
# Alternatively, it can be set in /etc/sysctl.conf
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/ip_forward
else
$SYSCTL net.ipv4.ip_forward="1"
fi
# This enables dynamic address hacking.
# This may help if you have a dynamic IP address \(e.g. slip, ppp, dhcp\).
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
else
$SYSCTL net.ipv4.ip_dynaddr="1"
fi
# This enables SYN flood protection.
# The SYN cookies activation allows your system to accept an unlimited
# number of TCP connections while still trying to give reasonable
# service during a denial of service attack.
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
else
$SYSCTL net.ipv4.tcp_syncookies="1"
fi
iptables -F
iptables -t nat -F
#Установим политики по умолчанию для трафика, не соответствующего ни одному из правил
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Сетевые интерфейсы
export WAN=eth0
export LAN=eth1
#Теперь закроем наши сервисы так, чтобы они могли работать только для LAN
iptables -I INPUT 1 -i ${LAN} -j ACCEPT
iptables -I INPUT 1 -i lo -j ACCEPT
iptables -A INPUT -p UDP --dport bootps -i ! ${LAN} -j REJECT
iptables -A INPUT -p UDP --dport domain -i ! ${LAN} -j REJECT
# Disabling SMB connections from eth0
iptables -A INPUT -i eth0 -p tcp --dport microsoft-ds -j DROP
iptables -A INPUT -i eth0 -p udp --dport microsoft-ds -j DROP
#(Необязательно) Разрешаем доступ к нашему ssh-серверу из интернета
#iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT
#Отбросим все TCP/UDP-пакеты, обращающиеся к привилегированным портам
iptables -A INPUT -p TCP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP
iptables -A INPUT -p UDP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
#В конце добавляем правила для NAT
#eth1
iptables -I FORWARD -i ${LAN} -d 192.168.1.0/24 -j DROP
iptables -A FORWARD -i ${LAN} -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -i ${WAN} -d 192.168.1.0/24 -j DROP
#eth0
iptables -I FORWARD -i ppp+ -d 192.168.2.0/24 -j DROP
iptables -A FORWARD -i ppp+ -s 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -i ${WAN} -d 192.168.2.0/24 -j ACCEPT
#MASQUERADE eth0
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
Делаем исполняемым
$ sudo chmod +x /etc/rc.firewall
=======================================================
Куда интересней когда выход шлюза в интернет осужествляется с использованием VPN (pptp или pppoe)
/etc/ppp/pptpd-options для pptp и pptpd можно разделить
Но не факт что pptp будет создавать ppp0 интерфейс, а не какой нибудь шустрый клиент
Еще интересней, если придумать второй WAN на шлюзе, подключенный к второму провайдеру, для резервного канала
Мысли есть?