用 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 纯手工打造属于自己的软路由服务器的主要内容,如果未能解决你的问题,请参考以下文章