MoreRSS

site iconAnZhihe | 安志合修改

国学和传统文化爱好者,IT行业从业者,运维和SRE。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

AnZhihe | 安志合的 RSS 预览

Mac配置有线内网和无线Wi-Fi公网同时使用

2024-12-09 05:54:30

最近去客户机房部署服务,由于还没有并网,只能连根网线访问机房环境,但插入网线后发现连的 Wi-Fi 热点不起作用,只能访问内网,无法访问外网。拔掉网线后Wi-Fi恢复正常。想着应该是网络优先级的问题,需要让内网机房访问走有线,外网访问走Wi-Fi,解决方法:

1、修改网络偏好设置,自定义网络使用的先后顺序,优先使用 Wi-Fi 上网

1733412661786212.png

2、给访问的内网环境的网段(10.240.0.0/16)添加指定路由,让内网网段的访问走网线而不是 Wi-Fi

# 10.240.0.0/16 是内网网段,10.240.251.250 是网关地址
$ sudo route add "10.240.0.0/16" "10.240.251.250"

$ route get 10.240.0.0/16
   route to: 10.240.0.0
destination: 10.240.0.0
       mask: 255.255.0.0
    gateway: 10.240.251.250
  interface: en4
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>

3、使用ssh隧道代理通过跳板机访问内网环境

ssh -qTfnND 12345 [email protected]

1733413106240166.png

1733413242786485.png

route命令使用

route

  手动操作路由表。
  需要 root 权限。
  更多信息:https://keith.github.io/xcode-man-pages/route.8.html.

  通过网关向目标添加路由:

    sudo route add "路由 ip 地址" "网关地址"

  通过网关向 子网 / 24 添加路由:

    sudo route add "子网 ip/24" "网关地址"

  在测试模式下运行(不做任何操作,只打印):

    sudo route -t add "路由 ip 地址/24" "网关地址"

  删除所有路由:

    sudo route flush

  删除特定路由:

    sudo route delete "路由 ip 地址/24"

  查找并显示目标的路由(主机名或 IP 地址):

    sudo route get "目标"
    
查看路由表:
linux:route -n
Mac:netstat -rn


参考:

柳永二十首经典诗词

2024-12-07 00:51:09

在宋词史上,柳永是一个不得不说的人物。


他是第一个职业词人,也是第一个大量创制慢词的词人,据统计,在宋词880多个词调中 ,柳永首次使用的就有一百多个。


柳永从根本上改变了唐五代以来词坛上小令一统天下的格局,使慢词与小令两种体式平分秋色,齐头并进。


在内容上,柳永的词既有爱情的婉约,又有怀才不遇,天涯沦落的伤怀。他擅雅致之语,也擅俚俗之语,丰富了词的内容与表现形式,对宋词的发展产生了深远影响。


ly1.jpeg


作为第一位对宋词进行全面革新的大词人,柳永对后来词人影响甚大。南北宋之交的王灼即说“今少年妄谓东坡移诗律作长短句,十有八九不学柳耆卿,则学曹元宠”;即使是苏轼、黄庭坚、秦观、周邦彦等著名词人,也无不受惠于柳永。


ly2.png


01


《蝶恋花·伫倚危楼风细细》


伫倚危楼风细细,

望极春愁,黯黯生天际。

草色烟光残照里,无言谁会凭阑意。


拟把疏狂图一醉,

对酒当歌,强乐还无味。

衣带渐宽终不悔,为伊消得人憔悴。


这是一首怀人之作,全词巧妙地把飘泊异乡的落魄感受,同怀念意中人的缠绵情思融为一体,表现了主人公坚毅的性格与执着的态度,成功地刻画了一个志诚男子的形象。


1733500661837393.png


02


《雨霖铃·寒蝉凄切》


寒蝉凄切,

对长亭晚,骤雨初歇。

都门帐饮无绪,留恋处,兰舟催发。

执手相看泪眼,竟无语凝噎。

念去去,千里烟波,暮霭沉沉楚天阔。


多情自古伤离别,

更那堪,冷落清秋节!

今宵酒醒何处?杨柳岸,晓风残月。

此去经年,应是良辰好景虚设。

便纵有千种风情,更与何人说?


柳永与心上人虫娘分别,写下这首依依惜别之作,此作遣词造句不着痕迹,绘景直白自然,场面栩栩如生,将情人惜别时的真情实感表达得缠绵悱恻,凄婉动人,堪称抒写别情的千古名篇,也是柳词和婉约词的代表作。


1733501841284590.jpeg


03


《望海潮·东南形胜》


东南形胜,

三吴都会,钱塘自古繁华。

烟柳画桥,

风帘翠幕,参差十万人家。

云树绕堤沙,

怒涛卷霜雪,天堑无涯。

市列珠玑,户盈罗绮,竞豪奢。


重湖叠巘清嘉,

有三秋桂子,十里荷花。

羌管弄晴,

菱歌泛夜,嬉嬉钓叟莲娃。

千骑拥高牙,

乘醉听箫鼓,吟赏烟霞。

异日图将好景,归去凤池夸。


此词主要描写杭州的富庶与美丽,以大开大阖、波澜起伏的笔法,浓墨重彩地铺叙展现了杭州的繁荣、壮丽景象,音律协调,情致婉转,是柳永的一首传世佳作。


1733501090408269.jpeg


04


《八声甘州·对潇潇暮雨洒江天》


对潇潇暮雨洒江天,一番洗清秋。

渐霜风凄紧,关河冷落,残照当楼。

是处红衰翠减,苒苒物华休。

唯有长江水,无语东流。


不忍登高临远,

望故乡渺邈,归思难收。

