利用tb-tun让OpenVZ使用he tunnel broker的IPv6

参考文章:
IPv6 tunnel on OpenVZ
OpenVZ 通过tb-tun 使用HE IPv6 tunnel

先决条件:
1、安装git和gcc
2、申请一个he-ipv6隧道
3、需要支持tun,可以用以下方式来确认

cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state

如果显示No such device or address 或者是 Permission denied的话则为不支持,需要联系提供商开启,或者以下脚本“可能”有帮助

if ! [ -c /dev/net/tun ]; then
mkdir -p /dev/net
mknod -m 666 /dev/net/tun c 10 200
fi

保存为.sh后尝试执行一下再cat tun,如果正常则可以继续。

第一步:将tb-tun从git上拉下来然后编译

git clone https://github.com/acgrid/tb-tun
gcc tb_userspace.c -l pthread -o tb_userspace

第二步:配置&测试一下

setsid /root/tb-tun/tb_userspace he-ipv6 [Server IPv4 Address] [Client IPv4 Address] sit > /dev/null
ip link set he-ipv6 up
ip address add [Client IPv6 Address from HE-TunnelBroker like a:b:c:d::2/64] dev he-ipv6
ip link set dev he-ipv6 mtu 1480
ip -6 route add ::/0 dev he-ipv6
ip -6 route del default dev venet0
ip -f inet6 addr
ping6 ipv6.google.com
curl -6 ifconfig.co

只要ip配置上去并且通了就可以了。
这里有一个要注意的是:有些机器如果没有用vnet0:0方式把你的公网ip配置到你本地,而是只使用了venet0(也就是类似127.0.0.2的ip)的话,请把你的客户端ip修改为venet0的IP(也就是不写公网ip而是直接写类似127.0.0.2的ip)

第三步:上面的测试成功后配置一个自动启动

vim /etc/network/if-pre-up.d/ipv6tb

#参考文章当时使用的还是ifconfig方式,可以在系统启动的时候就被正常执行,而iproute2方式则需要放在这里,否则无法正常启动
#! /bin/sh
###BEGIN INIT INFO
# Provides:          ipv6
# Required-Start:    $local_fs $all
# Required-Stop:     $local_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the ipv6 tunnel
# Description:       ipv6 tunnel start-stop-daemon
### END INIT INFO
# /etc/init.d/ipv6tb
 touch /var/lock/ipv6tb
 case "$1" in
     start)
         echo "Starting ipv6tb with tb_userspace"
             setsid /root/tb-tun/tb_userspace he-ipv6 [Server IPv4 Address] [Client IPv4 Address] sit > /dev/null & sleep 3s #ugly, but doesn't seem to work at startup otherwise
             ip link set he-ipv6 up
             ip address add [Client IPv6 Address from HE-TunnelBroker like a:b:c:d::2/64] dev he-ipv6 #Add as many of these as you need from your routed /64 allocation
             ip link set dev he-ipv6 mtu 1480
             ip -6 route add ::/0 dev he-ipv6
             ip -6 route del default dev venet0
         ;;
     stop)
         echo "Stopping ipv6tb with tb_userspace"
             ip link set he-ipv6 down
             ip -6 route add ::/0 dev he-ipv6
             killall tb_userspace
         ;;
     *)
     echo "Usage: /etc/init.d/ipv6tb {start|stop}"
     exit 1
     ;;
 esac
 exit 0
chmod 755 /etc/network/if-pre-up.d/ipv6tb

/etc/network/if-pre-up.d/ipv6tb start

之后基本上就可以用了,可选配置一下ipv6的dns~

使用bird配置bgp网络互连

RT 借了一个asn和一个c段后,在vultr上学着配置了bgp互连和广播相关

其中涉及一些非技术向的内容,需要有一些耐心,系统依旧是debian 9 + root账号

1、申请广播
给vultr客服发工单,告知你要用bgp功能,他们会给你开通这个功能在你的面板上

拿到入口的url后,选择“我拥有私有asn”和“我拥有私有ip段”并输入你的as号和你的ip段落,并设置一个互连密码,然后写一封LOA(letter of authorization),模版如下:

AUTHORIZATION LETTER

今天的日期

To whom it may concern,

This letter serves as authorization for Vultr with 你的AS号 to announce the following IP address blocks:

你的ip段 / 你的as号

As a representative of the company Aiyun Technology Co.,Ltd that is the owner of the subnet and/or ASN, I hereby declare that I'm authorized to represent and sign for this LOA.

Should you have questions about this request, email me at 你的邮箱, or call: 你的电话

From,

你的名字
你的公司名
你的职位
你的电话

*(这个模版是vultr给我的,其他几家的话请自行向服务商索要,或者问清楚公司名后将vultr修改为你的提供商给你的名字)
用txt保存后,上传到附件上然后提交等待审核即可。

审核通过后,会在页面上显示两个确认身份的url,点击后会让你选择在whois上查询到的这个ip和这个asn的邮箱,选择后送信,然后等待邮件到达后,点击确认的链接确认即可。

确认完成后这一步就完成了。

2、配置广播

一般需要等待24-48小时,或者你发一个工单让他们提醒你,等他们通知你可用后,就可以开始配置了。

首先进入服务器的详情页面,最后面会多出来一个bgp选项卡,里面提供了vu的互连ip等信息,下面有一个配置模版可以打开(因为里面就是写好的配置文件,其实你直接复制都是可以的)

