IPTables/VPN 转发

IPTables/VPN 转发

目标: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 接口的流量通过

相关内容