Trunk、Hybrid、Access、Tag、Untag、Pvid

1、Trunk口,Trunk口上可以同时传送多个VLAN的包,一般用于交换机之间的链接。

2、Hybrid口,Hybrid口上可以同时传送多个VLAN的包,一般用于交换机之间的链接或交换机于服务器的链 接。

3、Access口,Access口只能属于1个VLAN,一般用于连接计算机的端口。

4、Tag和Untag,tag是指vlan的标签,即vlan的id,用于指名数据包属于那个vlan,untag指数据包不属于任何vlan,没有vlan标记。

5、PVID即 Port Vlan id,代表端口的缺省VLAN。交换机从对端设备收到的帧有可能是不带VLAN标签的数据帧,但所有以太网帧在交换机中都是以带VLAN标签的形式来被处理和转发的,因此交换机必须给端口收到的不带VLAN标签的数据帧添加上VLAN标签。为了实现此目的,必须为交换机配置端口的缺省VLAN。当该端口收到不带VLAN标签的数据帧时,交换机将给它加上该缺省VLAN的VLAN标签。通俗的讲,指的是native Vlan,即不打Vlan标记的Vlan,一般默认为Vlan 1

Port-base VLAN ID,是表示网络通信中基于端口的VLAN ID,一个端口可以属于多个VLAN,但是只能有一个PVID,收到一个不带tag头的数据包时,会打上PVID所表示的VLAN号,视同该VLAN的数据包处理。一个物理端口只能拥有一个PVID,当一个物理端口拥有了一个PVID的时候,必定会拥有和PVID相等的VID,而且在这个VID上,这个物理端口必定是Untagged Port。PVID的作用只是在交换机从外部接受到可以接受Untagged 数据帧的时候给数据帧添加TAG标记用的,在交换机内部转发数据的时候PVID不起任何作用。

二、端口的Tag和Untag

若某一端口在vlan设定中被指定为非标记端口untagged port, 所有从此端口转发出的数据包上都没有标记 (untagged)。若有标记的数据包进入交换机,则其经过非标记端口时,标记将被去除。因为目前众多设备并不支持标记数据包,其也无法识别标记数据包,因此,需要将与其连接的端口设定为非标记。

若某一端口在vlan设定中被指定为标记端口tagged port, 所有从此端口转发出的数据包上都将有标记 (tagged)。若有非标记的数据包进入交换机,则其经过标记端口时,标记将被加上。此时,其将使用在ingress 端口上的pvid设定作为增加的标记中的vlan id号。

三、端口的封装类型:ISL、802.1Q

ISL Trunk上所有的包都是tag的(Cisco专用);

802.1q 设计的时候为了兼容与不支持VLAN的交换机混合部署,特地设计成可以不tag:但是只有一个VLAN允许不tag,这样N个VLAN,(N-1)个都tag了,不tag的包一定是来自那个特殊VLAN的,所以不会乱套。(当然也可以所有VLAN都tag)

四、各端口收发数据的区别

端口类型收发描述
Access收报文判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则直接丢弃(缺省)
发报文将报文的VLAN信息剥离,直接发送出去
Trunk收报文收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有判断该trunk端口是否允许该 VLAN的数据进入:如果可以则转发,否则丢弃
发报文比较端口的PVID和将要发送报文的VLAN信息,如果两者相等则剥离VLAN信息,再发送,如果不相等则直接发送
Hybrid收报文收到一个报文判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则判断该hybrid端口是否允许该VLAN的数据进入:如果可以则转发,否则丢弃
发报文判断该VLAN在本端口的属性(disp interface 即可看到该端口对哪些VLAN是untag, 哪些VLAN是tag)如果是untag则剥离VLAN信息,再发送,如果是tag则直接发送

以下案例可以帮助大家深入理解华为交换机的hybrid端口模式

[Switch-Ethernet0/1]int e0/1

[Switch-Ethernet0/1]port link-type hybrid

[Switch-Ethernet0/1]port hybrid pvid vlan 10

[Switch-Ethernet0/1]port hybrid vlan 10 20 untagged

[Switch-Ethernet0/1] int e0/2

[Switch-Ethernet0/2]port link-type hybrid

[Switch-Ethernet0/2]port hybrid pvid vlan 20

[Switch-Ethernet0/2]port hybrid vlan 10 20 untagged

此时inter e0/1和inter e0/2下的所接的PC是可以互通的,但互通时数据所走的往返vlan是不同的。

以下以inter e0/1下的所接的pc1访问inter e0/2下的所接的pc2为例进行说明

pc1所发出的数据,由inter0/1所在的pvid vlan10封装vlan10的标记后送入交换机,交换机发现inter e0/2允许vlan 10的数据通过,于是数据被转发到inter e0/2上,由于inter e0/2上vlan 10是untagged的,于是交换机此时去除数据包上vlan10的标记,以普通包的形式发给pc2,此时pc1->p2走的是vlan10

再来分析pc2给pc1回包的过程,pc2所发出的数据,由inter0/2所在的pvid vlan20封装vlan20的标记后送入交换机,交换机发现inter e0/1允许vlan 20的数据通过,于是数据被转发到inter e0/1上,由于inter e0/1上vlan 20是untagged的,于是交换机此时去除数据包上vlan20的标记,以普通包的形式发给pc1,此时pc2->pc1走的是vlan20