叹年来踪迹,何事苦淹留。

想佳人妆楼颙望,

误几回、天际识归舟。

争知我,倚阑杆处,正恁凝愁!


此词抒写了作者漂泊江湖的愁思和仕途失意的悲慨。全词语浅而情深,融写景、抒情为一体,通过描写羁旅行役之苦,表达了强烈的思归情绪,写出了封建社会知识分子怀才不遇的典型感受,从而成为传诵千古的名篇。


1733501192342580.png


05

《鹤冲天·黄金榜上》


黄金榜上,偶失龙头望。

明代暂遗贤,如何向。

未遂风云便,争不恣狂荡。

何须论得丧?

才子词人,自是白衣卿相。


烟花巷陌,依约丹青屏障。

幸有意中人,堪寻访。

且恁偎红倚翠,风流事,平生畅。

青春都一饷。

忍把浮名,换了浅斟低唱!


此词是柳永青年时参加科举考试落榜不第后所作。全词表现了词人恃才傲物、狂放不羁的个性与怀才不第的牢骚和感慨。


1733501431822290.jpeg


06


《少年游·长安古道马迟迟》


长安古道马迟迟,高柳乱蝉嘶。

夕阳鸟外,秋风原上,目断四天垂。


归云一去无踪迹,何处是前期?

狎兴生疏,酒徒萧索,不似少年时。


此词写深秋时节在长安路上的所见所思,上阕从秋天景象写起,而悲慨尽在言外;下阕则以“归云”为喻象,写一切期望之落空,最后三句以悲叹作者之落拓无成作结。全词情景相生,虚实互应,堪称是作者悲苦一生的高度概括和真实写照


1733500801966960.png


07


《玉蝴蝶·望处雨收云断》


望处雨收云断,

凭阑悄悄,目送秋光。

晚景萧疏,堪动宋玉悲凉。

水风轻,蘋花渐老,

月露冷、梧叶飘黄。遣情伤。

故人何在,烟水茫茫。


难忘,文期酒会,

几孤风月,屡变星霜。

海阔山遥,未知何处是潇湘。

念双燕、难凭远信,

指暮天、空识归航。

黯相望。断鸿声里,立尽斜阳。


此为怀念湘中故人所写的作品。全词以抒情为主,把写景和叙事、忆旧和怀人、羁旅和离别、时间和空间,融汇为一个浑然的艺术整体,具有很强的艺术感染力。


1733502090137328.png


08


《忆帝京·薄衾小枕凉天气》


薄衾小枕凉天气,乍觉别离滋味。

展转数寒更,起了还重睡。

毕竟不成眠,一夜长如岁。


也拟待、却回征辔;

又争奈、已成行计。

万种思量,多方开解,

只恁寂寞厌厌地。

系我一生心,负你千行泪。


这是一首相思词,描写了诗人辗转难眠,由“乍觉”到饱受煎熬,再到苦苦挣扎,最后发出真挚的誓言的心理历程,层转层深,历历在目,整首词纯用口语白描来表现词人的内心感受,艺术表现手法新颖别致,是颇具特色的一首小词。


1733502190114302.png


09


《定风波·自春来》


自春来、惨绿愁红,芳心是事可可。

日上花梢,莺穿柳带,犹压香衾卧。

暖酥消、腻云亸,终日厌厌倦梳裹。

无那。恨薄情一去,音书无个。


早知恁么,悔当初、不把雕鞍锁。

向鸡窗,只与蛮笺象管,拘束教吟课。

镇相随、莫抛躲,针线闲拈伴伊坐。

和我。免使年少,光阴虚过。


此词为代言体,以思妇的口吻诉说内心的痛苦,字里行间流露出作者对歌妓们的深怜痛惜之情。全词语言明白浅显,直写歌妓们的闺房生活,冲破了当时蕴藉典雅的词风,成为柳词中“俚词”的代表作。


1733502244158166.png


010


《昼夜乐·洞房记得初相遇》


洞房记得初相遇。

便只合、长相聚。

何期小会幽欢,变作离情别绪。

况值阑珊春色暮,

对满目、乱花狂絮。

直恐好风光,尽随伊归去。


一场寂寞凭谁诉。

算前言、总轻负。

早知恁地难拚,悔不当时留住。

其奈风流端正外,

更别有,系人心处。

一日不思量,也攒眉千度。


这是一首回忆往昔欢聚和抒写相思的词。作者塑造了一个独居索寞、伤春怀人的思妇形象。词中以长调的形式,纵横驰骋,铺叙展衍,层层递进,把女主人公细腻深婉的内心世界表现得曲折往复,使读者清晰地感觉到了她的个性与生命的真实存在。

[zkqw]

1733502370657537.png


011


《曲玉管·陇首云飞》


陇首云飞,江边日晚,

烟波满目凭阑久。

一望关河萧索,千里清秋,忍凝眸?

杳杳神京,盈盈仙子,

别来锦字终难偶。

断雁无凭,冉冉飞下汀洲,思悠悠。


暗想当初,有多少、幽欢佳会,

岂知聚散难期,翻成雨恨云愁?

阻追游。每登山临水,

惹起平生心事,一场消黯,

永日无言,却下层楼。


这是一首写两地相思的羁旅别愁词。上阕写居者高楼凝望、怀念远人之愁思。中阕写游子在旅途对京都居者的思念。下阕“暗想当初”承上阕“思悠悠”,是行人的忆念及“雨恨云愁”的心理活动。全词以写景抒情为脉络,步步深入,结构有序,内容丰富。


1733502434809454.png


012


《少年游·参差烟树灞陵桥》


