linux的tcp_forward的使用

我服务器在国外,上海电信从刚开始的流畅访问慢慢变成了现在的60%+的丢包!!!大概跟 踪了下路由的节点。明显是上海电信到骨干网在捣乱,而从北京电信(机房)访问的几乎就 不丢包了,上海电信到北京电信的访问是稳定且非常快速的。这让我的小脑瓜激动了不少。

ssh不是那什么可以做端口转发么,linux说不定也可以,于是在网上随便一找,果然支持 tcp_forward啊,执行下下面的内容:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 8388 -j DNAT --to-destination US_VPS_IP:8388
iptables -t nat -A POSTROUTING -p tcp -d US_VPS_IP --dport 8388 -j SNAT --to-source JAPAN_VPS_IP

添加执行,然后本地的ip指向北京电信的ip, 立马访问流畅了不少

亚马逊主机被墙的一些反思

今天发现的亚马逊主机被墙,后来思考了一下,考虑从技术处识别的破绽,觉得原来的方案 有问题,特记录如下,以作教育。

在这台主机上, 主要开通了下面的服务:

服务 端口 备注
openvpn 10122  
ssh 22 远程登录
dns 10153 仅支持持tcp查询
shadowsocks 8080 用于翻墙

关于openvpn服务

所有的客户端不会主动连接这个服务,我在国内主机上创建了一个到这个服务器上的ssh代 理连接,连接到国内的服务器上,所有客户端使用代理的方式,连接到远程主机上,这个很 少用,流量也不大,因此问题可能不大。我曾经考虑过由远程主机主动发起,但openvpn的 客户端似乎有问题,反正没成功,不了了之了。

ssh服务不用说了,一般不会因为这个封吧。

shadowsocks服务采用的是aes-256-fb,自定义密码,应该也没问题。

剩下的就是dns了,在很早之前,我用的是韩国的dns,然后有一天发现韩国的dns不返回任何 内容了,而这个dns没有打开ICMP,因此无法ping成功,不返回任何有用的查询说不定是因 为被墙了。然后我就用了一段时间的google dns,问题在于google 的dns速度太慢了(其实 我的这个理解是错误的,使用google dns的时候其实是走了代理的)。后来考虑速度,就在 亚马逊的主机上添加了pdnsd的服务,然后本地的pdnsd指向这个服务器。大概用了一个月的 样子,被封了。

在所有的流程中,除了pdnsd的查询没有被加密外,其他的内容都是被加密的,而tcp dns的查询, 无论是从特征识别还是关键字过滤,都是可以被发现的,因此被墙也就不难理解了。

openwrt相关配置(1):软件列表及杂项配置

先记录在这里,以后有了新的再更新:

       opkg update
       opkg install
bash   #shell
blkid   #查看磁盘ID,挂载磁盘使用
block-mount #挂载磁盘
coreutils
coreutils-ls #emacs需要
coreutils-stty #emacs需要
curl           #下载
ddns-scripts #动态dns
fdisk        #察看磁盘分区
kmod-fs-ext4 #U盘分区格式支持
kmod-gre     #vpn分流使用
kmod-mppe    #pptp vpn使用
kmod-nls-base #忘了,好像是文件系统依赖
kmod-nls-utf8 ##忘了,好像是文件系统依赖
kmod-ppp      #vpn使用
kmod-pptp     #vpn使用
kmod-scsi-core #挂载磁盘
kmod-usb-core  #挂载磁盘
kmod-usb-ohci  #挂载磁盘
kmod-usb-storage #挂载磁盘
kmod-usb-storage-extras #挂载磁盘
kmod-usb2               #usb2.0 挂载磁盘
luci-app-ddns           #网页配置ddns
luci-app-samba          #网页配置samba服务器
luci-app-upnp           #网页配置upnp服务
luci-i18n-chinese       #网页中文语言支持
miniupnpd               #upnp支持
mysql-server            #mysql服务器
nginx                   #nginx http服务器
openssh-keygen          #openssh服务器需要
openssh-server          #openssh服务器,关键是支持端口转发等可用来翻墙的功能
openssh-sftp-server     #openssh自带的sftp服务
php5                    #php5
php5-fastcgi            #php5-fastcgi,nginx需要
php5-mod-ctype          #php模块
php5-mod-curl           #php模块
php5-mod-exif           #php模块
php5-mod-fileinfo       #php模块
php5-mod-ftp            #php模块
php5-mod-gd             #php模块
php5-mod-gettext        #php模块
php5-mod-hash           #php模块
php5-mod-iconv          #php模块
php5-mod-json           #php模块
php5-mod-libevent       #php模块
php5-mod-mbstring       #php模块
php5-mod-mcrypt         #php模块
php5-mod-mysql          #php模块
php5-mod-openssl        #php模块
php5-mod-session        #php模块
php5-mod-sockets        #php模块
php5-mod-xml            #php模块
php5-mod-xmlreader      #php模块
php5-mod-xmlwriter      #php模块
php5-mod-zip            #php模块
ppp-mod-pptp            #vpn的pptp模式
samba36-server #nfs服务器
subversion-client #subversion库,定时检查hosts文件的脚本需要使用subversion
subversion-libs #subversion库,定时检查hosts文件的脚本需要使用subversion
swap-utils #swap分区工具
vsftpd #ftp服务其
zlib #压缩与解压做
zoneinfo-asia #亚洲区域支持
zoneinfo-core #php需要
       

