单网卡编译
① linux mint 锐捷linux客户端怎么安装
1. 下载安装文件
2. 解压缩文件
3. 将lib文件夹中的将所需库文件复制到/lib文件夹中(实际上只需两个:libpcap.so.0.6.2,libstdc++.so.5)
4. 将bin文件夹中的xrgsu文件复制到/bin文件夹中
5. 设置静态IP
1. 在windows下运行锐捷的认证客户端,通过认证之后,用cmd运行ipconfig /all,查看你当前被分配到的IP地址信息,把IP Address,Subnet Mask,Default Gateway,DNS Servers这几条信息记录下来
2. 进入linux,在linux网络设置的地方,将网络配置成静态IP的形式,IP信息要跟先前我们在windows下看到记下来的一致
6. 在命令行,运行 xrgsu,接着输入你的用户名,密码,再输入1和输入0,就可以人在了。
7. 如果运行是会提示没有权限,则执行如下命令让xrgsu有可执行的属性
chmod +x /bin/xrgsu
8. 但是运行后会出现如下错误:
WARNING: IintNIC:NIC eth0 does not exist(3)
Get parameter error!
别急,最后一招:
[root@lxt ~]# ifconfig eth0 192.168.3.99
好了,大功告成:
[root@lxt ~]# xrgsu -d
XRGSupplicant 1.1.1
Ruijie Network CopyRight 2004-2005
Please input your user name:09SBY0715131
Please input your password:
Use default auth parameter,0-Use 1-UnUse(Default: 0):0
Searching server...
Connecting server...
Authenticating...
Authenticate SUCCESSFULLY!
dhclient: 没有进程被杀死
eth0: 没有进程被杀死
Searching server...
Connecting server...
Authenticating...
Authenticate SUCCESSFULLY!
Please input 'unauth' to LogOff:
IP Address is changed,Reauth Now!
Searching server...
Connecting server...
Authenticating...
Authenticate SUCCESSFULLY!
简单吧?但可能还存在很多问题。下面一一说明。
错误问题处理
1. 多网卡或代理服务器问题.
也许你会认证成功,但不久后,会出现如下错误,如何锐捷自动退出。
Detect Proxy Server!Err = 4 xrgsu exit!
这个错误是因为你误安装了xen虚拟机或xrgsu(锐捷)发现了lo网卡,造成了锐捷认证认为你具有多网卡,而锐捷认证是有单网卡要求的,所以起会认证后退出。在windows下安装虚拟机后也会出现同样情况,解决方法是不要使用锐捷公司提供的认证文件xrgsu,而改用bin文件夹下的 myxrgsu,此文件已经被网友重新编写编译过,起在认证后会省略检测多网卡这一步。安装myxrgsu的方法跟xrgsu一样,只需要将其拷贝到 /bin目录设置一下执行权限即可。认证的时候就使用命令myxrgsu了。
2. 认证失败
Authenticate Fail
这种情况多半是你的用户名或者密码错误,请重新检查。另外一种就是前面安装的时候IP信息填写错误。
自动认证的方法
也许你会觉得每一次都得输入命令,如何帐号密码,这么很麻烦,这里告诉你一个简单的方法。
1. 安装expect下的3个rpm文件,安装顺序是:tcl-8.3.5-88.i386,expect-5.38.0-88.i386,expect-devel-5.38.0-88.i386.安装命令为
rpm -i *.rpm 注释:用*代替你需要安装的文件名
在安装tcl-8.3.5-88.i386.rpm的过程中,你可能会遇到如下类似的错误报告:
1. package ** conflict with package ** from tcl-8.3.5-88.i386.rpm
上面2个**是一个文件名,那么说明你已经安装了一个其他版本的tcllib,但原来的tcllib与现在的tcllib冲突,就必须先在软件管理删除原来已经安装了的tcllib。
2. 拷贝netlogin到/bin目录下
3. 拷贝autoconnect和autoconnectasroot到/usr/local/bin/目录下,如何用用vi或gedit修改autoconnect和autoconnectasroot两个文件,按说明填上您的帐号资料等.记住要保存哦!
说明:在非root用户下我还没有连接成功,好像说sudo不行,可以打开终端输入"ru -"切换到root用户在手动输入试试看。
这样就可以在命令提示行(普通用户或root都行)中输入netlogin就会自动连接上网了。
如果你还嫌麻烦,那就在桌面上做个快捷方式,对象命令为:netlogin,以后双击就可以上网了。
② Nginx基础篇----虚拟主机、日志、模块、请求限制
在企业中,我们有很多的业务服务A,B,C等等,按照最最传统的财大气粗方式就是在一台机器上搭建一个Nginx,并且一个Nginx只为一个业务进行服务,如下图所示,我们有3个业务服务,我们就在3个机器上搭建3个Nginx,这显然是很浪费资源的一种不合理方式。
虚拟主机的方式是指,我们在同一个Nginx上运行多套单独服务,而且这些服务是独立的,如下图所示:
基于主机多IP的方式有两种:
第一步 :在单网卡上添加多个IP--ip a add ip地址 设备名
第二步 :我们找到nginx.conf中的http中的include的配置,找到其include的文件路径
第三步 :找到默认配置文件,进行复制,将server中的listen进行改动,改为ip:port,在这里如果我们要为3个业务服务的话,我们就设置三个.conf的配置文件,每个配置文件中的ip不同即可。
第四步 :nginx -s stop -c /etc/nginx/nginx.conf
nginx -s表示给nginx的主进程发送信号,停止应用。-c表示启动的时候使用哪个配置文件。
第一步 :我们找到nginx.conf中的http中的include的配置,找到其include的文件路径
第二步 :找到默认配置文件,进行复制,将server中的listen 端口进行改动即可,每个配置文件中的端口不同即可。
第三步 :nginx -tc /etc/nginx/nginx.conf 对刚才修改的配置文件进行语法检查
第四步 :nginx -c /etc/nginx/nginx.conf 启动nginx
更改server_name :
Nginx的日志类型有error.log和access_log两类。error.log用于记录错误类型的日志,access_log记录的是请求访问的相关的日志。Nginx使用了log_format把各种类型的变量进行组织,然后记录到access_log当中去。
log_format只能配置到http模块下,所以我们看到nginx.conf中,会看到log_format的使用方式如下图所示:
Nginx的模块分为官方的模块和第三方的模块,我们可以通过命令行nginx -V看到很多的--with-XXXX,这些就是Nginx中的模块。
编译选项--with-http_stub_status_mole,用于展示Nginx当前处理连接的状态。这个模块默认是没有打开的,它必须要用户显示的server和location模块中进行配置。
我们在nginx.conf中配置好后,通过IP:PORT/mystatus进行访问,会看到以下结果:
该模块使用的比较少,它表示是从目录中随机选取一个主页。语法规则 random_index on | off,默认情况下是random_index off;只能放在location的上下文中。
这个模块也用的不多,它主要用于对http的响应内容作替换。包含了很多用法:
sub_filter string replacement 默认是不开启的,可以用在http,server,location中,作用是替换html中的字符。
sub_filter_last_modified on | off,默认是off,可以用在http,server,location中,作用是否阻止response header中写入Last-Modified,防止缓存,默认是off,即防止缓存。
sub_filter_once on | off,默认是on,可以用在http,server,location中,作用sub_filter指令是执行一次,还是重复执行,默认是只执行一次。
Nginx中可以对连接频率和请求频率做限制。其中连接频率限制的模块是limit_conn_mole,请求频率限制的模块是limit_req_mole。
请求和连接到底有什么区别呢?我们知道HTTP协议是建立在TCP协议之上的,客户端在向服务端发起请求的时候,必须先建立三次握手连接,建立完连接之后才开始发送请求,为了保持这个连接我们使用FIN和ACK,这样就可以在一个连接中多次发起请求,因此我们可以说HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求。
连接限制的语法:
定义空间:
limit_conn_zone key zone=name:size 默认是没有的,只能在http中配置,如果说我们想对用户的IP地址做限制,那么这里的key我们可以配置成$remote_addr,这里的name可以随便命名,size设置大小
limit_conn zone number;这里的zone必须和上面的limit_conn_zone中的name对应,number表示的是连接数,默认是没有的,可以在http,server,location中配置。
请求限制的语法:
定义空间:
limit_req_zone key zone=name:size rate=rate默认是没有的,只能在http中配置
limit_req zone name [burst=number] [nodelay];这里的zone必须和上面的limit_req_zone中的name对应,number表示的是连接数,默认是没有的,可以在http,server,location中配置;burst爆发的意思,这个配置的意思是设置一个大小为N的缓冲区,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内;nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队.
$binary_remote_addr是限制同一客户端ip地址,binary_remote_addr和remote_addr其实是一样的,但是binary_remote_addr要更节省空间。1m 可以储存 32000 个并发会话。zone=req_zone:1m表示生成一个大小为1M,名字为req_one的内存区域,用来存储访问的频次信息;rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。这里我使用abtest来演示一下各种情况:
配置每秒钟最多一次请求:
使用abtest发起请求,设置并发数20,发起20次请求。测试结果,成功1次,失败19次,符合预期:
查看nginx错误日志,图中刚好有19个error记录,而且是被限制了,符合预期:
设置一个大小为3的缓冲区,超过访问频次限制的请求将会放入到缓冲区中:
使用abtest发起请求,设置并发数20,发起20次请求。测试结果,成功4次,失败16次,符合预期,因为第一次成功后,超过了请求限制,放了3个请求到缓冲区中,所以总共成功4个:
查看nginx错误日志,图中刚好有16个error记录,而且是被限制了,符合预期:
设置最大连接数为1:
使用abtest发起请求,设置并发数20,发起20次请求。测试结果,成功20次,失败0次,符合预期:
查看nginx错误日志,无任何错误日志,符合预期。
nginx的http_access_mole模块实现的,相关语法如下图所示:
~表示模式匹配,这里我们表示凡是访问admin.html的请求,阻止180.158.232.219的访问,同时允许所有的IP访问。结果如下图所示:
请求成功:
是nginx的http_auth_basic_mole模块实现的,使用方式可以具体参考 http://nginx.org/en/docs/http/ngx_http_auth_basic_mole.html 这里不再赘述
Nginx的基础篇就讲到这里,欢迎大家指正,下一篇文章我将介绍如何使用Nginx作为静态资源Web服务。
③ centos 7单网卡双ip
先说明一下,CentOS实际上是RedHat系统的再编译版本,所以对应的文档可以参考一下RedHat对应版本的相关配置文档。
接下来,由于RH7和RH6在网路这一块的变动非常大,感觉相关内容已经处于重做的程度,所以推荐你还是看一下官方是如何定义附加IP的。附件是我找到的相关的文档,你可以参考一下。
就我个人而言,在现在这种大家都比较生疏的情况下,为了避免碰到一些冷门雀液情况(由于这一块变化太大,不确定当修改配置文件的时候是否所有涉及到的配置文件都修改了),我们可以先通过图形界面完成对应的功能配置。首先,使用nmtui启动到网络配置窗口配晌,然后选择对应的网卡,在配置卡中将隐藏的高级选项显示出来,会顷卖物看到增补IP的对应选项。你可以先试试看。
④ freebsd英文桌面不能用中文输入法(fcitx)
首先要搞清楚当前用户的 SHELL 是 csh、bash 或其它,可以通过 echo $SHELL 或者 cat /etc/passwd 看当前的用户设置。
如果是 csh 用 setenv,如果是 bash 则用 export,如厅没备果搞清楚这察斗个应该就明白输入法那个设和导出环境变量究竟应该用哪个命令了。
关于编译 kernel 添加 option rl0 的问题,不同的网卡在 freebsd 上识别出来的名字是不一样的,这里与 windows 都叫“本地链接不扮毁同,bsd 有 ln0、rl0、eth0 等,所以我相信这里要修改的东西也要视具体的情况。
⑤ 如何获取本机MAC地址 和 IP
1. 利用UUID获取
在Windows操作系统下,以Client-Sever模式进行通信时,运行时间库为了区分每个接口,需要为个接口建立一个UUID(Universally Unique Identifiers),在Windows95/98版本下,UUID的创建是通过调用函数UuidCreate()完成的,其中的第2至8字节包含了用户的MAC地址。因此,一种比较快的获取MAC地址的方法是创建一个UUID,然后分析UUID结构的第2至8字节,既可获取本机的MAC地址。示例程序如下:
static void GetMACaddress(void)
{
unsigned char MACData[6];
UUID uuid;
UuidCreate( &uuid ); // 要求操作系统创建一个新的UUID
for (int i=2; i<8; i++) // 获取本机MAC地址
MACData[i - 2] = uuid.Data4[i];
PrintMACaddress(MACData);
}
void PrintMACaddress(unsigned char MACData[])
{
printf("MAC Address: X-X-X-X-X-X\n",
MACData[0], MACData[1], MACData[2], MACData[3], MACData[4], MACData[5]);
}
这种方法只能用于Windows95/98操作系统。因为从安全的角度来看,在网络上散布本机的MAC地址存在着安全隐患,因此在Windows2000/xp操作系统中,微软对函数UuidCreate()进行了修正,使之在生成UUID时,不借助于本机的MAC地址。原来UuidCreate()完成的功能由函数UuidCreateSequential()完成。因此,如果在新的系统中采用这种方法,可用UuidCreateSequential()代替上述程序中的UuidCreate()函数。
另外,需要说明的是,这种方式只能用于单网卡主机。
2. 利用Net Bios协议获取
这种方法在Windows 95/98/Me/NT/2000/XP下都适用,不过它要求网卡必须安装正确,绑定了NetBios协议,并且机器正联接在一个运行正常的NetBios网络上。如果主机未接在网上,即使用网卡运行正常,运行下述代码,用户也不会得到任何信息。
static void GetMACaddress(void)
{
unsigned char MAC Data[8]; // 定义存放 MAC地址的缓冲区 (至少6字节)
WKSTA_TRANSPORT_INFO_0 *pwkti;
DWORD dwEntriesRead;
DWORD dwTotalEntries;
BYTE *pbBuffer;
// 通过 NetBIOS的枚举函数获取MAC地址
NET_API_STATUS dwStatus = NetWkstaTransportEnum(
NULL, // [input] 服务器名,0指本机
0, // [input] 0指函数返回指向WKSTA_TRANSPORT_INFO_0结构的指针
&pbBuffer, // [output] 指向缓冲区指针
MAX_PREFERRED_LENGTH, // [input] 缓冲区最大长度
&dwEntriesRead, // [output] 用于记录实际元素个数
&dwTotalEntries, //
NULL); //[input/output] 恢复句柄
assert(dwStatus == NERR_Success);
pwkti = (WKSTA_TRANSPORT_INFO_0 *)pbBuffer; // 指针类型转换
for(DWORD i=0; i< dwEntriesRead; i++)
{ // 读取并打印MAC地址
swscanf((wchar_t *)pwkti[i].wkti0_transport_address,
L"%2hx%2hx%2hx%2hx%2hx%2hx",
&MACData[0],
&MACData[1],
&MACData[2],
&MACData[3],
&MACData[4],
&MACData[5]);
PrintMACaddress(MACData);
}
// 释放缓冲区
dwStatus = NetApiBufferFree(pbBuffer);
assert(dwStatus == NERR_Success);
}
3. 利用GetAdaptersInfo()函数获取
此方法利用了Windows SDK 中的函数GetAdaptersInfo(),对于用户来讲,编程很简单,而且适用于Windows 95/98/Me/NT/XP等操作系统,并且不要求主机必须接在网络上,要求的只有一点,就是网卡在Windows下必须是可用的。同时,需要说明的是,GetAdaptersInfo()是一个功能非常强大的函数,它不但可以得到本机的MAC地址,而且可以得到许多其它相关信息。详细内容可参见MSDN中有关IP_ADAPTER_INFO结构的说明。
static void GetMACaddress(void)
{
IP_ADAPTER_INFO AdapterInfo[16]; // 定义网卡信息存贮区。
DWORD dwBufLen = sizeof(AdapterInfo);
DWORD dwStatus = GetAdaptersInfo(
AdapterInfo, // [output] 指向接收数据缓冲指针
&dwBufLen); // [input] 缓冲区大小
assert(dwStatus == ERROR_SUCCESS); // 此处是个trap,用来保证返回值有效
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
do {
PrintMACaddress(pAdapterInfo->Address); // 打印MAC地址
pAdapterInfo = pAdapterInfo->Next;
}
while(pAdapterInfo);
}
本程序中定义了一个长度为16的IP_ADAPTER_INFO结构类型的数组,因此用户主机安装的网卡数不能超过16块,这在一般情况下都是可以满足的,如果出现超过16块的情况,用户需修改此项设置,或采用动态申请存贮空间的方式解决。
4.结束语
以上三种方法均在Visual C++ 6.0、Windows2000 环境下编译通过并工作正常。需要说明的是,示例程序只是提供了一种解决问题的思路,从软件工程的角度来看,有些不尽人意的地方,读者可以根据自己的编程需要进行修改。
5,获取IP
void CheckIP(void)
{
WSADATA wsaData;
char name[155];
char *ip;
PHOSTENT hostinfo;
if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 ) {
if( gethostname ( name, sizeof(name)) == 0) {
if((hostinfo = gethostbyname(name)) != NULL) { //这些就是获得IP的函数
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
printf("%s\n",ip);
}
}
WSACleanup( );
} }