参差烟树灞陵桥,风物尽前朝。

衰杨古柳,几经攀折,憔悴楚宫腰。


夕阳闲淡秋光老,离思满蘅皋。

一曲阳关,断肠声尽,独自凭兰桡。


此词上阕写离开长安时所见;下阕以抒情为主,写离别长安时置身舟中的感受。全词通过描写富有寓意和韵味的景物来表达悲愁与离愁、羁旅与感昔的双重惆怅,使人触景生情,见微知著。


1733503248772836.jpeg


013


《二郎神·炎光谢》


炎光谢。过暮雨、芳尘轻洒。

乍露冷风清庭户,

爽天如水,玉钩遥挂。

应是星娥嗟久阻,叙旧约、飙轮欲驾。

极目处、微云暗度,耿耿银河高泻。


闲雅。须知此景,古今无价。

运巧思、穿针楼上女,

抬粉面、云鬟相亚。

钿合金钗私语处,算谁在、回廊影下。

愿天上人间,占得欢娱,年年今夜。


这是一首咏七夕佳期的作品。作者把“天街夜色凉如水”的意象世界与“钿合金钗私语处”的心灵世界和谐地统一起来,描绘了一幅欢乐、祥和、幸福而又温馨的七夕夜色图,发出了珍惜良宵、莫负美景的呼唤。


ly13.png


014


《破阵乐·露花倒影》


露花倒影,烟芜蘸碧,灵沼波暖。

金柳摇风树树,系彩舫龙舟遥岸。

千步虹桥,参差雁齿,直趋水殿。

绕金堤、曼衍鱼龙戏,

簇娇春罗绮,喧天丝管。

霁色荣光,望中似睹,蓬莱清浅。


时见。凤辇宸游,

鸾觞禊饮,临翠水、开镐宴。

两两轻舠飞画楫,竞夺锦标霞烂。

罄欢娱,歌鱼藻,徘徊宛转。

别有盈盈游女,各委明珠,

争收翠羽,相将归远。

渐觉云海沈沈,洞天日晚。


此词描绘北宋仁宗时每年三月一日以后君臣士庶游赏汴京金明池的盛况。词人用浓攀重彩、层层铺叙的笔法,描绘出一幅当时都城的气象宏伟而又花团锦簇的社会风俗画卷。


1733503005747478.png


015


《彩云归·蘅皋向晚舣轻航》


蘅皋向晚舣轻航。

卸云帆、水驿鱼乡。

当暮天、霁色如晴昼,

江练静、皎月飞光。

那堪听、远村羌管,引离人断肠。

此际浪萍风梗,度岁茫茫。


堪伤。朝欢暮散,

被多情、赋与凄凉。

别来最苦,襟袖依约,尚有余香。

算得伊、鸳衾凤枕,夜永争不思量。

牵情处,惟有临歧,一句难忘。


据说,这是柳永思念妻子之作,全词语言极其雅致、意境极其苍茫凄美、绘景抒情都极好。而且相思之情隐然结合了身世漂泊、志意追寻与落空的感慨,情感抒发十分丰满。


1733503448433215.png


016


《鹤冲天·闲窗漏永》


闲窗漏永,月冷霜花堕。

悄悄下帘幕,残灯火。

再三追往事,离魂乱、愁肠锁。

无语沉吟坐。

好天好景,未省展眉则个。


从前早是多成破。

何况经岁月,相抛嚲。

假使重相见,还得似、旧时么。

悔恨无计那。

迢迢良夜。自家只恁摧挫。


《鹤冲天·闲窗漏永》表达了浓浓的相思之情。词中展现了主人公拾起一段既抛不开、又提不起的感情经历,并以刹那间的感情体验消磨自己的生命过程,无异一位悔恨无已的歌妓的内心独白,令人震撼。


ly17.png


017


《戚氏·晚秋天》


晚秋天,一霎微雨洒庭轩。

槛菊萧疏,井梧零乱,惹残烟。

凄然,望江关,飞云黯淡夕阳间。

当时宋玉悲感,向此临水与登山。

远道迢递,行人凄楚,倦听陇水潺湲。

正蝉吟败叶,蛩响衰草,相应喧喧。


孤馆,度日如年。

风露渐变,悄悄至更阑。

长天净,绛河清浅,

皓月婵娟。思绵绵。

夜永对景,那堪屈指,暗想从前。

未名未禄,绮陌红楼,往往经岁迁延。


帝里风光好,当年少日,暮宴朝欢。

况有狂朋怪侣,遇当歌对酒竞留连。

别来迅景如梭,

旧游似梦,烟水程何限。

念名利,憔悴长萦绊。

追往事、空惨愁颜。

漏箭移,稍觉轻寒。

渐呜咽,画角数声残。

对闲窗畔,停灯向晓,抱影无眠。


《戚氏·晚秋天》词是柳永自制的新调之一,共三片,长达212字,是宋词中仅次于南宋吴文英《莺啼序》(240字)的最长的慢词。


这首词以时间为序,从黄昏、深夜到清晓,将秋天的远景与近景、词人的往事与旧情以及客居驿馆的幽思遐想渐次序入,词境纷陈而错综有序。


18.png


018


《迷神引·一叶扁舟轻帆卷》


一叶扁舟轻帆卷。暂泊楚江南岸。

孤城暮角,引胡笳怨。

水茫茫,平沙雁、旋惊散。

烟敛寒林簇,画屏展。

天际遥山小,黛眉浅。


旧赏轻抛,到此成游宦。

觉客程劳,年光晚。

异乡风物,忍萧索、当愁眼。

帝城赊,秦楼阻,旅魂乱。