软件的各部分功能就像注释中所写,里面最多的就是php部分了,一些模块并不是必须的,只是我有时会随便检查一下什么的,就将常用的都安装了。

安装完软件最好直接重启下,相关服务先都不要启用。

ssh服务器的相关配置

修改dropbear服务器的端口为非22端口(/etc/dropbear),因为我使用openssh服务器,而不是自带的。

修改openssh服务器配置(/etc/ssh/sshd_config),添加GatewayPorts yes和Compression yes两项,前一个打开端口转发,后一个启用压缩,可以提高传输速度

http服务器相关配置

修改uhttpd服务器的端口为非80端口(/etc/uhttpd),因为我要将nginx的服务器作为主要使用的http服务器

其他的零碎配置根据自己需要了。

关于翻墙的配置可参照《openwrt vpn自动分流翻墙》

我用的是Buffalo WZR-HP-AG300H,如果刷成了砖,可参照《openwrt的一些设置》

如果网络像我现在的网络一样的非常频繁的抽风,可修改/etc/ppp/options中的lcp-echo-failure和lcp-echo-interval两个值,默认分别为5和1,这样的话,如果网络卡住5秒钟的话,路由器就会判断掉线,进行重播,增大这两个值其实是降低判断的严格性。

openwrt vpn自动分流翻墙

将openwrt的相关配置记录下来,防止下次找不到。理论上而言,vpn连接上之
后的设置都是通用的。我用的是支持pptp的vpn。

  • 安装pptp模块
    opkg update
    opkg install ppp-mod-pptp kmod-pptp kmod-mpe kmod-gre
    
  • 添加vpn网络接口及配置
    vi /etc/config/network
    config interface 'tun0'
            option ifname 'pptp-vpn'
            option proto 'pptp'
            option server 'x.x.x.x'
            option username 'xxxx'
            option password 'xxxx'
            option peerdns '0'
            option metric '2000'
    
    config route
            option interface 'tun0'
            option target '1.2.3.4'
            option gateway '10.3.4.1'
    
    config route
            option interface 'tun0'
            option target '2.3.0.0'
            option netmask '255.255.0.0'
            option gateway '10.3.4.1'
    
    

    第一段是添加一个名字为tun0的网络接口,拨号协议时pptp。peerdns为0表示
    使用默认的dns服务器,不是用vpn获取到的dns服务器。由于我只是指定固定的ip
    通过vpn访问,所以就这样配置了。

    第二段和第三段是指定通过vpn的网络规则,分别对应单独的一个IP和一个范
    围的IP.

  • 如果vpn服务器不支持加密的话,需要注释掉以下文件的一行:

    vi /etc/ppp/option.pptp
    #mppe required,no40,no56,stateless
    
  • 经过上面的设置,重启完路由器,路由器应该就可以连上vpn服务器了,并且,在路
    由器中检查流量的走向的时候,将会是正确的,但局域网中的电脑却还是默认的路
    径。
  • 使用以下的命令,使局域网中的电脑也可以按照路由器的规则进行分流:

    iptables -I FORWARD -o br-lan -j ACCEPT #允许br-lan端口流量被转发
    iptables -I FORWARD -o tun0 -j ACCEPT #允许tun0端口流量被转发
    iptables -t nat -I POSTROUTING -o tun0 -j MASQUERADE #tun0出口的流量SNAT出去
    
  • 设置防火墙规则,这一步是否必要没去验证,反正我是一路设置下来,到了最后一
    检查可以了,就这么用着了。

    vi /etc/config/firewall
    config zone
            option forward 'ACCEPT'
            option output 'ACCEPT'
            option name 'vpn'
            option network 'tun0'
            option masq '1'
            option mtu_fix '1'
            option input 'REJECT'
    
    config forwarding
            option dest 'vpn'
            option src 'lan'
    
    
  • 以上大部分都可以通过web页面设置,只是通过shell的话我觉得更清楚些,也
    懒得截图额。

    如果vpn服务器是国外的话,那么恭喜咯,局域网中的电脑可以自动按照规则翻
    墙了,当然,你也可以用来做电信和网通的加速使用。

    PS: 相同的文章写两遍就是痛苦啊,明明昨天写了一次,结果在emacs中不小心
    按了将alt将ctrl键用了,弄的找也找不回来。不熟悉的键盘配置就是麻烦啊。

    修改路由器host自动翻墙

    国内需要修改多种方式翻墙,目前使用gae的方式,但有些时候比较慢,不支
    持其他的方式,因此想通过host的方式来进行。

    路由器的配置文件中附加主机文件添加正确的host文件,这样在名单中的就不
    用查询dns了。

    这种方式比较麻烦的是正确host文件的获取,我将这个更新添加到了计划任务
    中,每天晚上的时候更新。以下是更新用到的脚本命令:(我将host保存在/root
    中)

     #!/bin/sh
     cd /root && svn checkout http://kakarot.googlecode.com/svn/hosts &&
     /etc/init.d/dnsmasq restart
     

    dnsmasq的重启不会影响到正在使用的网络,因此,理论上什么时候都可以,
    通过此种方式也可以屏蔽广告