实现环境: 预装Linux(kernal version 2.6.27.15,Fedora 10 )的主机一台+双网卡+ADSL VPN SERVER PC in a LAN ADSL modem eth0 eth1 |#####| 公网-----------|######|---------------||----------||------------|#####| |<----PPPoE----->|<---NAT--->|<----PPTP--->| eth0接口用来通过拨号从网通获取公网ip,拨号成功后会在VPN Server上产生一个ppp0接 口,该接口的ip地址就是从公网获取的ip地址 eth1接口是与局域网相连的那块网卡接口,如果此接口已连上开启DHCP服务的路由器,则 它会有一个ip地址 PPPoE:ADSL专用的通讯协议,需要输入电信给你的帐号和密码; PPTP:点对点隧道协议,是一种支持多协议虚拟专用网络的协议。 /******************************** A.VPN Server通过ADSL拨号上网 ****************/ 1.PPPoE软件的安装 1) 在 http://www.roaringpenguin.com/pppoe/#download 下载 2) 安装rp-pppoe。以root身份执行 2.查看与ADSL modem连接的那块网卡是否被系统识别 运行 ifconfig eth0 显示类似如下信息: eth0 Link encap:Ethernet HWaddr 00:E0:4C:50:E1:90 inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::2e0:4cff:fe50:e190/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:11031331 errors:20041 dropped:0 overruns:0 frame:0 TX packets:9151127 errors:0 dropped:0 overruns:0 carrier:0 collisions:24 txqueuelen:1000 RX bytes:2507000230 (2.3 GiB) TX bytes:2096138656 (1.9 GiB) Interrupt:17 Base address:0x4000 /***注意***/:a.不需要特意给eth0填上ip地址,此处的192.168.0.2是由于eth0所连接 的ADSL MODEM具有路由功能,故给eth0分配了ip地址, 但这并不影响我们的配置;b.不需要设置此网卡随开机启动 3.pppoe客户端(VPN Server)拨号设置 运行 #/usr/sbin/adsl-setup >>> Enter your PPPoE user name: ——此处输入拨号帐号的用户名(申请adsl时网 通给分配的) >>> Enter the Ethernet interface connected to the ADSL modem For Solaris, this is likely to be something like /dev/hme0. For Linux, it will be ethn, where 'n' is a number. (default eth0): ——输eth0(与adsl modem连接的那块网卡 接口) >>> Enter the demand value (default no): ——输no >>> Enter the DNS information here: ——输202.106.46.151,202.106.195.68( 网通的DNS) >>> Please enter your PPPoE password: ——输网通用户口令 >>> Choose a type of firewall (0-2): ——输0 >>> Accept these settings and adjust configuration files (y/n)? ——输y 以上的这些设置将会更改以下两个文件 /etc/ppp/pppoe.conf ---涉及与adsl modem连接的接口选择,用户名等 /etc/resolv.conf ---与DNS有关 将用户名和密码存入/etc/ppp/chap-secrets中,以便下次连接时不用再此输入 4.启动ADSL连接 运行 #/usr/sbin/adsl-start 若一切正常,则显示 [root@PCN-CAD ppp]# adsl-start ... Connected! 至此,此VPN Server已经连上公网 5.运行 #ifconfig eth0 Link encap:Ethernet HWaddr 00:E0:4C:50:E1:90 inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0 ........ eth1 Link encap:Ethernet HWaddr 00:08:74:B7:03:C3 inet addr:59.64.154.187 Bcast:59.64.154.255 Mask:255.255.255.0 ......... lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 ......... ppp0 Link encap:Point-to-Point Protocol inet addr:123.119.245.174 P-t-P:123.119.240.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1 RX packets:312 errors:0 dropped:0 overruns:0 frame:0 TX packets:459 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:65478 (63.9 KiB) TX bytes:61611 (60.1 KiB) 多出来的那个ppp0就是我们拨号成功后系统虚拟的一个接口 /************************************* END OF A ****************************** */ /************************************ B.VPN Server开启pptpd服务 ***************/ 1.确保如下软件正确安装(版本可能会有出入) kernel_ppp_mppe-0.0.4-2dkms.noarch.rpm (MPPE的内核补丁) dkms-1.12-1.noarch.rpm (升级dkms) pptpd-1.2.1.tar.gz (pptpd服务软件) 2.配置VPN服务器 修改/etc/pptpd.conf文件: ppp /usr/sbin/pppd #指定PPP服务程序 option /etc/ppp/options.pptpd #指定选项配置 localip 59.64.154.187 #指定本地IP remoteip 192.168.2.139-245 #指定分配的远程IP 修改/etc/ppp/options.pptpd文件: name pptpd refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe-128 ms-dns 202.106.46.151 ms-dns 202.106.195.68 proxyarp debug lock nobsdcomp novj novjccomp nologfd 修改/etc/ppp/chap-secrets文件 # client server secret IP addresses #username pptpd password * "username" pptpd "passwd" * 这里是配置VPN的用户帐号,如"china" pptpd "beijing" 启动服务: /usr/local/sbin/pptpd 然后用netstat查看一下1723端口是不是开的,如果是的话则说明服务已成功启动。 /*********************************** END OF B ******************************** */ /******************************** C.利用iptables开启NAT功能 ***************** */ NAT的功能是为了实现数据包的伪装及转发,从LAN里面的用户发出的包通过VPN SERVER的 eth1经报头伪装后转发到连接公网的eth0。 此部分参考鸟哥私房菜的NAT服务器架设篇 #!/bin/bash # # ======================================================== # 程式說明: # 歡迎使用 iptables.rule 這個 script 來建立您的防火牆! # 這支 script 還需要您的額外設定方可適合您的主機環境! # 基本規則定義為『拒絕所有,開放特定』的模式! # # 強烈建議: # 不了解 Linux 防火牆機制 iptables 的朋友使用這支 script # 可能會不太瞭解每個指令列的意義,果真如此的話, # 歡迎參考底下幾個網頁: # http://www.study-area.org/linux/servers/linux_nat.htm # http://linux.vbird.org/linux_server/0240network-secure-1.php # http://linux.vbird.org/linux_server/0250simple_firewall.php # # 使用說明: # 確定這個程式僅有 Linux 的斷行字元: # dos2unix iptables.rule # 請先將這個 scripts 的權限更改為可執行: # chmod 755 iptables.rule # 在將這個程式放置在 /usr/local/virus/iptables 目錄下: # mkdir -p /usr/local/virus/iptables # mv /完整的路徑/iptables.rule /usr/local/virus/iptables # 執行測試: # /usr/local/virus/iptables/iptables.rule # iptables -L -n (這個動作在檢查防火牆規則) # 將底下這一行加入 /etc/rc.d/rc.local 當中 # /usr/local/virus/iptables/iptables.rule # 取消防火牆: # iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # # ======================================================== # 版權宣告: # 這支程式為 GPL 授權,任何人皆可使用, # 然,若使用本 scripts 發生問題時,本人不負任何責任 # VBird <vbird@mail.vbird.idv.tw> # ======================================================== # # 歷史紀錄: # 2002/08/20 VBird 首次釋出 # 2003/04/26 VBird 加入砍站軟體的相關執行檔案! # 2003/08/25 VBird 修改 INPUT 的 Policy 成為 DROP # 2006/09/13 VBird 重新修訂,加入一些核心參數 /proc/sys/net/ipv4/* # 2006/09/15 VBird 加入關於 NAT 主機後端伺服器的轉址功能。 # 2006/09/30 VBird 加入每個設定項目的英文說明!! # 2006/11/08 VBird 參考朋友們發現的 PPPoE 導致 MTU 的問題,增加一條規則! 在 NAT 的部分。 # ############################################################################## ############# # 請先輸入您的相關參數,不要輸入錯誤了! # English: Please input your networks parameters ( including your LAN NIC ) EXTIF="ppp0" # 這個是可以連上 Public IP 的網路介面 ,也可能是 ppp0 # This is your NIC, connect to internet. Such as ppp0... INIF="eth1" # 內部 LAN 的連接介面;若無 LAN ,填寫 成 INIF="" # This is your LAN NIC. If you don't have a LAN, input INIF="" please. INNET="192.168.2.0/24" # 若有兩個以上的網域,可以用 INNET="192.168.1.0/24 192.168.100.0/24" # 若無內部網域介面,請填寫成 INNET="" # This is your LAN's Network. If you have to private network, # input as INNET="192.168.1.0/24 192.168.100.0/24". export EXTIF INIF INNET # 個人化設定啊!請自行填寫您自己想要預先啟動的一些基礎資料。 # These settings is about yourself's paramters. allowname='' # 允許登入本機的 hostname ,必須是 Internet 找 的到的 hostname。 allowip="" if [ "$allowname" != "" ]; then for siteiptmp in `echo $allowname` do siteip=`/usr/bin/host $siteiptmp 168.95.1.1 | grep address|tail -n 1 | awk '{print $4}'` testip=`echo $siteip | grep [^0-9.]` if [ "$testip" == "" ]; then allowip="$allowip $siteip" fi done fi export allowip # 第一部份,針對本機的防火牆設定!############################################ ## # First, your server's firewall settings. # 1. 先設定好核心的網路功能: # 1. the kernel's firewall settings. # 開啟 TCP Flooding 的 DoS 攻擊抵擋機制,但這個設定不適合 loading 已經很高的 主機!!! # TCP Flooding's setting. this setting is no good for high loading servers echo "1" > /proc/sys/net/ipv4/tcp_syncookies # 取消 ping 廣播的回應; # unset reply of ping. echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # 開啟逆向路徑過濾,以符合 IP 封包與網路介面的設定; # for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo "1" > $i done # 開啟記錄有問題的封包 # record some problems packets. for i in /proc/sys/net/ipv4/conf/*/log_martians; do echo "1" > $i done # 取消來源路由,這個設定值是可以取消的; for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo "0" > $i done # 取消重新宣告路徑的功能。 for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo "0" > $i done # 取消傳送重新宣告路徑的功能。 for i in /proc/sys/net/ipv4/conf/*/send_redirects; do echo "0" > $i done # 2. 清除規則、設定預設政策及開放 lo 與相關的設定值 # 2. clear rule, set the policy rule and allow lo connect. PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH iptables -F iptables -X iptables -Z iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state RELATED -j ACCEPT # 3. 啟動額外的防火牆 script 模組 # 3. other shell scripts, written by VBird. # 預設抵擋的主機 if [ -f /usr/local/virus/iptables/iptables.deny ]; then sh /usr/local/virus/iptables/iptables.deny fi # 預設開放的主機 if [ -f /usr/local/virus/iptables/iptables.allow ]; then sh /usr/local/virus/iptables/iptables.allow fi # 透過 WWW 砍站軟體分析的抵擋機制 if [ -f /usr/local/virus/httpd-err/iptables.http ]; then sh /usr/local/virus/httpd-err/iptables.http fi iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # 4. 允許某些類型的 ICMP 封包進入 # 4. allow some types of ICMP AICMP="0 3 3/4 4 11 12 14 16 18" for tyicmp in $AICMP do iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT done # 5. 允許某些服務的進入 # iptables -A INPUT -p TCP -i $EXTIF --dport 22 -j ACCEPT # SSH # iptables -A INPUT -p TCP -i $EXTIF --dport 25 -j ACCEPT # SMTP # iptables -A INPUT -p UDP -i $EXTIF --dport 53 -j ACCEPT # DNS # iptables -A INPUT -p TCP -i $EXTIF --dport 53 -j ACCEPT # DNS # iptables -A INPUT -p TCP -i $EXTIF --dport 80 -j ACCEPT # WWW # iptables -A INPUT -p TCP -i $EXTIF --dport 110 -j ACCEPT # POP3 # iptables -A INPUT -p TCP -i $EXTIF --dport 443 -j ACCEPT # HTTPS # 第二部份,針對後端主機的防火牆設定!######################################## ## # Second, the NAT settings. # 1. 先載入一些有用的模組 # 1. loading some good modules of iptables. # modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc" modules="iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack_ftp ip_conntrack_irc " for mod in $modules do testmod=`lsmod | grep "^${mod} " | awk '{print $1}'` if [ "$testmod" == "" ]; then modprobe $mod fi done # 2. 清除 NAT table 的規則吧! # 2. clean NAT table's rule iptables -F -t nat iptables -X -t nat iptables -Z -t nat iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT # 3. 開放成為路由器,且為 IP 分享器! # 3. NAT server's settings if [ "$INIF" != "" ]; then iptables -A INPUT -i $INIF -j ACCEPT echo "1" > /proc/sys/net/ipv4/ip_forward if [ "$INNET" != "" ]; then for innet in $INNET do iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE done fi fi # 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,可能是 MTU 的 問題, # 那你可以將底下這一行給他取消註解來啟動 MTU 限制範圍 iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu # 4. NAT 主機後端的 LAN 內對外之伺服器設定 # iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to 192.168.1.210:80 # WWW /*********************************** END OF C ******************************** */ 按照上面的方法配置完防火墙和NAT规则之后,执行该脚本文件 然后运行 #route -n 查看默认网关是否是ppp0的ip地址,若不是,则手动添加该默认网关,具体如下 用su命令切换到root用户 执行 #route add default gw "ppp0的ip地址(不包括引号)" 至此,服务器的NAT功能开启 /*********************************** D.局域网中客户端的配置 ****************** */ windows 客户端配置如下 网上邻居--右键-属性--创建一个新的连接--下一步--连接到我的工作场所的网 络--虚拟专用网络连接--公司名(随便写一个,如bupt) -下一步--vpn服务器选择(写上你要拨入的IP或域名,我们的服务器是59.64.154.187 )--完成 --填入你的用户名和密码(用户名:china,密码:beijing,为方便使用您最好在保存密 码打上勾)--连接。 linux 客户端配置 1.安装pptp client 2.运行pptp client,在图形界面中依次填入服务器名,服务器地址,用户名和密码 3.连接 /*********************************** END OF D ******************************** */ /********************************** E.Some Tips ****************************** */ 为方便VPN SERVER重启后能自动连接adsl,自动开启NAT服务,自动启动pptpd服务, 可将下列语句加入/etc/rc.d/rc.local文件中 #1.adsl connectting 2009/03/27 /usr/sbin/adsl-start #2.starting the NAT server and firewall settings 2009/03/27 /usr/local/virus/iptables/iptables.rule #3.change the level of SElinux to permissive 2009/03/27 /usr/sbin/setenforce 0 #4.starting pptpd server 2009/03/27 /usr/sbin/service pptpd start %%%%%%%%%%%%%%%%% 注意:SElinux可能会阻止pptpd程序对某些文件的写入,需要将其设 为permissive模式 %%%%%%%%%%%%%%%%% /********************************** END OF E ********************************* */ (责任编辑:IT) |