青龙

先宝塔,里面装docker,再用以下命令在docker中装青龙

docker run -dit \
  --name QL \
  --hostname QL \
  --restart always \
  -p 5700:5700 \
  -v $PWD/QL/config:/ql/config \
  -v $PWD/QL/log:/ql/log \
  -v $PWD/QL/db:/ql/db \
  -v $PWD/QL/scripts:/ql/scripts \
  -v $PWD/QL/jbot:/ql/jbot \
  whyour/qinglong:latest

再在宝塔和云服务器后台放开入站规则5700端口,然后登录

获取京东cookies,

chrome浏览器访问 https://m.jd.com 然后点击 我的并用手机京东app扫描弹出来的二维码。

然后F12打开浏览器调试工具,点击 Application找到 Cookies 点击 https://home.m.jd.com,

在右边我们找到 pt_key和 pt_pin两个变量的值,将他们记录下来。

配置环境变量

在我们拿到 pt_key和 pt_pin两个变量后我们就可以开始配置青龙面板的环境变量了。

在面板的右上角我们可以看到环境变量这个选项,我们点击增加。

在弹出的窗口中输入变量,名称为 JD_COOKIE 值就是刚刚获取的 pt_key和 pt_pin两个变量,注意别搞反了(中间和后面的分号不可少),如

pt_key=AAJhuUiCADQS_fjhNxcGreONxMHJdtIQ1Tg0dCJK4n3FHHqW4sEv3Y-4dmXH1C8;pt_pin=jd_6ca591d6a;

拉取脚本库

在配置好环境变量后我们就可以开始拉取脚本了,由于脚本库会更新我们拉取脚本的命令也可以放在定时任务中。

添加库:

进入面板-右上角“定时任务”-分别填入相关信息。提供个人设置,给大家参考。其中任务名、任务定时可自定义。

名称:

拉取京东脚本

拉库命令填写下方代码:

ql repo https://gh.fakev.cn/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"

或者:

ql repo https://hub.fastgit.xyz/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"

PS:两者任选其一即可

国外鸡可直连Github的话填写下方代码

ql repo https://github.com/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"

定时规则(每天8点30):

30 8 * * *

填写完毕后我们点击播放按钮运行一次脚本,稍等一下,让它转一会儿。然后刷新页面,就能看到库的脚本了

看到上面的内容可以说就大功告成了,京东脚本就会按照脚本设置的时间自动执行任务获取京豆和红包。

四、安装青龙面板依赖

青龙面板脚本运行必须要安装的依赖

一键依赖
docker exec -it qinglong bash
## 安装青龙依赖,如果按上面的安装青龙容器脚本,此处要把qinglong改成QL.
curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/FlechazoPh/QLDependency/main/Shell/QLOneKeyDependency.sh | sh

四、消息推送(可选)

在每次执行完我们需要一个推送来告诉我们今天获取了多少京豆,以及cookies有没有过期。我们在面板的配置文件项的第44行找到server酱并填入SendKey并保存即可。

目前Server酱使用门槛变高,改用钉钉机器人是一个比较好的选择,具体步骤可参考这篇文章:青龙面板 消息推送功能设置之钉钉机器人消息推送! – 孤岛 (feiji.work)

五、总结

这是一个非常好的服务器回血项目,即使在配置和搭建上比较复杂,但是收益还是相当可观的,配置得当你甚至在收回本金后还能赚不少钱。

其它补充内容可参考:搭建青龙面板运行京东、B站脚本 – 登山亦有道 (chenyan98.cn),目前发表原文的站点无法访问,看seo关键词估计是被请去喝茶了,。

其它参考链接

青龙面板自动领京东京豆,做农场浇水、萌宠、工厂、种豆等任务-缙哥哥 (dujin.org)

青龙面板拉取常用脚本(JD签到)目前在维护的脚本更新(2021-10-04)

https://blog.csdn.net/m0_61705773?type=blog

其它用法

多个网站签到

bilibili bili说明

快手,养牛,开卡

项目

金银手指

Fiddler脚本

写好脚本则更能够帮你抓取数据到文件、数据库,部分实现自动化,甚至远超一些同类专业产品。

常规功能
可以用来指定抓取所有的WEB通讯,也可以只抓取指定进程的通讯。

File-Capture Traffic ; Any Process 或拖动选定进程窗口

2.可以用来查看一个URL打开后,浏览器与后端的交互

3.可以查看任意一个HTTP交互,看请求和响应的原始报文,帮助你了解HTTP协议

4.可以设置丰富的过滤条件,确保聚焦

5.可以以各种形态查看数据,并提供了工具来做转换【这个比较丰富,但隐藏较深】

6.可以编写脚本,实现各个阶段的处理

可以基于类似Windows下的WScript,甚至使用一些ActiveX组件实现并发机制、通讯与数据存储。

OnBeforeRequest 在请求发生前调用,请求经过Fiddler发送给服务器之前会先调用这个函数,因此,如果想要修改请求,可以写在这个函数里
OnPeekAtResponseHeaders 在头到达后调用
OnBeforeResponse 在内容到达后,还没有处理前调用,从服务器读完响应后,且在将响应发送给客户端之前执行的。通过修改这个函数,可以修改服务器的响应头或者响应体

