linux下的ip命令详解

刚刚安装了centos 7.0发现安装完以后没有ifconfig这个命令。后来打听了一下好像是取消了这个命令,只能使用ip命令来操作了。以下从网上摘了段ip命令的介绍,笔记一下

========================================================

1.作用
ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig、route等,使用权限为超级用户。几乎所有的Linux发行版本都支持该命令。

2.格式
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]

3.主要参数
OPTIONS是修改ip行为或改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式。目前,ip支持如表1所示选项。 Continue reading

CentOS 设置多个IP

ebian与contos单网卡绑定多个IP,如果是远程操作的话(如:ssh),切记要重启网卡的时候要 || ifup eth0
否则第二个IP或第二个配置文件有问题将导致网络中断,我的debian就断了….

debia单网卡配置多个IP

  1. root@debian:/etc/network# cat interfaces
  2. # This file describes the network interfaces available on your system
  3. # and how to activate them. For more information, see interfaces(5).
  4. # The loopback network interface
  5. auto lo
  6. iface lo inet loopback
  7. # The primary network interface
  8. allow-hotplug eth0
  9. iface eth0 inet static
  10. address 10.0.0.212
  11. netmask 255.255.255.0
  12. network 10.0.0.0
  13. broadcast 10.0.0.255
  14. gateway 10.0.0.1
  15. # dns-* options are implemented by the resolvconf package, if installed
  16. dns-nameservers 10.0.0.1
  17. allow-hotplug eth0:1
  18. iface eth0:1 inet static
  19. address 10.0.0.145
  20. netmask 255.255.255.0
  21. network 10.0.0.0
  22. broadcast 10.0.0.255
  23. gateway 10.0.0.1

Continue reading

IP转物理地址的原理(php版)

FW: http://bbs.chinaunix.net/thread-1218708-1-2.html

首先,IP对应的国家是比较好查的,ICANN及其它几个机构都有关于某个IP段所属国家和ISP信息,并且他们基本上都提供了免费查询。但难题在于每个洲的管理机构不同,且数据量庞大,不易收集。将IP对应到某个国家的某个ISP后还要了结到它是分配给哪个地区(城市)的,比如中国电信福建分公司的IP 段会分给厦门、福州等城市,而相对于这个就是比较难找了,可能ISP会有数据库会提供查询,可能也查不到,这些数据的来源就靠平时的积累、用户的贡献了。

当然,现在许多出名的数据库经过几年的发展已经比较完整和详细了,像免费的纯真数据库都有十几万条了,如过向国外的商业网站购买企业级应用的数据库,它的 准确度就有点惊人了。国外的 ip2location.com 提供的数据库就是如此,作为一个英文数据库,它除了对美国等地区的数据比较完整以外,甚至中国的数据的精确程度都不亚于国内的数据库。它还提供了IP对应的经纬度,如果搭配Google 提供的Google Earth 的API,就可以在网页上看到Google Earth了。

就保存的方法来看,一般有一个文件(如纯真的QQwry.dat)或数据库。在数据量庞大(如几十万条)的情况下,用文件保存明显优于数据库,这一点在后面会详解。无论采用哪种方式保存数据,它的一般格式为:

起点IP,终点IP,国家,地区
33996344,33996351,United Kingdom,XXX

某 些比较详细的数据库还有ISP,国家缩略名,对应邮编,甚至该地的经纬度!起点IP,终点IP不是我们常见的 XXX.XXX.XXX.XXX的形式,而是一个8-10位十进制数字构成的。这也是为了便于数据的搜索。该数据由IP转换而成,在PHP中有 ip2long() 函数可以转换,自己也可以写一个相同的函数

1. function dottedquad2long($ip){
2. $ip_arr = split(’\.’,$ip);
3. $iplong = (16777216 * $ip_arr[0]) + (65536 * $ip_arr[1]) + (256 * $ip_arr[2]) + $ip_arr[3];
4. return $iplong;
5. }

在一个文件的数据库中,通常每个数据间用某种间隔符间隔,当要查找一个IP如64.233.189.104,先将该IP转化为十进制数字 1089060200 ,再在文件中多次利用二分法查找该IP对应的区间,约通过10-20次查找,就可以准确地找到对应的位置了。

另外一种利用数据库保存数据的方法相比于文件的查找,PHP做的工作比较简单,但交给MySQL做的任务就比较艰巨了。现在一般的小型的数据库(如我找到的只有国家信息的数据),都有十万余条。要在那么多的数据库中查找一个区间,使用的时间倒不如用文件查找来得快。
关于查找数据在数据库和文件分别所用的时间我在上一篇文章中有提到过,一般来说用文件保存的数据查找速度明显优于数据库。

接下来就是我的完整的IP查询的方法了

数据库信息
数据库 ip 中表 ipdata 里面有:

id
startipnum 起点IP数字 如:33996344
endipnum终点IP数字 如:33996351
areaslug 国家/地区缩写 如:GB
area 国家全名 如: United Kingdom