登陆服务器,安装bird

apt-get install bird

安装完成后先关闭掉服务

systemctl stop bird.service
systemctl stop bird6.service

然后修改配置文件

vim /etc/bird/bird.conf
router id <Instance里的ip>;

protocol bgp vultr
{
	local as <你的as号>;
	source address <Instance里的ip>;
	import none;
	export all;
	graceful restart on;
	multihop 2;
	neighbor <Vultr里的ip> as <Vultr里的as号>;
	password "<Vultr里的密码>";
}

protocol static
{
	route <你计划用的ip段>/24 via <Instance里的ip>;
}

protocol device
{
	scan time 5;
}

多台服务器的时候一定要提前规划好自己的ip划分并做好文档记录,要不然等以后再改会比较麻烦,用多少ip只需要修改static部分即可。

保存退出,然后启动bird

systemctl start bird.service

之后可以检查一下是否正常工作

birdc show proto all vultr

BIRD 1.4.5 ready.
name     proto    table    state  since       info
vultr    BGP      master   up     14:11:36    Established
  Preference:     100
  Input filter:   REJECT
  Output filter:  (unnamed)
  Routes:         0 imported, 581634 filtered, 1 exported, 0 preferred
  Route change stats:     received   rejected   filtered    ignored   accepted
    Import updates:         581674          0     581674          0          0
    Import withdraws:            2          0        ---     581675          0
    Export updates:              1          0          0        ---          1
    Export withdraws:            0        ---        ---        ---          0
  BGP state:          Established
    Neighbor address: 169.254.169.254
    Neighbor AS:      64515
    Neighbor ID:      169.254.169.254
    Neighbor caps:    refresh restart-able AS4
    Session:          external multihop AS4
    Source address:   203.0.113.123
    Hold timer:       208/240
    Keepalive timer:  57/80

(输出信息参考了vultr的官方docs:Configuring BGP on Vultr)
重点查看info应该是Established状态

之后进行系统里ip的配置

ip addr add <你的ip>/24 dev <你的网卡名字>

然后可以查看一下是否生效:

ip addr

如果里面有你刚才添加过的地址即为生效

然后就可以从公网ping一下看一看,正常情况下就已经通了

为了方便我们也可以直接写一个永久的到interfaces里面

vim /etc/network/interfaces
auto <网卡名>:1
iface <网卡名>:1 inet static
        address <你的ip>
        netmask <子网掩码>

完成后保存退出即可,可以直接用ifup立刻启动起来

以上就是配置的全部教程~

linux下指定访问某IP时走指定网口的方法

RT,因为正好应用上用得到,所以只好研究一番,搜了一下午搜不到资料,后来经过朋友暮雨菊苣的点拨找到了正确的姿势~
先说下背景:2台机器,姑且叫A和B。都是公网上的机器,且不在同机房(网段不同),机器A有两个公网IP(分别在eth0和eth1),B有1个公网网口。
要求是:访问机器B的公网IP是,走机器A的eth1口(不进行设置的话会走eth0)
这时候只需要用到route命令即可:

route add -host <机器B的IP> gw <eth1的网关>

回车即可,完事后可以直接输入route来显示一下当前的路由表,来确认一下是否加入到了里面
这里要注意,务必要用-host命令,我今天本来是找到了资料,但是却使用资料里面提到的-net命令,第二个下午犯的错是:找到的资料并没有告诉我gw后面要写什么,而我天真地写上了eth1的IP地址,而非eth1的网关,导致了路由生效后提示我直接找不到主机

使用socat做端口转发

由于工作需要,要部署一个minecraft的服务器(就是传说中的bilicraft~),部署好了后发现。。。狗日的江苏电信。。。南下到上海/广东方向的骨干有问题。。。只好做一个端口转发来让用户能顺利访问了
本来是打算用iptables来做的,结果发现了一个很神奇的问题,我自己的日本的服务器(就是现在blog用的这台)写好iptables后可以用,但是国内的服务器却不行,研究了2天,并不知道原因在哪里(主要是上面还有主站的业务,如果清掉所有的iptables重来的话我觉得我会死。。。)
于是自己google+请教了老大,得到了几个姿势:redir/socat/xinetd
总结了一下,发现了几个问题
redir:简单,但是不支持UDP,MC的服务端虽然很少见,但是仍然会用到UDP
socat:支持UDP,支持ipv6,只是老大的blog居然没写怎么用。。。我只好自己去搜(搜到后发现其实异常简单)
xinetd:功能强大,但是。。。好复杂,要写配置文件,反正只是mc,要求没那么高,没必要上这个
于是乎采用了socat
1、安装就不用说了,直接

apt-get install socat

2、起一个screen,没有的话安装一个

screen -S socat-tcp

3、起socat

socat TCP4-LISTEN:25565,fork TCP4:1.2.3.4:25565

其中:TCP4 #TCP端口ipv4协议
25565 #MC的端口,换成你要转发的端口即可
fork #多链接模式,当有一个人连上来后,复制一个同样的端口继续监听
1.2.3.4:25565 #目标IP和端口,不解释
按下回车后不会有任何提示,直接ctrl+ad退出这个screen即可,让他在后台静静的运行吧。。。
因为MC还需要一个UDP端口,然后重复2-3,TCP4改成UDP4然后起服务即可
这样就可以比较方便的弄好端口转发了~BC们的玩家又回到了流畅的日子了(笑