把网页上的JSON文件下载到本地

把以下内容放入OnBeforeResponse里面,

    if (m_Hide304s && oSession.responseCode == 304) {
        oSession["ui-hide"] = "true";
    }

    if (oSession.uriContains("https://www.tiktok.com/api/recommend/item_list/")){
        var strBodytk=oSession.GetResponseBodyAsString();
        //var spstk = oSession.PathAndQuery.slice(-58,);
        //FiddlerObject.alert(spstk)
        var timestamptk=new Date().getTime();
        var filenametk = "D:\\tiktokzl" + "\/" + timestamptk + ".json";
        //var filename = "D:\抖音评论资料" + "/" + sps + timestamp + ".json";
        var curDatetk = new Date(); 
        var swtk : System.IO.StreamWriter; 
        if (System.IO.File.Exists(filenametk)){ 
            swtk = System.IO.File.AppendText(filenametk); 
            swtk.Write(strBodytk); 
        } 
        else{ 
            swtk = System.IO.File.CreateText(filenametk); 
            swtk.Write(strBodytk); 
        } 
        swtk.Close(); 
        swtk.Dispose(); 

    }

抓到 请求的数据  保存本地txt 文件里面

  • 将下代码  粘到OnBeforeRequest 的函数里头
  • if (oSession.fullUrl.Contains("填写需要抓取的域名")) {    var fso;    var file;    fso = new ActiveXObject("Scripting.FileSystemObject");    //文件保存路径可自定义    file = fso.OpenTextFile("填写保存TXT文件地址",8 ,true, true);    file.writeLine("Request url: " + oSession.url);    file.writeLine("Request header:" + "\n" + oSession.oRequest.headers);    file.writeLine("Request body: " + oSession.GetRequestBodyAsString());    file.writeLine("\n");    file.close();}

自动化抓取图片并提出重复的
static function FileExsitInDirectory(fso:Object, filename:String , dirpath:String )
{
var curPath = dirpath + “/” + filename ;
var objset , objFolders , FolderName, ret;

    if (fso.FileExists(curPath)) 
    {
        return  curPath;
    }
    else
    {
        var objset = fso.getFolder(dirpath);

        var objFolders = objset.SubFolders;

        var fenum = new Enumerator(objset.SubFolders); 

        for (var i = 0 ; !fenum.atEnd(); fenum.moveNext(),i++)
        { 

            var FolderName = dirpath + "/" + fenum.item().Name + "/";

            var ret = FileExsitInDirectory(fso, filename, FolderName);

            if( ret != "NULL" ) 
            {
                return ret
            }                                   
        } 
        return "NULL";  
    } 
}

static function OnBeforeResponse(oSession: Session)
{
if (m_Hide304s && oSession.responseCode == 304)
{
oSession[“ui-hide”] = “true”;
}

    //如果来自指定网站,且是jpg,则写文件 image/jpeg
    if(
        (oSession.RequestHeaders.AllValues("Host").Contains(".mm115.net") ||
        oSession.RequestHeaders.AllValues("Host").Contains(".jzsjwk.com"))

        &&
        oSession.ResponseHeaders.AllValues("Content-Type").Contains("image/jpeg") )
    {      

        var whindex = oSession.url.IndexOf ('?');           

        if (whindex <= 0)
            whindex = oSession.url.Length;

        var file_url = oSession.url.Substring (0,whindex);

        whindex = oSession.url.IndexOf ('.jpg');            

        if ((whindex > 0) && (oSession.GetResponseBodyAsString().Length > 40000))
        {
            whindex = whindex+4;            


            file_url = file_url.Substring (0,whindex).Replace ('/','_').Replace('%','B').Replace('?','7').Replace('&','-').Replace('img22.jzsjwk.com','img1.mm115.net');

            var file_path  = "d:/PRVIT/jpg/"+file_url;

            try
            {
                var fso = new ActiveXObject("Scripting.FileSystemObject"); 

                var retval = FileExsitInDirectory(fso,file_url,"d:/PRVIT/jpg/");

                FiddlerObject.log (retval);

                if ("NULL" == retval)
                {           
                    var stream = new ActiveXObject('Adodb.Stream');  
                    stream.Mode = 3;  
                    stream.Open();  


                    stream.Type = 1;  
                    //stream.Charset = 'unicode';  
                    //stream.WriteText(s);  

                    stream.Position = 0;  
                    stream.Type = 1;  
                    //stream.Position = 2;  
                    //var bs = stream.Read();  
                    //stream.Position = 0;  
                    stream.Write(oSession.responseBodyBytes);  
                    //stream.SetEOS();  

                    stream.SaveToFile(file_path,1);  

                    stream.Close(); 


                    oSession["ui-backcolor"] = "yellow";
                }
                else
                {
                    oSession["ui-strikeout"] = "true";
                    oSession["ui-backcolor"] = "green";
                }

            }
            catch(err)
            {
                FiddlerObject.log (err.message);
                oSession["ui-backcolor"] = "red";
            }


        }
        else
        {
            oSession["ui-color"] = "red";
        }

    }





}

抓取内容,并存放到数据库
var sql = “”;
try
{
var con =new ActiveXObject(“ADODB.Connection”);

            //con.Provider="Microsoft.ACE.OLEDB.18.0";



            var rs=new ActiveXObject("ADODB.Recordset");

            /**
            Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Y:/TEST/fiddler_web_service_analysis.accdb;Persist Security Info=False;
            **/

            //var access_db_path = "d:/fiddler_web_service_analysis.accdb" ;

            //con.ConnectionString="Data Source="+access_db_path;

    //ODBC DSN name ,config by windows odbc
            con.open("DSN=db_hsb_vs_ahs;") ;


            //FiddlerObject.alert(1);




            sql = "insert into  t_call_record (call_timestamp,request_send_timestamp,response_recv_timestamp,sitename,url,request,response,spend_second,content_type,content_length) values(" +
                strVar1(oSession.Timers.FiddlerBeginRequest) + "," +
                strVar1(oSession.Timers.ClientDoneRequest) + "," +
                strVar1(oSession.Timers.ServerDoneResponse) + "," +
                strVar1(oSession.RequestHeaders.AllValues("Host")) + "," +
                strVar1(oSession.url.Substring (0,whindex)) + "," +
                strVar1(oSession.RequestHeaders.ToString ()+oSession.GetRequestBodyAsString()) + "," +
                strVar1(oSession.ResponseHeaders.ToString ()+oSession.GetResponseBodyAsString()) + "," +
                etimes*1000  + "," +
                strVar1(oSession.ResponseHeaders.AllValues("Content-Type")) +"," +
                oSession.ResponseHeaders.AllValues("Content-Length")+0

                +");";

            //FiddlerObject.alert(sql);

            rs.open(sql,con);

            oSession["ui-color"] = "red";

            //rs.close();
            // rs=NULL;

            con.close();
            // con = NULL;



        }
        catch(exp)
        {

            var txt="Error description: " + exp.message + "\n\n" + sql;
            FiddlerObject.log(txt);
            oSession["ui-strikeout"] = "true";

        }

  1. 在此处【重定向urlplace】host和url的判断
  if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
	    oSession.hostname = "api.mobile.xxx.com"
		  }
  1. 在此处【设置请求的header】,测试网络爬虫时候会用,
