VPN 是 Virtual Private Network 的簡寫,兩台電腦之間的 VPN 連線不僅是加密處理的,而且 VPN 還有不少好處:

(1) 重要的伺服主機不用對全世界開放 SSH 或 telnet 登入,管理者可以從 VPN 登入即可

(2) 由於 VPN 有自用 IP 設定,以及另外一套 VPN 連接上線時所用的帳號與密碼,外人很難猜出這些組合

(3) 最重要的是,當我們在外面旅行時,隨時可以用 VPN 隨時連回主機

過去我一直是使用 SSH + 防火牆 + 某些特定的 IP 限制技巧 來登入伺服主機,所以並未對 VPN 有很濃的興趣。此外,Linux 系統的 iptables 防火牆設定也過度繁雜,測試時一不小心就會將自己鎖在主機之外無法登入,這也是我不熱衷玩玩 VPN 的另一個原因。

最近剛好有個機會,搭配我慣用的 iptables 設定軟體 ferm 來實作一下 VPN,這裡就把 ferm 設定的部分跟大家分享一下。

關於 Debian Linux 上面設定 PPTP VPN 伺服器建立 VPN Server 、讓 Windows XP client 能夠連接、的詳細作法、並且在 server 上面建立 NAT,讓連上的機器能夠經由 server 接觸 Internet,這部份請大家參考以下文章:

http://hialan.blogspot.com/2009/04/debian-vpn-server.html

在這篇文章中,作者 Hialan 是使用 shell script 來完成 iptables 防火牆裡面  NAT 的部分。但是我從幾年前就開始使用一套叫作 ferm 的 iptables 設定程式,因為相較於其他的 iptables 設定程式,它的設定非常簡單,說明也很清楚,我早就用這套軟體建立過好幾個防火牆。由於 ferm 也能建立 NAT,所以我就想用 ferm 來順便建立 VPN client 能透過  server 接觸 Internet 的 NAT 功能。

要注意的是,ferm 雖然設定簡單,但有其限制,例如它無法接受 IP alias 方法所增加的 IP,如 “eth0:0, eth0:1″ 等等,必須繞個彎來設定

在 Debian 系統可用以下方式安裝 ferm :

apt-get install ferm

ferm 的設定檔是在 /etc/ferm/ferm.conf :

#在 Debian Linux 中,我們可以用 apt-get install ferm 來安裝 ferm,
# 安裝後,修改 /etc/ferm/ferm.conf ,也要修改
# /etc/default/ferm : ENABLED=yes

@def $NET_LOCAL = 127.0.0.1/32;

# 我的 VPN 介面是設在 eth0:1
# @def $DEV_VPN = eth0:1

# 連接 Internet 的網路卡介面 eth0
@def $DEV_PUBLIC = eth0 ;

@def $NET_VPN = 10.0.1.0/24;

# 信任的主機
@def $NET_TRUST = (111.111.111.111 222.222.222.222 10.0.1.55 );

table filter {
    chain INPUT {
        policy DROP;

        # connection tracking
        mod state state INVALID DROP;
        mod state state (ESTABLISHED RELATED) ACCEPT;

        interface lo ACCEPT;

        # respond to ping, but limit that
        proto icmp icmp-type echo-request ACCEPT;

        saddr $NET_LOCAL proto tcp dport smtp ACCEPT;

        # 讓 VPN Client 能夠 ssh 進來
        saddr $NET_VPN proto tcp dport ssh ACCEPT;

        interface $DEV_PUBLIC {

            # allow SSH connections
            # proto tcp dport ssh ACCEPT;

            # VPN 會用到的 port 是 1723
            proto tcp dport 1723 ACCEPT;

            # allow SSH + FTP connections for trusted hosts
            saddr $NET_TRUST proto tcp dport ftp ACCEPT;
            saddr $NET_TRUST proto tcp dport ssh ACCEPT;            

            # mail
            proto tcp dport 25 ACCEPT;
        }
    }

    chain OUTPUT {
        policy ACCEPT;

        mod state state (ESTABLISHED RELATED) ACCEPT;
    }

    chain FORWARD {
        policy DROP;

        mod state state INVALID DROP;
        mod state state (ESTABLISHED RELATED) ACCEPT;

        # interface $DEV_VPN ACCEPT;
        # 上面這個設定,由於 ferm 不認得 eth0:1 這個 alias IP,
        # 所以無法運作,我改成以下的設定

        saddr $NET_VPN ACCEPT;
    }
}

table nat {
     chain POSTROUTING {
         saddr $NET_VPN outerface $DEV_PUBLIC MASQUERADE;
     }
}

設定好之後,執行

/etc/init.d/ferm restart

重新啟動即可

從 Windows XP 的 VPN client 連上 VPN server 之後,就可以透過 Server 接觸 Internet 了