Цели: 1) разрешить пользователям VPN доступ в Интернет без каких-либо ограничений 2) разрешить самому серверу доступ в Интернет, но с использованием только указанных портов (почта, Интернет, удаленный доступ)
Конфигурация сервера: 1) VPN (poptop / postgresql / Cake VPN billing) 2) iptables 3) почта (dovecot / postfix / spamasassin / postgrey), apache, tomcat, vsftpd, ssh 4) Arch Linux
5) Интернет-интерфейс - локальный интерфейс eth0 - виртуальный интерфейс eth1 VPN - ppp0
Проблема: я stfwed, rtfmed и создал скрипт, который выполняет пересылку с IPTables. Это работает но только для одного клиента из интерфейса ppp0. Первый клиент имеет полное интернет-соединение. Но никакие другие клиенты ни к чему не могут подключиться.
Вопрос: Как я могу расширить этот скрипт на любое количество клиентов?
На самом деле, я не админ, поэтому мне очень жаль этот хромой вопрос (и плохой английский, потому что я русский). Но это очень важно, потому что сейчас мы работаем без VPN;)
TIA
Это мой скрипт в /etc/rc.d/router:
#!/bin/bash
. /etc/rc.conf
. /etc/rc.d/functions
case "$1" in
start)
stat_busy "Starting Iptables Rules"
VPN_INTERFACES=( ppp0 )
lan_interface=eth1
internet_interface=eth0
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -t nat -X
iptables -X -t mangle
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables --append INPUT --protocol 47 --jump ACCEPT
iptables --append INPUT --protocol tcp --match tcp --destination-port 1723
# MASKARAD ppc
iptables -A POSTROUTING -t nat -o $internet_interface -j MASQUERADE
# traf local lo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# ICMP ping_lan
iptables -A INPUT -i $lan_interface -p icmp -j ACCEPT
iptables -A OUTPUT -o $lan_interface -p icmp -j ACCEPT
########################## SERVER --- > INTERNET
# DNS
iptables -A INPUT -i $internet_interface -p tcp --dport 0:65535 --sport 53 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp --sport 0:65535 --dport 53 -j ACCEPT
iptables -A INPUT -i $internet_interface -p udp --dport 0:65535 --sport 53 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p udp --sport 0:65535 --dport 53 -j ACCEPT
# http https
iptables -A INPUT -i $internet_interface -p tcp --sport 80 --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp --dport 80 --sport 0:65535 -j ACCEPT
# mail pop3
iptables -A INPUT -i $internet_interface -p tcp --sport 110 --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp --sport 0:65535 --dport 110 -j ACCEPT
# mail smtp
iptables -A INPUT -i $internet_interface -p tcp --sport 25 --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp --sport 0:65535 --dport 25 -j ACCEPT
# ftp
iptables -A INPUT -i $internet_interface -p tcp --sport 21 --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o -$internet_interface -p tcp --sport 0:65535 --dport 21 -j ACCEPT
############# VPN ------> INTERNET
for vpn_interface in ${VPN_INTERFACES[@]}
do
# ICMP ping_vpn
iptables -A INPUT -i $vpn_interface -p icmp -j ACCEPT
iptables -A OUTPUT -o $vpn_interface -p icmp -j ACCEPT
# DNS for vpn
iptables -A INPUT -i $vpn_interface -p tcp --dport 0:65535 --sport 53 -j ACCEPT
iptables -A OUTPUT -o $vpn_interface -p tcp --sport 0:65535 --dport 53 -j ACCEPT
iptables -A INPUT -i $vpn_interface -p udp --dport 0:65535 --sport 53 -j ACCEPT
iptables -A OUTPUT -o $vpn_interface -p udp --sport 0:65535 --dport 53 -j ACCEPT
# forward vpn--->internet
iptables -A FORWARD -i $vpn_interface -o $internet_interface -p ALL -j ACCEPT
iptables -A FORWARD -i $internet_interface -o $vpn_interface -p ALL -j ACCEPT
# VPN -------- > SERVER
# allow all for translocal connections
iptables -A INPUT -i $vpn_interface -p tcp --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o $vpn_interface -p tcp --sport 0:65535 -j ACCEPT
iptables -A INPUT -i $vpn_interface -p udp --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o $vpn_interface -p udp --sport 0:65535 -j ACCEPT
done
# LAN -------- > SERVER
# allow all for local connections
iptables -A INPUT -i $lan_interface -p tcp --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o $lan_interface -p tcp --sport 0:65535 -j ACCEPT
iptables -A INPUT -i $lan_interface -p udp --dport 0:65535 -j ACCEPT
iptables -A OUTPUT -o $lan_interface -p udp --sport 0:65535 -j ACCEPT
# LAN -------- > SERVER
# VPN connection GRE-47 protocol accept
iptables -A INPUT -i $lan_interface -p 47 -j ACCEPT
iptables -A OUTPUT -o $lan_interface -p 47 -j ACCEPT
# INTERNET ------------ > SERVER
# incoming web
iptables -A INPUT -i $internet_interface -p tcp -m multiport --destination-port 80,443 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp -m multiport --source-port 80,443 -j ACCEPT
# incoming mail pop3
iptables -A INPUT -i $internet_interface -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp --sport 110 -j ACCEPT
# incoming mail smtp
iptables -A INPUT -i $internet_interface -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp --sport 25 -j ACCEPT
# incoming imap
iptables -A INPUT -i $internet_interface -p tcp --dport 143 -j ACCEPT
iptables -A OUTPUT -o $internet_interface -p tcp --sport 143 -j ACCEPT
stat_done
;;
stop)
stat_busy "Stopping Iptables Rules"
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
stat_done
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "usage: $0 {start|stop|restart}"
esac
exit 0
используйте подстановочный знак, т.е. ppp + вместо ppp0, что позволит пропускать весь трафик интерфейсов ppp
Просто переключитесь с сопоставления имен интерфейсов на использование IP-адресов источника, используйте блок пула PPP в качестве источника, и все должно быть так.