// TSET FOR Spider: 根据网站来限定请求
if (oSession.HostnameIs("test.com")) {
    // 模拟修改请求的用户端ip,这种情况对独立的网络有效,对于公司级的网络,还是有一些问题,需要借助vpn
    oSession.oRequest["X-Forwarded-For"]="16.12.23.16";
    // 修改请求的header
    oSession.oRequest["User-Agent"] = "spider Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0";

}

2019.04.26 手机模拟添加cookie(区别于种cookie 在onBeforeResponse里)

  • 删除所有的cookie oSession.oRequest.headers.Remove("Cookie");
  • 新建cookie oSession.oRequest.headers.Add("Cookie", "username=testname;testpassword=P@ssword1");

注意: Fiddler script不能直接删除或者编辑单独的一个cookie, 你需要用replace方法或者正则表达式的方法去操作cookie的string

if (oSession.HostnameIs("******") && oSession.oRequest.headers.Exists("Cookie") ) {

    var sCookie = oSession.oRequest["Cookie"]; 
    //用replace方法或者正则表达式的方法去操作cookie的string
    //sCookie = sCookie.Replace("cookieName=", "ignoreme="); 
    sCookie = sCookie + ";tt_spver=1";

    oSession.oRequest["Cookie"] = sCookie; 
}


在此处修改response的bady内容【使用正则匹配方式】
   if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
        // 获取response中的body字符串
        var strBody=oSession.GetResponseBodyAsString();
        // 用正则表达式或者replace方法去修改string
        var regx = '"stream_mode":\d*?'
        strBody=strBody.replace(regx,'"stream_mode":0');
        // 弹个对话框检查下修改后的body               
        FiddlerObject.alert(strBody);
        // 将修改后的body,重新写回Request中
        oSession.utilSetResponseBody(strBody);
    }
在此处修改json中的数据【修改接口字段的值】
    if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
        // 获取Response Body中JSON字符串
        var responseStringOriginal =  oSession.GetResponseBodyAsString();
        // 转换为可编辑的JSONObject变量
        var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
        // 修改JSONObject变量,修改字段数据
        responseJSON.JSONObject["new_core"] = "True";  
        responseJSON.JSONObject["stream_mode"] = 5;
        // 重新设置Response Body
        var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
        oSession.utilSetResponseBody(responseStringDestinal);
	}
在此处修改json中的数据【增加接口字段=值】
    if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
        // 获取Response Body中JSON字符串
        var responseStringOriginal =  oSession.GetResponseBodyAsString();
        // 转换为可编辑的JSONObject变量
        var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
        // 修改JSONObject变量,修改字段数据
        responseJSON.JSONObject["type_arr"] = ["bullet"];
        // 重新设置Response Body
        var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
        oSession.utilSetResponseBody(responseStringDestinal);
        }
