以前在学校里用的是移动网,每人都有公网ip(真是美滋滋)。现在换了电信网后反而只能得到一个内网ip了,比如我现在的网络中除了我自己的路由器,外面还夹着两个路由,过了这两个路由才是电信的路由,然后才到外网∠( ᐛ 」∠)_ 。这种状况想要正常地获得 eMule 的 HighID 实在困难。另外 easyMule 貌似是有 lowID 互相通讯的打洞功能,但是 easyMule 名声不好不想用。。正好手头也有 vps,于是准备用它来作映射。

这里介绍使用 vpn 来中继的方案。其实一开始我是准备用 frp 的,然而配置完后发觉并没有卵用,因为别人获取到你的 ip 仍然是电信的公网 ip,而不是你的 vps 的 ip,所以就换成 vpn 来。

vps 系统为 Centos 6 x86, 目前的 OpenVPN 版本为 2.4.4。

配置服务器

1、安装 openvpn easy-rsa

使用命令

yum install openvpn easy-rsa -y

安装 OpenVPN 和 easy-rsa。

2、配置 server.conf

复制模板配置

cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

启用数据包转发(去掉注释)

push "redirect-gateway def1 bypass-dhcp"

修改 dns(查找DNS并修改)

push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

修改权限(去掉注释)

user nobody
group nobody

3、生成证书

创建目录用于存放生成的证书

mkdir -p /etc/openvpn/easy-rsa/keys

复制 easy-rsa/2.0 目录下所有文件到 openvpn 目录

cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

打开 /etc/openvpn/easy-rsa/vars 文件并按需要修改其中的默认配置

export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="New York"
export KEY_ORG="DigitalOcean"
export KEY_EMAIL="sammy@example.com"
export KEY_OU="Community"
export KEY_NAME="server"            // 这个名称在生成证书时会用到
export KEY_CN=openvpn.example.com

生成证书,按顺序逐个执行命令

cd /etc/openvpn/easy-rsa
source ./vars                           // 初始化环境变量
./clean-all                             // 清除原有证书
./build-ca                              // 生成根证书ca.crt和根密钥ca.key
./build-key-server server               // 注意:中间会提示设置密码,输入即可
./build-key client1                     // 为客户端生成证书和密钥(这里有两个)
./build-key client2
./build-dh                              // 创建迪菲·赫尔曼密钥,会生成dh2048.pem文件
openvpn --genkey --secret keys/ta.key   // 生成ta.key文件(防DDos攻击、UDP淹没等恶意攻击)

复制证书

cp dh2048.pem ca.crt server.crt server.key ta.key /etc/openvpn

4、路由表

安装 iptables(一般都已安装)

yum install iptables-services -y
service iptable start
iptables --flush

设置并保存 iptables (注意备份),假设连接 vpn 后的 ip 为 10.8.0.x

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE    // 增加 -o <网卡> 参数会导致无法上网
iptables-save > /etc/sysconfig/iptables    // 保存设置

打开并配置 /etc/sysctl.conf,将

net.ipv4.ip_forward = 0
// 修改为
net.ipv4.ip_forward = 1

保存后重启网络服务

service network restart

5、设置端口转发

假定 eMule 的 TCP 和 UDP 端口分别为 5555 和 6666,vps 公网 ip 为 1.1.1.1,客户端连接 vpn 后得到的 ip 为 10.8.0.3, 分别执行

iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 5555 -j DNAT --to 10.8.0.6:5555
iptables -t nat -A PREROUTING -p udp -d 1.1.1.1 --dport 6666 -j DNAT --to 10.8.0.6:6666
iptables-save > /etc/sysconfig/iptables

完成两个端口转发规则的添加,这里只需要设置入站的转发即可,一开始我把出站的也加上了,通讯一直有问题,浪费了不少时间∠( ᐛ 」∠)_。查看 iptables 设置状态使用命令

iptables -nL -t nat --line-numbers
// 或
service iptables status

iptables 的默认策略是 ACCEPT , 所以不用特意添加端口的入站规则。

6、分配固定 ip

因为模板规则里默认是启用客户端地址关联的(ifconfig-pool-persist ipp.txt), 所以服务器会按照记录为客户端分配上一次的 ip。

7、启动 openvpn

service openvpn start

8、设置开机自启动

chkconfig openvpn on

至此服务器的设置完成,接下去设置客户端。

配置客户端

1、在 windows 上安装客户端

下载

2、复制客户端证书

安装完成后将服务器上生成的客户端证书复制一份到安装目录的 config 子目录中。客户端证书(在 /etc/openvpn/easy-rsa/keys 目录中)包含 ca.crt、ta.key、client.crt 和 client.key 四个文件。

3、修改客户端配置

首先从客户端安装目录下的 sample-config 中复制 client.ovpn 到 config 目录中。修改配置文件

client

dev tun
proto udp
remote 1.1.1.1 1194     // 改为实际的 ip 和端口
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt        // 文件名一致
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3

4、启动客户端

运行后右键单击客户端任务栏图标,选择连接即可。如果一切顺利,客户端会提示连接成功。

附:
OpenVPN 配置
iptables 介绍