芳草连空阔,残照满。

佳人无消息,断云远。


这是柳永晚年游宦的作品,被选入《宋词三百首》。此词上阕写江上景色。下阕抒情,写对往昔的回忆。全词语言直白浅显,清醇优雅,把深厚的感情寄于大量的意象之中,真挚感人,充分抒发了对羁宦生涯的厌恶和对往昔快乐生活的向往之情,情调凄清,气韵沉郁,达到很高的艺术水平。


1733502586844241.jpeg


019


《采莲令·月华收》


月华收,云淡霜天曙。

西征客、此时情苦。

翠娥执手送临歧,轧轧开朱户。

千娇面、盈盈伫立,

无言有泪,断肠争忍回顾。


一叶兰舟,便恁急桨凌波去。

贪行色、岂知离绪,

万般方寸,但饮恨,脉脉同谁语。

更回首、重城不见,

寒江天外,隐隐两三烟树。


这首送别词,既表现了送行者的无限依恋,也抒写了行人的感怀。把送别和别后相思的情景,层层铺开。深刻细致地写出了人物的感受。不仅情景“妙合”,而且写景、抒情、叙事自然融合,完美一致。


1733503689930442.png


020


《浪淘沙慢·梦觉透窗风一线》


梦觉透窗风一线,寒灯吹息。

那堪酒醒,又闻空阶,夜雨频滴。

嗟因循、久作天涯客。

负佳人、几许盟言,

便忍把、从前欢会,陡顿翻成忧戚。


愁极,再三追思,洞房深处,

几度饮散歌阑,香暖鸳鸯被。

岂暂时疏散,费伊心力。

殢云尤雨,有万般千种,相怜相惜。


恰到如今,天长漏永,无端自家疏隔。

知何时、却拥秦云态?

愿低帏昵枕,轻轻细说与,

江乡夜夜,数寒更思忆。


此词以主人公自责、自悔、自怨为线索,以追忆昔日欢情为主脉,委婉曲折地诉说征客缠绵凄楚的相思之情。全词感情真挚,构思精巧,从不同角度、不同方位,多层次、多姿态地展现主人公的心理状态和情思活动,体现出一定的立体感。


来自:https://mp.weixin.qq.com/s/N3jrG0XodKqcInKrvURDIA


参考:他的“淫词”太经典,整个时代边骂边唱

[/zkqw]

SSH隧道原理及端口转发使用

2024-12-02 05:18:24

1732863540322055.png

SSH 隧道介绍:

SSH 隧道,也称为 SSH 端口转发,是一种利用 SSH 连接在两台机器之间创建安全加密通道的技术。可以通过一个安全的 SSH 连接来转发网络流量,从而绕过防火墙、访问受限网络资源或增强网络安全性。

SSH 隧道的工作原理:

SSH 隧道利用 SSH 连接的加密特性,将所有通过隧道的网络流量进行加密。 这使得即使在不安全的网络环境中,数据传输也保持安全。 SSH 客户端充当转发器,将本地流量转发到远程服务器,然后远程服务器再将流量转发到最终目的地。理解其工作原理和各种使用场景,可以更好地利用 SSH 隧道来提高网络安全性并访问受限资源。

SSH 隧道的类型:

SSH 隧道主要有三种类型:

  1. 本地端口转发 (Local Port Forwarding): 将本地机器上的一个端口转发到远程机器上的另一个端口。 这通常用于访问远程机器上运行的服务,而这些服务可能无法直接从本地机器访问(例如,由于防火墙限制)。

  • ssh -L <local_port>:<remote_host>:<remote_port> <user>@<ssh_server> 将本地 <local_port> 转发到远程主机 <remote_host> 的 <remote_port>

  • 远程端口转发 (Remote Port Forwarding): 将远程机器上的一个端口转发到本地机器上的另一个端口。 这通常用于让远程机器上的用户访问本地机器上的服务。

    • ssh -R <remote_port>:<local_host>:<local_port> <user>@<ssh_server> 将远程主机 <ssh_server> 的 <remote_port> 转发到本地主机 <local_host> 的 <local_port>

  • 动态端口转发 (Dynamic Port Forwarding): 创建一个 SOCKS 代理服务器,允许本地机器上的所有应用程序通过 SSH 连接访问网络。 这对于访问受限网络或匿名浏览非常有用。

    • ssh -D <local_port> <user>@<ssh_server> 创建一个 SOCKS5 代理,监听本地 <local_port>

    创建SSH隧道命令示例:

    ssh -qTfnND <local_port>:<remote_host>:<remote_port> <user>@<ssh_server_host>
    • <local_port>: 本地机器上监听的端口号,本地应用程序将连接到此端口。

    • <remote_host>: 远程服务器的主机名或 IP 地址,你希望通过隧道访问的服务器。

    • <remote_port>: 远程服务器上监听的端口号。

    • <user>: 远程 SSH 服务器的用户名。

    • <ssh_server_host>: SSH 服务器的主机名或 IP 地址。

    其中各个参数的含义如下:

    • ssh: 调用 SSH 客户端程序。

    • -q: 静默模式,抑制大部分输出信息。

    • -T: 告诉 SSH 客户端不要分配伪终端。这对于仅用于隧道建立的连接非常重要,因为它防止了 SSH 客户端尝试执行交互式 shell。

    • -f: 后台运行模式。连接建立后,SSH 客户端会进入后台运行,不会阻塞当前终端。

    • -N: 不执行远程命令。这表示 SSH 连接只用于建立隧道,不会在远程主机上执行任何命令。

    • -D: 本地动态端口转发。这将创建一个 SOCKS5 代理,允许本地应用程序通过 SSH 隧道访问网络。

    使用场景:

    SSH 隧道在各种场景中都非常有用,包括:

    • 访问受限网络资源: 如果本地机器无法直接访问远程服务器上的某个服务(例如,由于防火墙限制),可以使用本地端口转发创建一个 SSH 隧道,从而访问该服务。 这在访问公司内部网络、云服务器上的私有服务或其他受限网络资源时非常有用。

    • 安全地访问公共 Wi-Fi: 在公共 Wi-Fi 网络上,网络流量可能容易被窃听。 使用 SSH 隧道可以加密网络流量,保护数据安全。

    • 绕过地理限制: 某些网站或服务可能在某些地区被屏蔽。 使用 SSH 隧道可以通过一个位于不受限制地区的服务器访问这些资源。

    • 访问数据库: 如果数据库服务器位于防火墙后面,可以使用 SSH 隧道安全地访问数据库,而无需在防火墙上打开数据库端口。

    • 安全远程桌面访问: 可以使用 SSH 隧道来安全地访问远程桌面,即使远程桌面服务器的端口被防火墙阻止。

    • 开发和测试: 在开发和测试过程中,可能需要访问本地机器上的服务,而这些服务可能无法直接从远程机器访问。 SSH 隧道可以帮助解决这个问题。

    使用示例:

    工作中,由于网络或安全限制等原因需要使用一台代理转发机器开个口子访问内网服务,使用SSH隧道动态端口转发是常用解决方案。

    yourmachine-remotehost.jpg

    命令如下:

    ssh -qTfnND 1234 remoteuser@remotehost

    这个命令会在本地机器上创建一个 SOCKS5 代理,监听 1234 端口,我们可以使用本地浏览器作为访问客户端(推荐安装 Proxy SwitchyOmega 代理插件),配置 127.0.0.1:1234 代理将访问转发到远程入口机器,然后访问到内网服务,可以在本地和远程代理机器 /etc/hosts 文件中绑定要访问的域名解析地址。如果使用 SOCKS5 代理协议浏览器访问白屏,可以换成 SOCKS4 协议试试。

    1732863378415701.png

    还有种常用的方式就是直接将远程入口机器做成代理转发服务器,或者使用云厂商SLB作为入口转发,使用LB这种配置域名转发,防火墙安全访问都会更安全方便,然后在本地浏览器将代理地址配置成 远程入口机器地址加端口SLB地址加端口 就行。

    1732863483643213.png

    SSH Config配置:

    如果经常需要使用端口转发,可以将其写入到 ~/.ssh/config 配置文件中,省去在命令中添加选项和参数,示例如下:

    Host ops  # 别名
        HostName 10.123.234.1            # SSH服务器IP
        User anzhihe                     # SSH服务器用户名
        IdentityFile ~/.ssh/id_rsa_xxx   # 私钥文件
        Port 22                          # SSH服务器端口
        LocalForward 8443 127.0.0.1:443  # 本地端口转发(将本地8443端口的所有请求转发到远程主机的443端口)
        RemoteForward 80 127.0.0.1:80    # 远程端口转发(将远程主机的80端口的所有请求转发到本地主机的80端口)
        DynamicForward 127.0.0.1:1080    # 动态端口转发(将本地主机的1080端口作为socks5代理)
        ProxyCommand nc -X 5 -x IP:1080 %h %p # 将SSH服务器的请求转发到IP:1080端口
        ServerAliveInterval 120          # 每120秒向SSH Server发送心跳包,默认累积三次超时即认为失去连接(在客户端设置)
        ClientAliveInterval 120          # 每120秒向客户端发送心跳包,确保在客户端不响应时关闭连接(在SSH服务端设置)
        ExitOnForwardFailure=yes         
        StrictHostKeyChecking=no
        Compression=yes
        ForwardAgent=yes
        
    Host *
        User root
        KexAlgorithms +diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
        PubkeyAcceptedAlgorithms +ssh-rsa
         HostKeyAlgorithms +ssh-rsa
        ServerAliveInterval 30
        ControlMaster auto
        ControlPath /tmp/ssh-%r@%h:%p
        ControlPersist yes
        StrictHostKeyChecking=no
        Compression=yes
        ForwardAgent=yes

    → ssh config file examples

    ### default for all ##
    ## Set override as per host ##
    Host server1
         HostName server1.cyberciti.biz
         User nixcraft
         Port 4242
         IdentityFile /nfs/shared/users/nixcraft/keys/server1/id_rsa
     
    ## Home nas server ##
    Host nas01
         HostName 192.168.1.100
         User root
         IdentityFile ~/.ssh/nas01.key
     
    ## Login AWS Cloud ##
    Host aws.apache
         HostName 1.2.3.4
         User wwwdata
         IdentityFile ~/.ssh/aws.apache.key
     
    ## Login to internal lan server at 192.168.0.251 via our public uk office ssh based gateway using ##
    ## $ ssh uk.gw.lan ##
    Host uk.gw.lan uk.lan
         HostName 192.168.0.251
         User nixcraft
         ProxyCommand  ssh [email protected] nc %h %p 2> /dev/null
     
    ## Our Us Proxy Server ##
    ## Forward all local port 3128 traffic to port 3128 on the remote vps1.cyberciti.biz server ## 
    ## $ ssh -f -N  proxyus ##
    Host proxyus
        HostName vps1.cyberciti.biz
        User breakfree
        IdentityFile ~/.ssh/vps1.cyberciti.biz.key
        LocalForward 3128 127.0.0.1:3128
     
    ## Now set defaults for all if not matched by any hosts ##
    Host *
         ForwardAgent no
         ForwardX11 no
         ForwardX11Trusted yes
         User nixcraft
         Port 22
         Protocol 2
         ServerAliveInterval 60
         ServerAliveCountMax 30
    
    ## Reuse an existing TCP connection for multiple concurrent SSH sessions.
    Host server1
            HostName server1.cyberciti.biz
            ControlPath ~/.ssh/controlmasters/%r@%h:%p
            ControlMaster auto
    
    ## Through one host to reach another server i.e. jump host using ProxyCommand
    Host internal
      HostName 192.168.1.100
      User vivek
      ProxyCommand ssh [email protected] -W %h:%p
      ControlPath ~/.ssh/controlmasters/%r@%h:%p
      ControlMaster auto
    
    ## Overriding ssh config file option
    Host ln.openvpn-sg-vpn1 ln.wireguard-sg-vpn1
         Hostname 172.16.0.1
         User vivek
         port 22
         IdentityFile ~/.ssh/id_ed25519.pub
         StrictHostKeyChecking no
    
    ## create a new bash shell alias as follow ##
    ## create the alias use the following syntax in your ~/.bashrc file
    alias server1="ssh -i /nfs/shared/users/nixcraft/keys/server1/id_rsa -p 4242 [email protected]"

    创建SSH端口转发用户:

    建议为端口转发建立专门的账户,使用随机密码(当然使用私钥登录更好),并且禁掉其执行命令的权限。

    # add user tunnel-user for ssh port forwarding
    sudo useradd -m tunnel-user
    # generate 10 random passwords with 16 length
    pwgen -sy1 16 10
    # pick one password and set it to tunnel-user
    sudo passwd tunnel-user
    # disable shell for tunnel-user
    sudo chsh -s /bin/false tunnel-user

    注意事项:

    • SSH 密钥认证: 始终优先使用 SSH 密钥认证而不是密码认证,以提高安全性。

    • 防火墙配置: 确保你的本地和远程防火墙允许 SSH 连接和端口转发。

    • 端口选择: 选择一个不太常用的本地端口号,以减少安全风险。

    • 服务器信任: 确保能信任使用的 SSH 服务器,始终优先考虑安全性,并采取适当的措施来保护数据。

    记住将示例中的占位符替换为实际的服务器地址、端口号和用户名。 选择一个未被使用的本地端口号。可以使用 ps aux | grep ssh 命令来检查 SSH 进程是否在后台运行。 要终止隧道,可以找到 SSH 转发进程的 PID 并使用 kill <PID> 命令终止它。


    参考:

    k8s 污点(Taint) 和容忍度(Toleration)使用

    2024-11-27 22:55:08

    Kubernetes 的污点 (Taint) 容忍度 (Toleration) 是强大的机制,用于控制 Pod 在节点上的调度。它们允许对节点进行标记,并指定哪些 Pod 可以忽略这些标记并仍然被调度到这些节点上。 这对于实现节点隔离、资源专用以及处理节点维护非常有用,Kubernetes 污点和容忍度还可以与其他调度功能(如节点亲和性)结合使用。

    污点 (Taint):

    污点应用于节点,表示节点的一些特性或限制。 它本质上是一个标记,告诉 Kubernetes 调度程序避免将某些 Pod 调度到该节点。 一个污点包含三个部分:

    • key: 污点的键,一个字符串,用于标识污点的类型。

    • value: 污点的值,一个字符串,提供关于污点类型的更多信息。可以为空字符串。

    • effect: 污点的效果,决定污点如何影响 Pod 的调度。 有三种效果:

      • NoSchedule:阻止 Pod 调度到该节点,除非 Pod 有匹配的容忍度。

      • PreferNoSchedule:调度程序会尽量避免将 Pod 调度到该节点,但如果必要,仍然可以调度。

      • NoExecute:驱逐节点上已经存在的、没有匹配容忍度的 Pod。 这通常用于维护。

    容忍度 (Toleration):

    容忍度应用于 Pod,表示 Pod 可以容忍某些节点上的污点。 它允许 Pod 被调度到具有匹配污点的节点上。 一个容忍度包含四个部分:

    • key: 容忍度的键,必须与节点污点的键匹配。

    • operator: 运算符,指定如何匹配污点的值。 可以是:

      • Equal:污点的值必须与容忍度的值完全匹配。

      • Exists:只要污点的键存在即可,忽略污点的值。

    • value: 容忍度的值,如果 operator 为 Equal,则必须与污点的值匹配。

    • effect: 容忍度的效果,必须与节点污点的效果匹配。

    使用场景:

    • 专用节点: 将节点标记为仅用于特定类型的应用程序。 例如,将节点标记为 gpu=true:NoSchedule,只有具有 gpu=true:NoSchedule 容忍度的 Pod 才能调度到该节点。

    • 节点维护: 在节点进行维护之前,使用 NoExecute 效果的污点驱逐节点上的 Pod,然后进行维护。

    • 隔离敏感数据: 将节点标记为仅用于处理敏感数据的应用程序。

    • 资源隔离: 将节点标记为仅用于高内存或高 CPU 应用程序。

    示例:

    1. 添加污点:

    kubectl taint nodes <node-name> key1=value1:NoSchedule

    这将为名为 <node-name> 的节点添加一个污点,键为 key1,值为 value1,效果为 NoSchedule

    2. 定义容忍度 (在 Pod 的 YAML 文件中):

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: nginx:latest
      tolerations:
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoSchedule"

    这将允许名为 my-pod 的 Pod 调度到具有 key1=value1:NoSchedule 污点的节点上。

    3. 使用 Exists 运算符:

    如果只想检查键的存在性,而忽略值:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: nginx:latest
      tolerations:
      - key: "key1"
        operator: "Exists"
        effect: "NoSchedule"

    这将允许 my-pod 调度到任何具有 key1 键的污点的节点上,无论其值是什么。

    注意事项:

    • 匹配: 污点和容忍度必须完全匹配才能生效(除非使用 Exists 运算符,否则 keyvalue 和 effect 必须完全匹配)。

    • 顺序: 先添加污点,再创建具有匹配容忍度的 Pod,容忍度的顺序无关紧要

    • 移除污点: 使用 kubectl taint nodes <node-name> <key>-命令移除污点。

    • 谨慎操作: 不正确的污点和容忍度配置可能会导致 Pod 无法调度或被意外驱逐。

    如果一个节点同时存在多个污点,Pod 的容忍度必须能够满足所有这些污点才能成功调度到该节点。 这意味着需要为每个污点在 Pod 的 tolerations 列表中添加一个对应的容忍度。

    Kubernetes 处理多个污点和容忍度的方式就像一个过滤器:从节点的所有污点开始,然后忽略 pod 具有匹配容忍度的污点;其余未被忽略的污点对 pod 具有的效果如下:

    • 如果至少有一个未被忽略的污点具有 NoSchedule 效果, 那么 Kubernetes 将不会将 pod 调度到该节点上。

    • 如果没有未忽略的污点 NoSchedule ,但至少有一个未忽略的污点 PreferNoSchedule,则 Kubernetes 将尝试不将 pod 调度到节点上。

    • 如果至少有一个未被忽略的污点 NoExecute,那么该 pod 将被从节点中逐出(如果它已经在节点上运行),并且不会被调度到节点上(如果它尚未在节点上运行)。

    1.例如,假设我们的一个节点上有以下三个污点

    • kubectl taint nodes node1 key1=value1:NoSchedule

    • kubectl taint nodes node1 key1=value1:NoExecute

    • kubectl taint nodes node1 key2=value2:NoSchedule

    我们创建一个pod,但是只配置两种容忍度匹配两个污点:

    tolerations:
    - key: "key1"
      operator: "Equal"
      value: "value1"
      effect: "NoSchedule"
    - key: "key1"
      operator: "Equal"
      value: "value1"
      effect: "NoExecute"

    在这种情况下,pod 将无法调度到节点上,因为没有与第三个污点匹配的容忍度。但是,如果在添加污点时它已经在节点上运行,它将能够继续运行,因为第三个污点是三个污点中唯一一个不被 pod 容忍的污点。

    通常情况下,如果将具有效果的污点 NoExecute 添加到节点,则任何不容忍该污点的 Pod 都会被立即驱逐,而容忍该污点的 Pod 则永远不会被驱逐。但是,具有 NoExecute 效果的容忍可以指定一个可选 tolerationSeconds 字段,该字段表示在添加污点后 Pod 将与节点保持绑定多长时间。例如:

    tolerations:
    - key: "key1"
      operator: "Equal"
      value: "value1"
      effect: "NoExecute"
      tolerationSeconds: 3600
    这个配置表示如果此 pod 正在运行,并且节点上添加了匹配的污点,则 pod 将保持与节点的绑定状态 3600 秒,然后被驱逐。如果在此时间之前删除污点,则 pod 将不会被驱逐。

    2.假设一个节点存在以下三个污点:

    • key=env,value=prod,effect=NoSchedule

    • key=disktype,value=ssd,effect=NoSchedule

    • key=zone,value=us-east-1,effect=NoSchedule

    那么,Pod 的 tolerations 部分应该如下配置:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: nginx:latest
      tolerations:
      - key: "env"
        operator: "Equal"
        value: "prod"
        effect: "NoSchedule"
      - key: "disktype"
        operator: "Equal"
        value: "ssd"
        effect: "NoSchedule"
      - key: "zone"
        operator: "Equal"
        value: "us-east-1"
        effect: "NoSchedule"

    这个配置确保了 my-pod 可以容忍这三个污点,从而能够被调度到该节点。


    参考:

    kubectl patch pv 手动更新 PV 的容量信息

    2024-11-18 23:25:26

    客户有个服务的PV需要扩容容量,由于服务刚初始化还没有正式上线,并且存储卷使用的是云盘,支持动态调整大小,评估后决定使用kubectl patch pv手动更新pv的容量信息,当然前提需要云盘先扩容到指定容量。生产中这种方法非常危险,请评估好风险!

    操作步骤:

    1.找到pod使用的存储卷,登陆云厂商控制台找到对应的存储卷扩容到指定容量

    kubectl get pvc -A | grep pod-name
    kubectl get pv -A | grep pod-name
    kubectl describe pv <pv-name>

    2.使用 kubectl patch pv 手动更新 pv 的容量信息

    虽然可以使用 kubectl patch 命令修改 PV 对象中的容量信息,但并不会真正改变底层存储资源的大小。这只会导致 Kubernetes 集群中的 PV 容量信息与实际底层存储资源的大小不一致,从而导致各种问题,例如数据丢失或应用无法正常工作。如果已经通过其他方式调整了底层存储资源的大小,并且需要更新 PV 的容量信息,才可以使用以下命令:

    kubectl patch pv <pv-name> -p '{"spec":{"capacity":{"storage":"<new-size>"}}}'

    将 <pv-name> 替换为你的 PV 名称,<new-size> 替换为新的容量大小 (例如 500Gi)。

    确认容量变更完成后,进入pod,在挂载目录中使用 dd 命令测试文件是否能正常创建,命令如下,测试完成后记得删除测试文件。

    dd if=/dev/zero of=./file-test bs=4M count=10

    以下是一些间接调整 PV 容量的方法,以及它们的风险和限制,请谨慎选择使用,可能会导致数据丢失或应用无法正常工作

    1. 直接修改底层存储资源的大小:

    • 适用场景: hostPath、NFS、本地存储等类型的 PV。

    • 方法: 登录到宿主机或存储服务器,使用相应的工具 (例如 resize2fs、云厂商提供的工具) 调整底层存储资源的大小。然后,需要手动更新 PV 的容量信息,使其与底层存储资源的大小匹配。

    • 风险: 非常高。直接操作底层存储资源可能会导致数据丢失或损坏。如果操作不当,可能会导致 Kubernetes 集群出现故障。

    • 限制: 并非所有存储类型都支持在线调整大小。

  • 使用存储厂商提供的工具:

    • 适用场景: 云厂商提供的存储服务 (例如 AWS EBS、Azure Disk、GCP Persistent Disk)。

    • 方法: 使用云厂商提供的工具 (例如 AWS CLI、Azure PowerShell、GCP gcloud) 调整存储卷的大小。然后,需要手动更新 PV 的容量信息,使其与新的卷大小匹配。

    • 风险: 中等。使用云厂商提供的工具通常比直接操作底层存储资源更安全,但仍然存在一定的风险。

    • 限制: 并非所有云厂商都支持在线调整存储卷的大小。

  • 使用 Volume Expansion 功能 (如果支持):

    • 适用场景: 某些 CSI 驱动程序和存储插件支持 Volume Expansion 功能。

    • 方法: 编辑 PVC 的 spec.resources.requests.storage 字段,将其值修改为新的容量大小。如果存储驱动程序和文件系统支持在线扩容,则 PV 的容量会自动调整。

    • 风险: 低。这是最安全的方法,但需要存储驱动程序和文件系统支持 Volume Expansion 功能。

    • 限制: 并非所有存储驱动程序和文件系统都支持 Volume Expansion 功能。

    虽然技术上可以使用 kubectl patch 命令修改 PV 的某些字段,例如标签或注解,但这通常不会改变 PV 的底层存储资源,例如容量、访问模式和回收策略,这些属性在 PV 创建后通常是不可变的

    可以修改的字段:

    • Labels (标签): 可以使用 kubectl patch 添加、修改或删除 PV 的标签。

    kubectl patch pv <pv-name> -p '{"metadata":{"labels":{"key":"value"}}}'
    • Annotations (注解): 可以使用 kubectl patch 添加、修改或删除 PV 的注解。

    kubectl patch pv <pv-name> -p '{"metadata":{"annotations":{"key":"value"}}}'

    不能修改的字段 (通常):

    • Capacity (容量): PV 的容量在创建后无法更改。

    • Access Modes (访问模式): PV 的访问模式在创建后无法更改。

    • Reclaim Policy (回收策略): PV 的回收策略在创建后通常无法更改,但有些云厂商的存储插件可能允许修改。

    kubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
    • Storage Class (存储类): PV 的存储类在创建后无法更改。

    • 底层存储资源: kubectl patch 不会修改 PV 对应的底层存储资源。

    如果必须使用这些方法,请务必在操作之前备份数据,并在非生产环境中进行测试。


    再次强调,以上方法都存在一定的风险,不推荐在生产环境中使用。 最安全和推荐的方法是创建新的 PV 和 PVC,并将应用迁移到新的 PVC,操作步骤如下:

    1. 创建新的 PV: 根据新的容量需求创建一个新的 PV。

    2. 创建新的 PVC: 创建一个新的 PVC,并将其绑定到新的 PV。

    3. 将应用迁移到新的 PVC: 将应用配置为使用新的 PVC。

    以下是如何调整 PVC 容量大小的步骤:

    1. 确认 StorageClass 支持扩容:

      使用 kubectl describe sc <storageclass-name> 命令查看 StorageClass 的详细信息。确认 allowVolumeExpansion 字段设置为 true。 如果 StorageClass 不支持扩容,需要创建一个新的支持扩容的 StorageClass。

    2. 使用 kubectl patch 或 kubectl edit 调整 PVC 容量:

      可以使用以下两种方法之一来修改 PVC 的容量:

    • kubectl patch:

    kubectl patch pvc <pvc-name> -p '{"spec":{"resources":{"requests":{"storage":"<new-size>"}}}}'

    将 <pvc-name> 替换为你的 PVC 名称,<new-size> 替换为新的容量大小 (例如 20Gi、500Mi)。

    • kubectl edit:

    kubectl edit pvc <pvc-name>

    找到 spec.resources.requests.storage 字段,并将其值修改为新的容量大小。保存并关闭文件。

  • 验证 PVC 容量是否已更改:

    使用 kubectl get pvc <pvc-name> 或 kubectl describe pvc <pvc-name> 命令查看 PVC 的详细信息,确认容量是否已更新。

  • (如果需要) 重启 Pod:

    有些存储驱动程序和文件系统需要重启 Pod 才能识别新的容量大小。如果应用没有自动识别新的容量,请重启使用该 PVC 的 Pod。

  • 注意:

    • 并非所有存储驱动程序都支持在线扩容。

    • 缩小 PVC 容量通常不被支持,并且可能导致数据丢失。

    • 确保应用能够处理存储容量的变化。

    如果使用的是云厂商提供的 Kubernetes 服务,请参考其文档了解如何调整 PV 容量大小,因为具体步骤可能会有所不同。 一些云厂商的存储插件可能提供更安全的方法来调整 PV 容量。


    参考 :Kubernetes 命令备忘清单