使指定URL支持CORS跨域请求有时候,你调用一个 json 接口,发现跨域了,你需要去找接口的开发人支持跨域,显然傻傻等待后端开发完毕再联调是低效率的, 这个时候就就要在后台改完之前就自己实现跨域的模拟,此时 fiddler 显然是再好不过的利器。支要持 CORS 跨域, 就是要为请求的返回头增加 Access-Control-Allow-Origin 属性,因此需要修改 OnBeforeResponse函数,在该函数的末尾添加你的 CORS 逻辑
    static function OnBeforeResponse(oSession: Session) {
        	...

        	if(oSession.uriContains("要处理的url")){
        		oSession.oResponse["Access-Control-Allow-Origin"] =  "允许的域名";
        		oSession.oResponse["Access-Control-Allow-Credentials"] = true;
        	}
    }








oSession常用的相关属性和方法
 // 修改session中的显示样式
 oSession["ui-color"] = "orange";
 // 移除http头部中的MQB-X5-Referer字段
 oSession.oRequest.headers.Remove("MQB-X5-Referer");
 // 修改http头部中的Cache-Control字段
 oSession.oRequest["Cache-Control"] = "no-cache";
 // 修改host
 oSession.host = "example.domain"; 
 // 修改Origin字段
 oSession.oRequest["Origin"] = "http://domain";
 // 删除所有的cookie
 oSession.oRequest.headers.Remove("Cookie");
 // 新建cookie
 oSession.oRequest.headers.Add("Cookie", "username=cookiename;");
 // 修改Referer字段
 oSession.oRequest["Referer"] = "https://yoururl";
 
 // 获取Request中的body字符串
 var strBody=oSession.GetRequestBodyAsString();
 // 用正则表达式或者replace方法去修改string
 strBody=strBody.replace("aaaa","bbbbbb");
 // 将修改后的body,重新写回Request中
 oSession.utilSetRequestBody(strBody);
// 判断连接中是否包含字符串str
oSession.uriContains(str)
// 给连接请求添加一个字段TEST
oSession.oRequest["TEST"]="TEST NEW Request";





可参考
https://github.com/gitjayzhen/FiddlerUseScript

Linux的ip命令-路由-网卡设备-统计

Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。Linux系统提供iproute2工具用于替代一些常用的net-tools命令,iproute2套件里提供了许多增强功能的命令,ip命令即是其中之一。

格式:

ip [options] object [command [arguments]]

主要参数
OPTIONS是修改ip行为或改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式。如link、addr、route、rule、tunnel 。
object是要管理者获取信息的对象。如网络接口类型eth0。
command设置针对指定对象执行的操作,它和对象的类型有关。一般情况下,ip支持对象的增加(add)、删除(delete)和展示(show或list)。有些对象不支持这些操作,或者有其它的一些命令。对于所有的对象,用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命令和参数的语法。如果没有指定对象的操作命令,ip会使用默认的命令。一般情况下,默认命令是list,如果对象不能列出,就会执行help命令。
arguments是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev是ip link命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0。命令的默认参数将使用default标出。

  1. IP地址管理
    设置和删除Ip地址
    设置一个IP地址,可以使用下列ip命令:
    ip addr add 192.168.0.193/24 dev wlan0
    请注意IP地址要有一个后缀,比如/24。这种用法用于在无类域内路由选择(CIDR)中来显示所用的子网掩码。在这个例子中,子网掩码是255.255.255.0。

需要查看是否已经生效。
ip addr show wlan0
删除IP地址
ip addr del 192.168.0.193/24 dev wlan0

  1. 路由管理
    列出路由表条目
    IP命令的路由对象的参数还可以帮助你查看网络中的路由数据,并设置你的路由表。第一个条目是默认的路由条目,你可以随意改动它。
    ip route show
    查看路由表
    假设现在你有一个IP地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等):

ip route get 119.75.216.20
查看路由包
添加默认路由
ip route add default via 192.168.202.254
添加网络路由
ip route add 192.168.4.0/24 via 192.168.4.1
修改网络路由
ip route change 192.168.4.0/24 dev eth1
设置NAT路由
ip route add nat 192.168.1.100 via 192.168.1.1
1.
查看某个路由表信息
ip route show table main
ip route show table local
ip route show table all

可以使用以下方式获取到特定ip的路由信息:

bob@ubuntu-20-04:~$ ip route get to 192.168.43.2


擦除所有路由表

ip route flush

擦除路由表的缓存

ip route flush cache

  1. 网络统计
    显示网络统计数据
    使用ip命令还可以显示不同网络接口的统计数据。
    ip -s link
    网络统计数据
    当你需要获取一个特定网络接口的信息时,在网络接口名字后面添加选项ls即可。使用多个选项-s会给你这个特定接口更详细的信息。特别是在排除网络连接故障时,这会非常有用。

ip -s -s link ls docker0

ip -s link ls docker0

  1. ARP管理
    查看ARP信息
    地址解析协议(ARP)用于将一个IP地址转换成它对应的物理地址,也就是通常所说的MAC地址。使用ip命令的neigh或者neighbour选项,你可以查看接入你所在的局域网的设备的MAC地址。
    ip neighbour
  2. 网络监测
    监控netlink消息
    可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。使用下面的命令:
    ip monitor all
  3. 网络接口设置
    激活和停止网络接口
    你可以使用ip命令的up和down选项来激某个特定的接口,就像ifconfig的用法一样。

停止网络接口eth0

ip link set eth0 down

启动网络接口eth0

ip link set eth0 up
修改设置传输队列的长度
ip link set dev eth0 txqueuelen 100

