用 CentOS 7 纯手工打造属于自己的软路由服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 CentOS 7 纯手工打造属于自己的软路由服务器相关的知识,希望对你有一定的参考价值。

参考技术A 传送门:

自从了解了软路由这玩意之后,它强大的性能以及高自由度就一直让我羡慕不已。

但是作为“懂” Linux 以及计算机网络的我来说,如果直接使用现成的软路由系统总感觉低估了自己的能力……而且我家里也已经有了一台 Linux 服务器,要是能做到物尽其用那就最好了。

于是我很早就计划着搭建一台属于自己的软路由服务器。可惜由于懒癌发作,一直没有动手。直到半个月前,家里的旧路由器终于坏了,这时候我才着手去研究它……

前前后后折腾了一整天,总算是完工了!感觉收获了不少东西。想想还是很有必要把整个配置过程整理完然后给大家分享一下!

本文纯属个人学习经验分享,写得可能会比较乱,仅供参考。如有错误,可以的话请及时提出,谢谢!

由于我的服务器上只有一个网口,所以必须配合划分了 VLAN 的交换机,把它当作一台单臂路由才能实现上述功能。

下面我划分了三个 VLAN:

以下是交换机端口及 VLAN 的配置表:

以下是服务器网络接口的配置表:

至于“外网”的访问,由于我的云主机流量充足,所以我使用「绕过大陆 IP」模式。

「双 S」-local 监听的地址和端口为 0.0.0.0:1080 , 「双 S」-redir 监听的地址和端口为 0.0.0.0:1081 。

以下是“内外网”自动分流原理图:

下面把「可能被污染的域名」交由 dns2socks 解析。

该方案可以达到预期效果,但是仍有不完善的地方。

第一是没有在服务器上设置 QoS 来限制客人网络的网速(后来在交换机上设定了)。

第二是「可能被污染的域名列表」和「大陆 IP 地址集」无法实现自动更新。

不过现在就先这么用着吧,哈哈。

利用openGL纯手工打造一个金字塔

环境:linux(ubuntu16.4)、gcc

第一步:先出一个三角形线框

  效果:

  

  实现代码:

    Makefile

BDIR = -L/usr/X11R6/lib
CC = gcc
CFLAGS = $(COMPILERFLAGS)
LIBRARIES = -lX11 -lXi  -lglut -lGL -lGLU -lm

pyramid : pyramid.o
    $(CC) $(CFLAGS) -o $@ $(LIBDIR) $? $(LIBRARIES)

clean:
    rm -f *.o

  pyramid.c

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glext.h>
#include <sys/time.h>
#include <math.h>
#define GL_PI 3.1415f

void RenderScene(void){
    //用线框绘制
    glPolygonMode(GL_FRONT,GL_LINE);
    //用当前颜色清除屏幕(也就是SetupRC中的 glClearColor 指定的颜色)
    glClear(GL_COLOR_BUFFER_BIT);

    //此三角形位于x、y轴的平面上
    glBegin(GL_TRIANGLES);
        glVertex3f(50.0f,0.0f,0.0f);//右顶点
        glVertex3f(0.0f,50.0f,0.0f);//上顶点
        glVertex3f(-50.0f,0.0f,0.0f);//左顶点
    glEnd();

    glutSwapBuffers();
}

void SetupRC()
    {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

    // 设置绘制颜色为绿色
    glColor3f(0.0f, 1.0f, 0.0f);
    }
void ChangeSize(int w, int h)
    {
    GLfloat nRange = 100.0f;

    // 防止清零
    if(h == 0)
        h = 1;

    // 设置视口大小为当前窗口
    glViewport(0, 0, w, h);

    //重置操作矩阵栈
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 这是透视投影裁截体 (left, right, bottom, top, near, far)
    if (w <= h) 
        glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    else 
        glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

    //重置模型视图矩阵
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }


int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("Pyramid Example");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);

    SetupRC();
    glutMainLoop();

    return 0;
    }

 第二步:实现旋转

  效果(当按上下左右箭头时实现旋转):

  

  实现代码:

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glext.h>

#include <sys/time.h>

#include <math.h>

#define GL_PI 3.1415f

static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;


void RenderScene(void){
    //用线框绘制
    glPolygonMode(GL_FRONT,GL_LINE);
    glPolygonMode(GL_BACK,GL_LINE);

    //用当前颜色清除屏幕(也就是SetupRC中的 glClearColor 指定的颜色)
    glClear(GL_COLOR_BUFFER_BIT);
    
    //保存当前操作矩阵
    glPushMatrix();

    //绕x轴旋转
    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    //绕y轴旋转
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);


    //此三角形位于x、y轴的平面上
    glBegin(GL_TRIANGLES);
        glVertex3f(50.0f,0.0f,0.0f);//右顶点
        glVertex3f(0.0f,50.0f,0.0f);//上顶点
        glVertex3f(-50.0f,0.0f,0.0f);//左顶点
    glEnd();
    //恢复当前操作矩阵
    glPopMatrix();

    glutSwapBuffers();
}

void SetupRC()
    {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

    // 设置绘制颜色为绿色
    glColor3f(0.0f, 1.0f, 0.0f);
    }
