Linux 系统使用 HTC Internet pass-through

HTC 手机有三种类型的 Tether:Usb Tether (使用 USB 连接线使得PC通过手机上网)、Wifi Tether (使用 Wifi 连接使得PC通过手机上网)、Usb Internet pass-through (通过 USB 连接线使用手机通过PC上网)。

Usb Tether 在 Linux 系统上的支持很好,只要内核编译了 rndis_host 模块,PC上就会多出一个网络接口,手机将会通过 DHCP 协议为接口分配地址,设置网关与 DNS 等等。Wifi Tether 就更简单一些,基本上等同于 Usb Tether。

Usb Internet pass-through 就显得复杂了一些,基本的工作原理是这样的,在手机端启用这个模式后与 Usb Tether 类似,PC上就会多出一个网络接口(这时需要配置PC的网络管理器只使用 DHCP 协议分配地址,而不需要设置网关与DNS等等),手机将需要 PC 给它提供网关与 DNS 服务。在 PC 端完成这些服务的启动工作后,要通过激活协议,通知手机已经完毕,然后向手机端的 IP:6000 地址端口对发送一个 UDP 协议的激活指令,手机收到后即会使用这个命令的源地址作为网关与DNS服务器。

网关服务在 Linux 系统中非常容易实现的,两条命令即可完成:

sudo sysctl net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # ppp0 是 PC 端 Internet 出口网络接口名称

DNS 服务在 Linux 系统中也有很多实现,不过如果是访问 Internet 的话,还是使用 Iptables 转到 8.8.8.8 解决更简便:

sudo iptables -t nat -A PREROUTING -i usb0 -p udp -m udp --dport 53 -j DNAT --to-destination 8.8.8.8:53

最后是一个简单的 htcnat 激活程序:https://github.com/heiher/htcnat

这个程序有一个参数 -a,即是指令手机的 IP 地址,这个地址可以通过 usb0 接口的 DHCP lease 信息表中获得或是查看 arp 表(/proc/net/arp),属于 usb0 接口的记录应该只有一条,即是手机的地址。如果是使用的 NetworkManager,那个就:

ps aux | grep usb0
# Example
cat /var/lib/dhclient/dhclient-701960d9-cad4-4f6d-acd9-fdc40a0ff89f-usb0.lease
# option dhcp-server-identifier 192.168.99.200; 即是手机的IP

PHONE_IP=`grep -e "usb0" /proc/net/arp | grep -oP "\d+\.\d+\.\d+\.\d+"`
 
./htcnat -a ${PHONE_IP}

Over!

启用 ArchLinux 中 GNOME 3.6 的 IBus 集成

出于很多脑C的考虑,ArchLinux 系统集成开发者将 GNOME 3.6 的 IBus 集成给默认关闭了,导致很多使用 IBus 输入法框架的用户处在痛苦之中,更有脑C的人给出两种更脑C的建议,要么换输入法,要么就别用 GNOME 了,否则看上去好像这个问题就无解了!

不管这些人出于什么样的目的,诱导用户向错误的方向前进。作为 GNOME 和 IBus 的用户,有责任给出简单的解决方式:重新编译 gnome-settings-daemon,首先创建一个编译目录 gnome-settings-daemon,然后从 archlinux 的 git 仓库下载到 PKGBUILD 等文件,再去除 PKGBUILD 的 –disable-ibus,最后 makepkg 重新编译、打包并安装。

Over!

SSH using a SOCKS or HTTP proxy

If you follow planet debian, you may already know about the ProxyCommand directive in $HOME/.ssh/config. It allows OpenSSH to connect to a remote host through a given command.

One setup that I use a lot is to have connections be established through a SOCKS proxy. Until today, I was using connect, a small tool written by Shun-ichi Gotô. The typical setup I used is:

    Host *.mydomain.com
    ProxyCommand connect -S socksserver:1080 %h %p

I also use jump hosts occasionally, with a setup like this:

    Host somehost.mydomain.com
    ProxyCommand ssh otherhost.mydomain.com nc -w1 %h %p

And today I discovered that netcat-openbsd does support connexions through a proxy, either SOCKS or HTTP. Why keep using two different tools when you can use one? 😉 So I changed my setup to:

    Host *.mydomain.com
    ProxyCommand nc -xsocksserver:1080 -w1 %h %p

The default is to use SOCKS 5, add -X4 for SOCKS 4 and -Xconnect for HTTP CONNECT proxies. Note that it doesn’t support choosing which end does the name resolutions like connect does with the -R option.

From: http://glandium.org/blog/?p=223

Over!