ip link set dev eth0 txqlen 100
修改网络设置MTU(最大传输单元)的值
ip link set dev eth0 mtu 1500
修改网卡的MAC地址
ip link set dev eth0 address 00:01:4f:00:15:f1

  1. 路由策略设置
    ip rule命令中包含add、delete、show(或者list)等子命令,注意:策略路由(policy routing)不等于路由策略(rouing policy)。在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、IP协议、传输层端口甚至数据包的负载。这就叫做:策略路由(policy routing)。

插入新的规则

ip rule add

删除规则

ip rule delete

显示路由表信息

ip rule list

子命令可以用如下缩写:add、a;delete、del、d

示例1: : 双网卡数据路由策略选择,让来自192.168.3.0/24的数据包走11.0.0.254这个网关,来自192.168.4.0/24的数据包走12.0.0.254这个网关

定义表
echo 10 clinet_cnc >>/etc/iproute2/rt_tables
echo 20 clinet_tel >>/etc/iproute2/rt_tables
把规则放入表中
ip rule add from 192.168.3.0/24 table clinet_cnc
ip rule add from 192.168.4.0/24 table clinet_tel
添加策略路由
ip route add default via 11.0.0.254 table clinet_cnc
ip route add default via 12.0.0.254 table clinet_tel
刷新路由表

ip route flush cache

来自51CTO博客作者计算机控制挖掘机炒菜?的原创作品

linux命令

docker ps命令用来展示所有运行中的容器

docker ps -a命令是用来展示所有的容器,包括未运行的容器

curl 是常用的命令行工具,用来请求 Web 服务器,它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具,

不带有任何参数时,curl 就是发出 GET 请求。


$ curl https://www.example.com

上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出。
#curl cip.cc 查询IP地址归属地

参考:https://www.ruanyifeng.com/blog/2019/09/curl-reference.html

ps

ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。

grep

命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

 ps -ef |grep

通过上述解释,可以得知ps是一个命令,grep是一个命令,中间的|代表管道命令,表示ps命令和grep命令同时执行

示范

ps -ef |grep python 这条命令代表检查python进程是否存在

显示列字段解释
  • UID      :程序被该 UID 所拥有
  • PID      :就是这个程序的 ID 
  • PPID    :则是其上级父程序的ID
  • C          :CPU使用的资源百分比
  • STIME :系统启动时间
  • TTY     :登入者的终端机位置
  • TIME   :使用掉的CPU时间。
  • CMD   :所下达的是什么指令

nload -m

查看所有网卡实时流量情况,-m参数表示不以图表,而以统计数据显示

du -sh 查看当前目录使用情况

du -sh * 查看当前目录下子目录使用情况,可以直接把*号变目录名来查目录空间使用情况

