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实例是免费的,超出则收费啦;