IPv6 地址处理时的小 Bug

众所周知,IPv6 地址中可以用 ::  来省略一连串的 0,于是,在某些情况下,如果 0 被过度合并了,就会导致地址解析的问题。

最近在 AWS 上启用 IPv6 的时候就遇到了这个情况,AWS 分配给我的地址段是:

2406:da14:5c9::/56

可以看出,AWS 实际给我分配的地址是:

2406:da14:5c9:0000::/56

但是由于连续 0 的省略策略,导致 5c9 之后的真正可以被划分的部分被省略了。于是在 AWS 的系统中,子网划分页面就显示成了这样:

2406:da14:5__::/64

按照正常逻辑应该是这样:

2406:da14:5c9:00__:/56

结果当然就悲剧了。这里我除了填 c9 之外,任何的值都会导致划分出的子网不在上面的地址段内,导致划分失败。

所幸的是 AWS 的系统可以随意的解绑地址段,然后重新分配。于是重新分配之后就好了。

不过这里也是对我们的一个提醒:由于 IPv6 地址书写的特殊性,连续 0 会被缩写,那么在进行地址读取和判断的时候,就一定要先做 ::  的展开,再去做判断哦。

 

编译安装rtorrent并添加IPv6支持

本文章安裝方式參考下面這篇文章,
http://filesharefreak.com/2010/02/13/how-to-install-rtorrent-rutorrent-using-socket-ssl-authentication-on-ubuntu-or-debian/
其實只能算是該篇文章的部份中譯, 並補上 IPv6 的支援,
IPv6 部份參考
http://libtorrent.rakshasa.no/ticket/1111
http://ihipop.info/2010/08/1363.html
(1) 先連上 SSH 並以 root 的身份開始進行安裝
su root
(2) 更新 apt 資料庫
apt-get update
(3) 安裝相依套件
apt-get install -y build-essential pkg-config libcurl4-openssl-dev libsigc++-2.0-dev libncurses5-dev lighttpd screen subversion libterm-readline-gnu-perl php5-cgi apache2-utils php5-curl curl php5-cli
(3) 安裝 libtorrent
cd ~
wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.12.6.tar.gz
tar zxfv libtorrent-0.12.6.tar.gz
cd libtorrent-0.12.6
wget http://home.samfundet.no/~sesse/libtorrent-0.12.6-ipv6-07.patch
patch -p1 < libtorrent-0.12.6-ipv6-07.patch ======================== 修改 libtorrent 程式碼 libtorrent-0.12.6/rak/string_manip.h 第186行:由 return 'A' + v - 0xA; 改為 return 'a' + v - 0xA; ======================== ./configure --enable-ipv6 make make install (4) 安裝 XMLRPC-C cd ~ svn checkout http://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/stable xmlrpc-c cd xmlrpc-c/ ./configure make make install (5) 安裝 rTorrent: cd ~ wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.8.6.tar.gz tar zxfv rtorrent-0.8.6.tar.gz cd rtorrent-0.8.6 wget http://home.samfundet.no/~sesse/rtorrent-0.8.6-ipv6-07.patch patch -p1 < rtorrent-0.8.6-ipv6-07.patch ./configure --with-xmlrpc-c --enable-ipv6 make make install (6) 接下來為了讓 rtorrent 能夠開機就自動執行,需要作下面的動作 vim /etc/init.d/rtorrent.sh 將下面的文字寫到 /etc/init.d/rtorrent.sh 將 snowwolf725 改成你自己的使用者 ID =========================== #!/bin/sh case "$1" in start) echo -n "Starting rtorrent" su - snowwolf725 -c "screen -A -m -d -S rtorrent /usr/local/bin/rtorrent" & echo "." ;; stop) echo -n "Stopping rtorrent" ppid=`ps ax | grep "/usr/local/bin/rtorrent" | grep -v grep | grep -v screen | awk '{ print $1 }'` kill ${ppid} rm /tmp/rpc.socket echo "." ;; restart) echo -n "Restarting rtorrent" ppid=`ps ax | grep "/usr/local/bin/rtorrent" | grep -v grep | grep -v screen | awk '{ print $1 }'` kill ${ppid} rm /tmp/rpc.socket sleep 1 su - snowwolf725 -c "screen -A -m -d -S rtorrent /usr/local/bin/rtorrent" & echo "." ;; *) echo "Usage: {start|stop|restart}" >&2
exit 1
;;
esac
exit 0

==============================
讓該檔案變成可以執行
chmod +x /etc/init.d/rtorrent.sh
(7)換成一般使用者的身份, 這裡的 snowwolf725 要換成你自己的使用者名稱, 要先更新函式庫 cache
ldconfig
su snowwolf725
cd ~
(8) 設定 rTorrent
vim .rtorrent.rc

依照下面的設定檔改成自己可以用的設定檔#開頭的那幾行是註解可以不用打, vim 有分編輯模式和命令模式,一開始進入是命令模式,按 i 或是 a 可以進入編輯模式打字,按 ESC 可以離開編輯模式回到命令模式,輸入 [:w](不包涵中括號,即冒號和w) 然後按下 Enter 可以寫入檔案,[:q!] 按下Enter 可以離開畫面, 其實檔案可以先打好命名成 .rtorrent.rc 利用 PPutty (不是putty)上傳到主機就可以了(上傳方法是開啟 pputty 並登入然後將檔案拖曳到 pputty,會詢問你帳號密碼傳完預設在家目錄下面)
主要需要修改的是
各個 rtorrent 的目錄
===================================
# 最大最小連接數
min_peers = 50
max_peers = 100

# 最大最小連接數(對於已經完成下載的種子)
min_peers_seed = 10
max_peers_seed = 100

# 最大同時上傳的連接數
max_uploads = 50
# 檔案名稱編碼
encoding_list = UTF-8
# 上下傳 ratio (0表示不限)
download_rate = 0
upload_rate = 0

# 存放下載檔案的路徑
directory = /home/snowwolf725/data
# rtorrent 的工作目錄
session = /home/snowwolf725/session

# 每五分鐘查看特定目錄並下載新的種子
schedule = watch_directory,5,5,load_start=/home/snowwolf725/watch/*.torrent

# Server 的 IP 和 Domain name (IPv6 不能綁 IPv4 的 address)
# ip = 1.2.3.4
# ip = ks00000.kimsufi.com
# bind = 1.2.3.4
# rtoreent 所使用的 port
port_range = 49152-65535
# 是否使用 udp 的 Tracker
use_udp_trackers = yes
# 連線加密(允許加密連線連入,但預設使用未加密連線)
encryption = allow_incoming,enable_retry,prefer_plaintext
# 依照種子設定決定是否開啟 DHT
dht = auto

# DHT 的 port
dht_port = 19000

# 是否開啟 peer exchange 功能(開啟)
peer_exchange = yes
umask = 0000
on_erase = rm_complete,”execute=rm,-rf,$d.get_base_path=”
schedule = low_diskspace,5,5,close_low_diskspace=100M

# 不作 hash 檢查檔案完整性
check_hash = no

==============================
(9) 測試 rtorrent
執行 rtorrent
這樣就完成了, 按 Ctrl+q 可以離開 rtorrent

 

PS,Ubuntu经过这种方式安装启动rtorrent可能会报错说找不到libtorrent这个库。此时将/usr/local/bin/rtorrent复制到/usr/bin/下,将/usr/local/lib/libtorrent.so.11和/usr/local/lib/libtorrent.so.11.0.6复制到/usr/lib/下再启动rtorrent即可。