用 iptables 实现端口映射

由于我这里是几台 Windows 连接网关通过ADSL共享上网的,网关为 Archlinux ,单网卡,有两个网络接口,eth0链接内网,地址192.168.1.2;ppp0为ADSL拨号连接,地址自动分配,内网网段为 192.168.1.0/24 。
下图为物理拓扑图

物理拓扑图

比如内网上的pc1这台机想要BT下载,由于p2p的工作原理,我们必须在网关上打开到pc1的端口映射,这里假设pc1的ip地址为192.168.1.11,bt下载端口为11197。

# iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 11197 -j DNAT --to-destination 192.168.1.11:11197
# iptables-save -c > /etc/iptables/iptables.rules(这条命令不能用sudo,可以先执行su命令。不执行这条命令的后果是重启机器后要重新执行上一条命令)

就是这么简单,你现在已经打开了pc1的端口映射,而电驴的 HighID 问题也可以参考这个方法。附上一张内网BT下载的截图。(为啥我的下载速度这么慢?大家都限速了??)

utorrent-2008-07-25.JPG

HowTo:搭建家用下载&路由服务器

其实这篇文章不能说是 HowTo ,最多只能说是我自己的安装笔记而已。该服务器主要用来下载和实现共享上网,有空还可以用它来研究iptables。整个系统没有鼠标键盘显示器,全都日常维护都是用SSH进行,所以使用了密钥的验证方式确保安全。下载方面用mldonkey实现,通过局域网内其他电脑用网页方式管理,唯一的不足是对BT下载支持不够。由于服务器基本上都是24小时运作的,所有在上面弄了个dnsmasq,实现DNS缓存和DHCP,局域网的其他机器ip都是自动获取,接上网线就能上网,十分方便。

先说说用到的软件

  • ArchLinux
  • ssh
  • iptables
  • dnsmasq
  • mldonkey

ArchLinux
选择安装包时只选择 base 组,加上 support 组中 re-pppoe,sudo,iptables等几个包,安装一个最小系统。安装完后运行

# pacman-optimize
# sync
# pacman -Syu mldonkey dnsmasq

ssh
为了安全,我这里设置了只允许用密钥验证,以下是我的 /etc/ssh/sshd_config 文件的内容

Port 22
ListenAddress 0.0.0.0
Protocol 2

KeyRegenerationInterval 1h
ServerKeyBits 768

LoginGraceTime 2m
PermitRootLogin yes

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no

ChallengeResponseAuthentication no
UsePAM yes
Subsystem sftp /usr/lib/ssh/sftp-server

iptables
由于服务器上只有一张网卡连接到交换机,再通过交换机连接到 ADSL Modem 上,所以需要共享服务器上的ppp0链接让局域网上的其他机器上网。

# iptables -F INPUT
# iptables -F FORWARD
# iptables -F POSTROUTING -t nat
# iptables -t nat -F
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
# iptables-save -c > /etc/iptables/iptables.rules

dnsmasq
这个主要是用来做 dns 缓存和 dhcp 服务,参考了 firefoxmmx 写的这篇教程《提高ADSL(pppoe)上网速度

# vi /etc/dnsmasq.conf

找到下面这一项

#resolv-file=

用下面的一条语句替换

resolv-file=/etc/resolv_dnsmasq.conf

将下面两句前的注释符号删除

interface=eth0
dhcp-range=192.168.1.10,192.168.1.20,255.255.255.0,24h

创建新的dns配置文件,把自己常用的DNS添加到/etc/resolv_dnsmasq.conf中

# cp /etc/resolv.conf /etc/resolv_dnsmasq.conf

编辑 /etc/ppp/pppoe.conf

# vi /etc/ppp/pppoe.conf

找到下列一行

PEERDNS=NO

并在该行下面添加

DNS1 = 127.0.0.1

mldonkey
这里要注意 mldonkey 默认只允许 127.0.0.1 访问,要首先设置允许其他网段访问。~/.mldonkey/downloads.ini 文件的第37行就是设置的地方。再配合《导入 amule/emule 的设置到 Mldonkey》和《让 MLDonkey 导入 amule/emule 的临时文件》两篇文章,驴子基本上能全速运行了,如果你遇到中文文件名变成下划线的问题,可以参考这篇文章《 解决 Mldonkey 中文文件变下划线问题 》。

最后启动服务
# /etc/rc.d/iptables start
# /etc/rc.d/sshd start
# /etc/rc.d/samba start
# /etc/rc.d/dnsmasq start
# /etc/rc.d/mldonkey start

或者编辑 /etc/rc.conf 文件,添加到 daemon 段中。

ok,收工,enjoy it。

解决 Mldonkey 中文文件变下划线问题

用了 Mldonkey 一段时间了,对他的速度很满意,决定以后也将继续使用下去,但是对他的中文文件名变成下划线这个问题一直很苦恼。今天 Google 了一下,根据这篇文章,找到了个比较满意的解决方法,这里记录下面。我使用的系统是 ArchLinux ,Mldonkey 版本是 2.9.5 。

网上盛传的那个 Unicode 的补丁其实在 2.9 的版本上已经自带有了,不用打补丁编译的,但是即使用上现在最新的 2.9.5 版也一样会有下划线问题,真正解决问题的关键是设置运行 mlnet 的用户的 LANG 和 LC_ALL 环境变量为 zh_CN.UTF8。

首先新建 /usr/bin/mlnet.sh 文件,写入以下内容

