目标:1)允许 VPN 用户不受任何限制地访问互联网 2)允许服务器本身访问互联网,但仅使用指定的端口(邮件、网络、远程访问)
服务器配置:1)VPN(poptop/postgresql/Cake VPN 计费)2)iptables 3)邮件(dovecot/postfix/spamasassin/postgrey)、apache、tomcat、vsftpd、ssh 4)Arch Linux
5)互联网接口 - eth0 本地接口 - eth1 VPN 虚拟接口 - ppp0
问题:我编写了脚本,使用 IPTables 执行转发。它作品但只适用于来自 ppp0 接口的一个客户端。第一个客户端拥有完整的互联网连接。但任何其他客户端都无法连接任何东西。
问:如何在任意数量的客户端上扩展此脚本?
真的,我不是管理员,所以我对这个蹩脚的问题感到非常抱歉(而且我的英语很差,因为我是俄罗斯人)。但这非常重要,因为现在我们在没有 VPN 的情况下工作;)
短暂性脑缺血发作
这是我在 /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
答案1
只需从匹配接口名称切换到使用源 IP 地址,使用您的 PPP 池块作为源就可以了。
答案2
使用通配符,即 ppp+ 而不是 ppp0,这将允许所有 ppp 接口的流量通过