1. <?php
2.
3. //调用的图片类型,默认gif
4. if($_GET[‘imgtype’] == ‘png’){
5. $imgtype = ‘png’;
6. }else{
7. $imgtype = ‘gif’;
8. }
9.
10. //分析请求(支持IP,主机查询)
11. if(!$_GET[‘s’]){
12. $ip = $_SERVER[“REMOTE_ADDR”];//无请求,查询访问者的IP信息
13. }else{
14. $s = trim(strtolower($_GET[‘s’]));//转换为小写
15. if(ereg(’[a-z]‘,$s) && substr($s ,-1,1) != ‘x’){
16. $ip = gethostbyname($s);//如果是主机,则转换为对应IP
17. }else{
18. if(substr($s ,-1,1) == ‘x’){
19. $ip = str_replace(’x’,’0′,$s);//为用户隐私考虑,允许最后一位用英文字符x取代。
20. }else{
21. $ip = $s;
22. }
23. }
24. }
25. $ip = long2ip(ip2long($ip));
26. $sip = sprintf(’%u’,ip2long($ip));
27. //再进一步分析整理出合法的IP地址,并转换为数字形式,便于在数据库中查找
28. $sql = “SELECT * FROM `ipdata` WHERE $sip >= `startipnum` AND $sip <= `endipnum`”;
29. //组织SQL在数据库中查找IP对应的区间
30. $link = mysql_connect(”localhost”, “root”, “”);
31. mysql_select_db(’ip’, $link);
32. $result = mysql_query($sql);
33. while ($row = mysql_fetch_array($result)) {
34. $return = $row;
35. }
36. //进行查询,得出结果
37. if(!$return[‘areaslug’] || $return[‘areaslug’] == ‘-h’){//没有结果或结果位置,返回问号的图标
38. header(’Content-type: image/png’);
39. readfile(’icon/png/other.png’);
40. }else{//根据调用格式不同分别调用对应的图标
41. if($imgtype == ‘png’){
42. header(’Content-type: image/png’);
43. readfile(’icon/png/’.strtolower($return[‘areaslug’]).’.png’);
44. }else{
45. header(’Content-type: image/gif’);
46. readfile(’icon/gif/’.strtolower($return[‘areaslug’]).’.gif’);
47. }
48. }
49.
50. ?>

PHP版IP限制程序代码

<?php
error_reporting(7);
session_start();
// 发送字符头信息
if ($headercharset)
 header(“Content-Type:text/html; charset=gb2312”);
// 加载公共文件
require_once(“config.php”);
require_once(“global.php”);
require_once(“db_mysql.php”);
/***************** 进行客户端能否访问本网站校验 ************/
// 获取客户端IP
if(getenv(’HTTP_CLIENT_IP’)) {
 $client_ip = getenv(’HTTP_CLIENT_IP’);
} elseif(getenv(’HTTP_X_FORWARDED_FOR’)) {
 $client_ip = getenv(’HTTP_X_FORWARDED_FOR’);
} elseif(getenv(’REMOTE_ADDR’)) {
 $client_ip = getenv(’REMOTE_ADDR’);
} else {
 $client_ip = $HTTP_SERVER_VARS[‘REMOTE_ADDR’];
}
// 分解客户端IP
$cip = explode(“.”, $client_ip);
// 连接数据库
$db = new DB_Sql();
$err = $db->connect();
/*  限制远程IP访问, PS: 这段代码真晕,呵呵,用了8个if, -_-#  */
// 从数据库中提取存储的要限制的IP地址
$query_str = “SELECT limit_ip FROM us_limitip”;
$db->query($query_str);
// 把结果循环提取,一个个进行校验
while ($db->next_record())
{
 $limit_ip = $db->f(“limit_ip”);
 $lip = explode(“.”, $limit_ip);
 // 如果限制IP的第一个是*或者是0的话就跳到错误页
 if (($lip[0]==’*’) || ($lip[0]==’0′))
  header(“Location:../error.php?errid=300”);
 // 如果刚好客户端IP等于我们限制IP就跳到错误页
 if ($client_ip==$limit_ip)
  header(“Location:../error.php?errid=300”);
 // 如果第一组IP一致进行第二组IP的匹配
 if ($cip[0] == $lip[0])
 {
  // 如果第二组限制IP是*就跳到错误页
  if ($lip[1]==’*’)
   header(“Location:../error.php?errid=300”);
  // 第二组IP匹配就进行第三组IP匹配
  if ($cip[1]==$lip[1])
  {
   // 如果第三组限制字符是*就跳到错误页
   if ($lip[2]==’*’)
    header(“Location:../error.php?errid=300”);
   // 如果第三组IP匹配就跳到第三组校验
   if ($cip[2]==$lip[2])
   {
    // 如果第四组限制IP是*或0就跳到错误页
    if (($lip[3]==’*’) || ($lip[3]==’0′))
     header(“Location:../error.php?errid=300”);
   }
  }
 } 
}
// 释放数据库查询结果
$db->free();
/****************** IP校验结束 ******************/
?>