#!/bin/bash
export LANG=zh_CN.UTF8
export LC_ALL=zh_CN.UTF8
/usr/bin/mlnet & > /tmp/mldonkey.log &

然后编辑 /etc/rc.d/mldonkey 文件,查找到下面的内容

su $MLDUSER -c "/usr/bin/mlnet &> /tmp/mldonkey.log &"

更改为以下内容

su $MLDUSER -c "/usr/bin/mlnet.sh &"

保存,现在重启 mldonkey
sudo /etc/rc.d/mldonkey restart

过段时间查看那些下载完成的文件,你会发现文件名不会再有下划线了,问题解决。

(6月20日补充)
这个是经过一个晚上下载后的截图,图中的第一部分是应用该方法前下载到的文件,中文部分都变成了下划线,而第二部分是昨天晚上下载的,已经解决了中文文件名的问题。

mldonkey-chinese-problem-2008-06-20.JPG

导入 amule/emule 的设置到 Mldonkey(2008-06-18更新)

由于电驴下载不同于 BT ,有一个积分系统,每个人都有一个两个(ed2k 和 kad 网络各一个)独一无二的 ID(Userhash,不是那个名字),只要你上传的东西多了,你存放在别人的积分也就高了,你下载时排队也就能排在靠前的位置,自然下载的速度也会快起来。但是为了防止作弊的情况,自己的积分不是保存在自己的机器上,而是分别保存在互联网上其他的客户上,而那些客户就是靠这个 ID 来识别你的,所以这个 ID 是十分重要的,自己用了几年的 id 就这样丢了,很心疼的。以前我也写了篇将 emule 的设置导入到 amule 的文章,而现在使用 Mldonkey 后很有必要将以前使用 amule/emule 时所使用的 ID 导入进来,再将临时文件导入 Mldonkey 中,基本上可以抛弃 amule/emule 了。

  • emule 的个人 ID 存放在 安装目录 /config/cryptkey.dat 文件下
  • amule 的个人 ID 存放在 ~/.amule/amule.conf 文件的 [Statistics] 字段下
  • emule 和 amule 可以双击界面右下角那个地球形状的图标查看自己 ed2k 和 kad 的 Userhash
  • mldonkey 的个人 ID 存放在 ~/.mldonkey/donkey.ini 文件的 client_private_key 值下
  • mldonkey 的 ed2k Userhash 存放在 ~/.mldonkey/donkey.ini 文件的 client_md4 值下,kad Userhash 存放在 Kademlia 的 md4 值下

知道路径后就好办事了 ,首先确保已经关闭了 mldonkey ,然后将对应的内容复制到 mldonkey 下的 donkey.ini 中,具体位置在 ~/.mldonkey/donkey.ini ,然后启动 mldonkey ,现在可以享受高速下载了。这里推荐大家直接用 web 来管理 mldonkey,比一直开着 GUI 要好,还省资源。管理地址是:http://localhost:4080/

让 MLDonkey 导入 amule/emule 的临时文件

问题的由来是在使用 MLDonkey 进行电驴下载时,即使已经把 MLDonkey 的 Temp 目录指向 amule/emule 的 Temp 目录,发现 MLDonkey 仍然无法继续 amule/emule 的下载。Google 一下,发现原来是 MLDonkey 使用一种不同于 amule/emule 的方法来存储临时文件,其实 MLDonkey 也能很方便的导入 amule/emule 的临时文件到自己的列表中。最简单的方法就是使用 telnet 登录 MLDonkey ,执行一条命令既能解决问题。方法如下

首先确保你已经打开了 MLDonkey ,然后在终端执行 (MLDonkey 的默认 telnet 端口是 4000)

telnet 127.0.0.1 4000

当出现下列提示时

[suxixb@Su ~]$ telnet 127.0.0.1 4000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Welcome to MLDonkey 2.9.4
Welcome on mldonkey command-line

Use ? for help

MLdonkey command-line:
>

输入

import_temp /media/sda7/eMule/Temp

这样就能把 /media/sda7/eMule/Temp 目录下的临时文件导入到 MLDonkey 了,输入

quit

退出 telnet 登录

下面是一些 MLDonkey 比较常用的 telnet 命令

  • vd ==> 查看当前正在下载的文件
  • vm ==> 查看当前已链接到哪些服务器
  • c ==> 链接更多的服务器
  • s 关键字 ==> 搜索含有“关键字”的内容
  1. 订阅

    • 订阅 我的 Blog
    • Feedsky 订阅数
    订阅到iGoogle或Google Reader 订阅到鲜果 订阅到抓虾 订阅到飞鸽 订阅到Bloglines 订阅到我的雅虎 订阅到NetVibes 订阅到Newsgatar 订阅到Rojo 订阅到网易有道 通过哪吒订阅到MSN,Gtalk,Skype 订阅到QQ邮箱
     

  2. 重要公告

    目前该博客(www.shareitem.org,以下简称该博客)是建立在Yo2优博网上的,由于一些众所周知的原因,本人(suxixb)决定于2008年8月1日起陆续将该博客上的所有文章转移到新网站上,地址为http://shareitem.org,并改名为ShareItem.org(简称siog),原来的订阅地址(feed.shareitem.org)将保持不变,可继续使用。在转移成功后,该博客仍然保留到到期为止(2008年11月18日),在到期后,将不能再通过www.shareitem.org来访问该博客,本人也不在该博客上进行更新和发布文章,所有的新文章将统一在新网站上发表。谢谢各位的支持。

  3. 最新评论

  4. 最新日志

  5. 阅读共享

  6. 标签

  7. 存档

  8. Logo