du -sh /*  表示根目录使用情况

df -ah df列出磁盘总容量、可用容量、使用%、接入点等信息,而du只是合计磁盘的使用量。-h选项表示人性化显示格式。

tail Linux中用于查看文件尾部的内容,与head相对应。
常用来查看日志文件,通过-f实时查看文件最新内容。

尤其是对于日志文件较大的时候,通过tail指定输出的行数来查看日志。

// 输出最后10行的内容
tail test.log

// 输出最后10行的内容,同时监视文件的变化,一旦变化就显示出来
tail -f test.log

// 输出最后n行的内容,同时监视文件的变化,一旦变化就显示出来
tail -nf test.log

// 输出文件最后10行的内容
tail -n 10 filename
// 除第9行不显示外,显示第10行到末尾行
tail -n -10 filename

// 从第20行至末尾
tail +20 test.log

// 显示最后10个字符
tail -c 10 test.log

// 实时日志查看与grep过滤关键字
// -A 除显示符合t匹配内容的那一行之外,并显示该行之后的内容
// -B 除显示符合匹配内容的那一行之外,并显示该行之前的内容
// -C 除显示符合匹配内容的那一列之外,并显示该列前后的内容
tail -f test.log | grep ‘test’ -C 5
tail -f test.log | grep ‘test’ -5

使用 PuTTY 安全复制客户端将文件传输到您的 Linux 实例

PuTTY 安全复制客户端 (PSCP) 是一个命令行工具,可用于在 Windows 计算机和 Linux 实例之间传输文件。

要使用 PSCP,您需要使用在使用 PuTTYgen 转换私有密钥中生成的私有密钥。您还需要使用 Linux 实例的公有 DNS 名称或 IPv6 地址(如果实例具有该地址)。

以下示例将 Sample_file.txt 文件从 Windows 计算机上的 C:\ 驱动器传输到 Amazon Linux 实例上的 instance-user-name 主目录。要传输文件,请使用以下命令之一。

  • (公有 DNS)要使用实例的公有 DNS 名称传输文件,请输入以下命令。pscp -i C:\path\my-key-pair.ppk C:\path\Sample_file.txt instance-user-name@instance-public-dns-name:/home/instance-user-name/Sample_file.txt
  • (IPv6) 或者,如果实例具有 IPv6 地址,要使用实例的 IPv6 地址传输文件,请输入以下命令。IPv6 地址必须用方括号 ([ ]) 括起来。pscp -i C:\path\my-key-pair.ppk C:\path\Sample_file.txt instance-user-name@[instance-IPv6-address]:/home/instance-user-name/Sample_file.txt

如果您更喜欢图形用户界面 (GUI),您可以使用一种叫作“WinSCP”的开源 GUI 工具。

WinSCP 是适用于 Windows 的基于 GUI 的文件管理器,您可以通过它来使用 SFTP、SCP、FTP 和 FTPS 协议将文件上传并传输到远程计算机。WinSCP 允许您将文件从 Windows 计算机拖放到 Linux 实例,或者在两个系统之间同步整个目录结构。

但您的 Linux 实例必须已安装 scp。对于某些操作系统,您需要安装 openssh-clients 软件包。对于其他操作系统(例如经 Amazon ECS 优化的 AMI),您需要安装 scp 软件包。请参阅您的 Linux 发行版的文档。

TCPing监听服务器的端口状态

当服务器设置了禁ping,TCPING可以监听服务器的端口状态,默认是80端口的,也可以指定其它端口。也可以看到ping 返回的时间

下载的tcping.exe或者tcping64.exe文件放到C:\Windows\System32目录下(ping命令也是在这个目录下)

“ tcping www.baidu.com”

“ tcping -t www.baidu.com 【参数-t 是让命令一直运行ping 】”

“ tcping -d -t www.baidu.com 【参数 -d 是显示时间,这样就可以更清楚了】”

“ tcping -d -t www.baidu.com 443/21 【这里只是举例,21是您所需要监听的端口,这个可以行定义。】”

无线路由下嗅探

1.openwrt路由下安装 tcpdump(可以将网络中传送的数据包完全截获下来提供分析)

  1. opkg update
  2. opkg install tcpdump

2.电脑装wireshark 和plink.exe(plink是putty下的一个工具,可以在windows下直连liunx并自动执行命令的工具)
https://www.wireshark.org/download.html
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

3.路由下tcpdump抓包,PC端使用 wireshark 实时监听

  1. plink.exe -ssh -pw admin root@192.168.4.1 “tcpdump -ni wlan0 -s 0 -w – not port 22” | “C:\Program Files\Wireshark\Wireshark.exe” -k -i –

  admin 是路由的密码,root是用户名 ,wlan0 无线网卡 的数据链路层代号,
  ifconfig 可以看到具体详细信息,tcpdump的指令就不多说了,看官方文档吧


4.分析数据报文,获取敏感信息

  假如你使用了我的wifi,登录了百度的主页,我就获取你的登录cookies,
  有了cookies可以不用密就能登录你的百度账号,  浏览你的各种百度云盘里面的内容。
   

  wireshark 添加过滤的条件“http.cookie“  获取cookies的相关报文,点中右键,follow tcp steam,看到完整的报文,

  复制 http 请求时向服务器发送的cookies 字符串
              

5.注入cookies,登录账号
chrome 下使用一个 CookieHacker的插件 ,下载 http://evilcos.me/?p=366
打开 baidu.com,把cookies的字符串粘贴,点击inject cookie

刷新一下就看到用户已经登录了
P.S. 除了这些以外,你发出的所有请求都能在wireshark里面分析出来,当然这只是最简单的嗅探而已,

s-s搭建记录

客户端下载地址

服务端一键安装脚本(安装的go版本,但电脑客户端一些加密方式好像不支持)

wget --no-check-certificate -O shadowsocks-go.sh https://raw.githubusercontent.com/poetries/shadowsocks_install/master/shadowsocks-go.sh

chmod +x shadowsocks-go.sh
./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log

安装完成后,脚本提示如下:

Congratulations, Shadowsocks-go install completed!
Your Server IP:your_server_ip
Your Server Port:your_server_port
Your Password:your_password
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:https://teddysun.com/392.html
Enjoy it!

卸载方法

./shadowsocks-go.sh uninstall

可以查看 Shadowsocks-go 进程是否已经启动。 本脚本安装完成后,已将 shadowsocks-go 加入开机自启动。

使用命令:

  • 启动:/etc/init.d/shadowsocks start
  • 停止:/etc/init.d/shadowsocks stop
  • 重启:/etc/init.d/shadowsocks restart
  • 状态:/etc/init.d/shadowsocks status

多用户多端口配置文件示例: 配置文件路径:/etc/shadowsocks/config.json

{
    "port_password":{
         "8989":"password0",
         "9001":"password1",
    },
    "method":"aes-256-cfb",
    "timeout":600
}

根据上面的在ubuntu上只能安装go版本,而只能手机端用,WIN客户端有的加密方式,GO版本都没有,最后在github上找到v2ray服务器安装脚本,用的aws东京但只在debian系统装测试成功。客户端WIN一般用v2rayN,手机端用v2rayNG,v2flyNG,大家可直接在github下载

自动安装脚本

bash <(curl -s -L https://git.io/v2ray.sh)

另外推荐XUI
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)

传送门

AWS云主机 及使用中的坑

前往亚马逊官网注册,自己根据里面的资料慢慢填写即可。填写过程中必须要绑定信用卡

信用卡账单,在亚马逊官网信用卡付费是不需要密码的,也就是根据你的信用卡正反面信息即可直接在网络上操作扣费(一般扣费都可以申请追回,最好申请资金进出短信提醒),自己的信用卡自己保护好。亚马逊当然不会恶意扣费,只是免费套餐限制多,超出部分是要扣费的;

白嫖教程

创建EC2实例

进入控制中心,先选择地区,右上角有地区选择。如果搭建SS,建议亚太地区,如果是纯粹的网站。那就根据你的目标用户的位置来选择了。

图片[2] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路

选择好了地区后,点击[服务]中的[EC2],现在我们就要开始创建EC2实例了。

图片[3] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路
图片[4] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路

选择“仅限免费套餐”,这里我选择的是Red Hat,因为Red Hat更接近于CentOS,习惯用CentOS了。

图片[5] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路

实例只能选择[符合条件的免费套餐],选择其他会产生费用的

然后创建密钥对,如果用putty连建议选ppk格式,否则要用工具再把ppm转成ppk,建好后

[安全组配置]选择默认规则就好了,稍后我们在[安全组]里修改为全部放行(注意入站、出站都要修改为全部放行)

图片[8] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路

设置[安全组配置]

图片[9] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路

查看实例,并用XFTP或者SSH连接

图片[10] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路

XFTP或者SSH上填写好登录地址和用户名后导入密钥

如果最后一步出现错误,那是账号还没有完全通过审核,需要等待5分钟-4小时,邮件收到通过审核后再去创建实例;

如果显示创建成功可以正常使用了,这里又个坑,每月的免费流量只有100G,超过后就会在你的信用卡上扣费,所以我们要监控云主机的流量不要超过100G的出站流量;可以直接登录后点用户名,选进到账户页面再选左边的“FREE TIER”来查看免费套餐的使用情况,也可以按下面方式来统计

可以进实例后点中间的“监控”,里面选“网络输入”(还有网络输出也一样)面板的右上角选“在指标中查看”

图片[13] - Amazon – AWS免费一年云主机 以及使用中的一些坑 - 云线路

这里修改统计数据为总和,周期为30天,把上面的线形图改成数字,这样就可以统计一个月的流量数据了,(也可以点击左上角[服务]选择[管理与监管]–[CloudWatch]在这个里面来统计),还可以把统计数据添加到控制面板里,以后就不用繁琐操作看流量统计了

但这里又有个坑,ec2-user这个用户权限太低,我们需要root的权限。登录用证书登录也很麻烦,也需要一并去掉。

可以后台直接连接主机,也可以用putty填好IP后在 连接-SSH-认证里把私钥(putty要ppk格式,如是ppm要用PuTTYgen把格式转为ppk)传上去后再连接主机,刚进去一般用户名是ec2-user,如ubuntu用户名是ubuntu,红帽是admin,用普通用户连上系统后

创建root的密码,输入如下命令:

sudo passwd root

会提示你输入new password。输入一个你要设置的root的密码,需要你再输入一遍进行验证;

接下来,切换到root身份,输入如下命令:

su root

给ec2-user加个密码,输入如下命令:

passwd ec2-user

使用root身份编辑亚马逊云主机的ssh登录方式,在/etc/ssh/sshd_config找到三个地方,把no改成yes 输入:

vi /etc/ssh/sshd_config

键盘P、i编辑,esc、:wq保存

PermitRootLogin yesPasswordAuthentication yesUsePAM yes

接下来,要重新启动下sshd,这里重启sshd命令有可能不会生效需要重启系统:

reboot

这样就可以使用root身份直接登录ssh了,接下来可以删除ec2-user这个用用户了:

uesrdel -r ec2-user

这里还有个情况需要说明下,用Red Hat系统的话我是实测无法安装军哥的LNMP和宝塔的,也就是说如果需要安装网站环境的话需要自己编译WEB环境,或者更换成UBUNTU系统使用LNMP或者宝塔(这里我没测试),本人只用来搭建SS扶墙。

下面说下安装秋水的SS一键脚本,使用Shadowsocks-python版本无法搭建成功,这里我测试安装成功的是Shadowsocks-go,希望大家不要走弯路。

总结

注册AWS要使用从未在AWS上用过的信用卡,不然你就不符合Free Tier的使用条件,所有服务将会按需收费,申请免费成功后免费服务只有一年的有效期,到期时记得导出数据并停止所有服务;

免费额度只够创建一个EC2实例;

创建实例时,要选带有免费提示的操作系统,这类系统是免费提供的,不另收费;

建站时不要使用RHEL(Red Hat Enterprise Linux),此系统占用的EBS空间大而且极费IO,每月200万的免费IO可能不出几天就能耗完;

每月的免费存储是5G,注意不要超出这个上限,另外GET,POST等操作可能会超出免费额度;

流入AWS的流量完全是免费的,但每月的免费流出流量只有15G,超出部分就要收费了。而且这15G对于所有的AWS服务来说是共享的。托管一个小网站,架设个SS,明显不够用嘛;

基本监控是免费的,再高级别的就要收费了。免费监控虽说不够详细,但是足够让我们了解服务器最近一段时间的运行状况了,没必要使用高级别的监控服务;

因为实例每次停止再启动,IP都会变,所以如果经常停止,可以申请绑个弹性IP,把IP固定下来,绑在实例上的弹性IP是不收费的,但弹性IP没有捆绑到EC2实例时,一定要记得释放,如免费实例到期后弹性IP也要放,不然它会按小时收费。而且每月g头100次捆绑Elastic IP到EC2实例是免费的,超出则收费啦;