void ChangeSize(int w, int h)
    {
    GLfloat nRange = 100.0f;

    // 防止清零
    if(h == 0)
        h = 1;

    // 设置视口大小为当前窗口
    glViewport(0, 0, w, h);

    //重置操作矩阵栈
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 这是透视投影裁截体 (left, right, bottom, top, near, far)
    if (w <= h) 
        glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    else 
        glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

    //重置模型视图矩阵
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
//控制键
void ControlKeys(int key, int x, int y)
    {
    if(key == GLUT_KEY_UP)
        xRot-= 5.0f;

    if(key == GLUT_KEY_DOWN)
        xRot += 5.0f;

    if(key == GLUT_KEY_LEFT)
        yRot -= 5.0f;

    if(key == GLUT_KEY_RIGHT)
        yRot += 5.0f;

    if(key > 356.0f)
        xRot = 0.0f;

    if(key < -1.0f)
        xRot = 355.0f;

    if(key > 356.0f)
        yRot = 0.0f;

    if(key < -1.0f)
        yRot = 355.0f;

    // Refresh the Window
    glutPostRedisplay();
    }

int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("Pyramid Example");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(ControlKeys);
    glutDisplayFunc(RenderScene);

    SetupRC();
    glutMainLoop();

    return 0;
    }

 第三步:线框金字塔

  效果:红x轴,绿y轴,蓝z轴

  

  实现代码:

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glext.h>

#include <sys/time.h>

#include <math.h>

#define GL_PI 3.1415f

static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;


void RenderScene(void){
    //用线框绘制
    glPolygonMode(GL_FRONT,GL_LINE);
    glPolygonMode(GL_BACK,GL_LINE);

//    glEnable(GL_DEPTH_TEST);
    
    //用当前颜色清除屏幕(也就是SetupRC中的 glClearColor 指定的颜色)
    glClear(GL_COLOR_BUFFER_BIT);
    
    //保存当前操作矩阵
    glPushMatrix();

    //绕x轴旋转
    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    //绕y轴旋转
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);
    
    //加宽线条    
    glLineWidth(3.0f);

    //金字塔底边长
    GLfloat len = 60.0f;
    
    //z轴点
    GLfloat vz = 2*len*cos(GL_PI/180*30);    
    
    //顶点的z轴点    
    GLfloat vhz = len*tan(GL_PI/180*30);
    //此三角形位于x、y轴的平面上
    glBegin(GL_TRIANGLES);
        glVertex3f(len,0.0f,0.0f);//前右
        glVertex3f(0.0f,len,-vhz);//顶点        
        glVertex3f(-len,0.0f,0.0f);//前左

        glVertex3f(0.0f,0.0f,-vz);//
                glVertex3f(0.0f,len,-vhz);//顶点
                glVertex3f(len,0.0f,0.0f);//前右
        
        glVertex3f(-len,0.0f,0.0f);//前左
                glVertex3f(0.0f,len,-vhz);//顶点
                glVertex3f(0.0f,0.0f,-vz);//
    
    glEnd();


    //绘制一个坐标系,
    GLint factor = 2;
    GLushort pattern = 0x5555;
    
    //启用点画    
    glEnable(GL_LINE_STIPPLE);
    //点画模式
        glLineStipple(factor,pattern);


    glLineWidth(1.0f);    

    glBegin(GL_LINES);
        //x轴
        glColor3ub((GLubyte)255,(GLubyte)0,(GLubyte)0);

        glVertex3f(-100.0f,0.0f,0.0f);
        glVertex3f(100.0f,0.0f,0.0f);
        
        glColor3ub((GLubyte)0,(GLubyte)255,(GLubyte)0);
        
        //y轴
        glVertex3f(0.0f,-100.0f,0.0f);
                glVertex3f(0.0f,100.0f,0.0f);
        
        //z轴
        glColor3ub((GLubyte)0,(GLubyte)0,(GLubyte)255);
        
        glVertex3f(0.0f,0.0f,-100.0f);
                glVertex3f(0.0f,0.0f,100.0f);
    glEnd();

    //关闭点画    
    glDisable(GL_LINE_STIPPLE);    
    //恢复当前操作矩阵
    glPopMatrix();

    glutSwapBuffers();
}

void SetupRC()
    {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

    // 设置绘制颜色为绿色
    glColor3f(0.0f, 1.0f, 0.0f);
    }
void ChangeSize(int w, int h)
    {
    GLfloat nRange = 100.0f;

    // 防止清零
    if(h == 0)
        h = 1;

    // 设置视口大小为当前窗口
    glViewport(0, 0, w, h);

    //重置操作矩阵栈
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 这是透视投影裁截体 (left, right, bottom, top, near, far)
    if (w <= h) 
        glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    else 
        glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

    //重置模型视图矩阵
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
//控制键
void controlKeys(int key, int x, int y)
    {
    if(key == GLUT_KEY_UP)
        xRot-= 5.0f;

    if(key == GLUT_KEY_DOWN)
        xRot += 5.0f;

    if(key == GLUT_KEY_LEFT)
        yRot -= 5.0f;

    if(key == GLUT_KEY_RIGHT)
        yRot += 5.0f;

    if(key > 356.0f)
        xRot = 0.0f;

    if(key < -1.0f)
        xRot = 355.0f;

    if(key > 356.0f)
        yRot = 0.0f;

    if(key < -1.0f)
        yRot = 355.0f;

    // Refresh the Window
    glutPostRedisplay();
    }

int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("Pyramid Example");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(controlKeys);
    glutDisplayFunc(RenderScene);

    SetupRC();
    glutMainLoop();

    return 0;
    }

 

  

以上是关于用 CentOS 7 纯手工打造属于自己的软路由服务器的主要内容,如果未能解决你的问题,请参考以下文章

自己动手,做个CPU

史上最全面的纯手工打造 Vim 神器操作手册

纯手工打造简单分布式爬虫(Python)

CentOS 7 部署RabbitMQ 服务

CentOS 7.0 配置SVN服务

纯手工打造CPU的那些牛人们,欣赏令人叹为观止的纯手工布线和高超技