用openssh的tunnel建立隧道翻墙

openssh是支持隧道的,所以就可以在ssh中再套个管道,直接用来翻墙,做法如下: 如上图,A机能ssh登录B机 A机的IP:172.16.8.106 B机的IP:172.16.8.108 A机建立tunnel后tun的ip:192.168.244.1 B机建立tunnel后tun的ip:192.168.244.2 首先编辑A和B的/etc/ssh/sshd_config,允许tunnel,缺省是不允许的,然后service sshd restart ,重启sshd ... PermitTunnel yes ... A和B安装linux下的tun软件,并启动一个tunnel设备 yum install tunctl tunctl -t tun5 -u root 在A(172.16.8.106)机器上生成key,并设置能无密码证书直接登录B(172.16.8.108) ssh-keygen ssh-copy-id root@172.16.8.108 在A上执行命令,建立ssh tunnel: ssh -w 5:5 root@172.168.8.108 在A上执行 ifconfig tun5 192.168.244.1 pointopoint 192.168.244.2 netmask 255.255.255.0 在B上执行 ifconfig tun5 192.168.244.2 pointopoint 192.168.244.1 netmask 255.255.255.0 这样分别在A和B上ping 192.168.244.1和192.168.244.2,都能通就表示已经ok了。 优化一下,A和B两边都先把tun5启动以后,直接在A上一句话搞定,这个不会自动退出,所以得ctrl+z,然后bg放后台去,或者screen挂住: ssh \ -o PermitLocalCommand=yes \ -o LocalCommand="ifconfig tun5 192.168.244.1 pointopoint 192.168.244.2 netmask 255.255.255.0" \ -o ServerAliveInterval=60 \ -w 5:5 root@172.16.8.108 \ 'ifconfig tun5 192.168.244.2 pointopoint 192.168.244.1 netmask 255.255.255.0; echo tun5 ready' 如果要用在翻墙的环境,那就得保持长链接了。假设A机器是在一个防火墙后,且被NAT了,那么就得先这样打通隧道: ...

2024年1月11日

Docker急速搭建运行ikev2 vpn来让iphone翻墙

这篇文章只适用于在自己的vps上运行: 步骤如下: 1、拉回来镜像,ikev2-vpn-server,话说这么多年过去了,依然适用,2016年到现在 docker pull gaomd/ikev2-vpn-server 2、启动服务端,注意–privileged参数,这个是必须的 docker run --privileged -d --name ikev2-vpn-server --restart=always -p 500:500/udp -p 4500:4500/udp gaomd/ikev2-vpn-server:0.3.0 搞定,只需要2步即可完成相对比较难搞的ikev2的安装. 3、生成iphone客户端配置文件 docker run -i -t --rm --volumes-from ikev2-vpn-server -e "HOST=vpn.rendoumi.com" gaomd/ikev2-vpn-server:0.3.0 generate-mobileconfig > ikev2-vpn-ihone6s.mobileconfig 注意:vpn.rendoumi.com替换成你自己对应的ip或者域名 然后你把这个配置文件下载,安装到MacOS或者iOS中,就可以愉快的玩耍了。

2024年1月11日

Linux下的策略路由

如果我们有两条上网线路可以使用,那么策略路由就是个好的选择了。 基本概念: 策略路由表(Policy routing tables): Linux 缺省有3个表, local (不能改也不能删), main, 和 default。添加路由的时候如果不指定,缺省是添加到main路由表里的。 策略路由规则(Policy routing rules): Linux 缺省也有三套路由规则,对应三个缺省路由表。 查看一下就可以看到三个表: # ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default 查local表的路由规则: # ip route list table local local 10.10.0.1 dev tun0 proto kernel scope host src 10.10.0.1 broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1 local 172.16.8.1 dev br0 proto kernel scope host src 172.16.8.1 broadcast 192.168.122.0 dev virbr0 proto kernel scope link src 192.168.122.1 broadcast 172.16.8.0 dev br0 proto kernel scope link src 172.16.8.1 broadcast 172.16.9.255 dev br0 proto kernel scope link src 172.16.8.1 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 broadcast 192.168.122.255 dev virbr0 proto kernel scope link src 192.168.122.1 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 使用策略路由的方法也很简单,1、定义一个路由表,2、定义路由规则,3、应用路由规则。 ...

2024年1月10日

服务器R920的一次急速故障处理

记录一下,2016年的5月5日这天的中午。 正在跟老刘、大亮、Good宁一起吃午饭,突然手机接到短信报警,说是主数据库Down了。出大事了!!! 这个是很常见的场景吧,如何在这种情况下处理服务器故障呢?基本吃饭的时候是不会携带笔记本的,所有的操作只能在手机上完成了。 如果是iphone手机,装上Termius;如果是android手机,装上Juicessh。这两个都是远程ssh软件(我们的服务器都是Linux,没有Windows)。另外公司是有openvpn的,必须通过vpn才能连接到IDC的服务器,所以也需要手机装上openvpn软件。 拨通vpn,用ssh连上服务器,然后快速运行实现编写好的ping脚本: cat 1.ping.sh #!/bin/sh ping 172.8.$1 这个脚本很奇怪吧,名字叫做1.ping.sh,是因为在手机上操作,一切都要迅速,Termius和Juicessh都是支持命令补全的{tab}键的,所以只要输入./1{tab} 1.1 就等于执行了ping 172.8.1.1,上面只输入了6个字符,而完整的ping命令则需要输入14个字符,这就是原因了。 ping一下不通,那就赶紧执行脚本,抓一下服务器idrac前面板的信息: cat 2.idrac.sh #!/bin/sh sshpass -p "xxxxxx" ssh -oStrictHostKeyChecking=no root@10.8.$1 racadm get System.LCD.CurrentDisplay 上面脚本用dell的radadm来抓取服务器idrac的前面板信息,idrac和网卡的网段只是前面第一段不同,网卡是172,idrac是10,这样很方便记忆。 得到结果: CPU1 has internal error. (IERR) 彻底完蛋!CPU出错了,想都不用想,硬件重启: cat 3.reboot.sh #!/bin/sh sshpass -p "xxxxxx" ssh -oStrictHostKeyChecking=no root@10.8.$1 racadm serveraction powercycle 从powercycle到Centos完全启动,系统开始记录/var/log/messages,所有时间共花费了7分钟。 注意:有可能在重启的过程中需要按一下F1的按钮继续,这样就需要打开vnc,按那一下子,或者提前在idrac里设置ErrPrompt disabled,不需要按F1就重启。 sshpass -p "xxxxxx" ssh -oStrictHostKeyChecking=no root@10.8.$1 racadm set BIOS.MiscSettings.ErrPrompt Disabled 总结:这起故障从接到报警到检查完毕只花费了3分钟,然后重启,7分钟机器系统启动,2分钟oracle备库恢复,3+7+2=12分钟。这真是个极限时间了。 运维能做到的也就这么快了吧。

2024年1月10日

KVM中网卡地址随机生成方法

用bash随机生成网卡地址: echo 52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/') 52:54:f6:65:52:39 另一种做法: openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'

2024年1月9日

Linux下设置LANG变量

vim 编辑文件,里面是有中文的,可是环境变量中LANG=C,非常不便啊,经常得export LANG=zh_CN来解决。放在/etc/profile里也不是个事。 一劳永逸的方法: # vi /etc/sysconfig/i18n ------ LANG="zh_CN.UTF-8" SUPPORTED="zh_CN.UTF-8:zh_CN:zh:zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en" SYSFONT="latarcyrheb-sun16" ------

2024年1月9日

SNMP OID来监控网络设备流量

想自己画图来监控交换机的流量,第一步就是通过snmpwalk来得到交换机的进出流量: 我们用得是Cisco 3750的24口交换机,给个OID表: 先看一下交换机的端口情况: snmpwalk -v 2c -c xxxxxxxx 172.16.1.1 .1.3.6.1.2.1.2.2.1.2 得到一堆信息,问网络工程师得到1/0/5和2/0/5这两个端口是双上连线路: IF-MIB::ifDescr.10105 = STRING: GigabitEthernet1/0/5 IF-MIB::ifDescr.10605 = STRING: GigabitEthernet2/0/5 记住两个端口的描述符,10105和10605. 继续,我们看上表,.1.3.6.1.2.1.2.2.1.10(接口收到的字节数),我们要得到某个具体端口收到的字节数,就必须加上端口的描述符了。所以要得到1/0/5的收到字节数,就是.1.3.6.1.2.1.2.2.1.10.10105 #snmpwalk -v 2c -c xxxxxxxx 172.16.1.1 .1.3.6.1.2.1.2.2.1.10.10105 IF-MIB::ifInOctets.10105 = Counter32: 2198534228 ok,拿到字节数了,然后单位是bytes,换算成bit(*8),然后除若干1024,得到单位m,g, t等,入库,然后调hichart画图即可。 然而,还有一个问题,看清上面的单位,Counter32,呵呵,所以这里是不对的。现如今的网络多是千兆网卡了,所以counter32是不对的, 100Mbps以上必须使用Counter64的单位,给个对照表: 高速网卡(100兆以上): ifHCInOctets: 1.3.6.1.2.1.31.1.1.1.6 (64-bit Octets in counter) ifHCOutOctets: 1.3.6.1.2.1.31.1.1.1.10 (64-bit Octets out counter) ifHCInUcastPkts: 1.3.6.1.2.1.31.1.1.1.7 (64-bit Packets in counter) ifHCOutUcastPkts: 1.3.6.1.2.1.31.1.1.1.11 (64-bit Packets out counter) ifHighSpeed: 1.3.6.1.2.1.31.1.1.1.15 (An estimate of the interface’s current bandwidth in units of 1Mbps) 低速网卡: ...

2024年1月8日

Linux下配置Modem拨号

公司为了跟建设银行建立专线,首先用电话线拨号进行测试。 买回来一个外置的Modem,接在服务器的com1口上,先用电话测试一下,OK没问题,那就继续配modem拨号 Linux下配置Modem拨号有两种方式,传统的pppd方式和简单的wvdial方式。 一、wvdial配置 wvdial的配置方法超级简单, 执行命令:wvdialconf /etc/wvdial.conf 它会自动测出系统的Modem,稍微修改一下,加几个参数: vi /etc/wvdial.conf [Dialer Defaults] Modem = /dev/ttyS0 Baud = 115200 Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 ISDN = 0 Auto Reconnect = on Modem Type = Analog Modem Phone =0,28929191 Username = ttt Password = qqq 这就弄好了,执行wvdail &就可以拨号了,结束也很简单,kill -9 杀掉wvdial和ppd进程即可。 注意:wvdial 拨通后系统多了一块网卡ppp0,路由信息都未修改,为了能到达建行的服务器,需要编辑/etc/ppp/ip-up文件,加一句: route add -host 12.0.98.150 gw 12.0.98.236 然后重拨ping一下,ping 12.0.98.150,能ping通就说明ok了。 二、pppd配置 wvdial隐藏了很多信息,我们下面用pppd来看看真实的拨号过程吧: 其实modem拨号认证的方式有两种,一种是显示明文的login:(username:)方式,另一种是显示乱码的pap(chap)方式。 ①首先: vi /etc/ppp/options lock crtscts defaultroute noauth ②清理一下老的连接: killall pppd rm /var/lock/LCK..ttyS0 ③找出认证的方式: /usr/sbin/pppd /dev/ttyS0 115200 debug connect "/usr/sbin/chat -v '' 'AT&F0' OK ATD0,28929191 CONNECT 'dc' " less /var/log/messages ...

2024年1月8日

docker lxc类型容器自启动以及自动执行命令

我们的容器采用的是lxc类型,一是为了固定ip,二是避开iptable类型转发的方式。因为我们是强网络管理环境,网络工程师对网络的规划和管控非常强。 这种方式下启动lxc容器倒是很好办,直接编辑/etc/rc.d/rc.local docker start jko2o-16-13-49 docker start vis-16-13-51 docker start vis-16-13-50 docker start vis-16-13-48 docker start vis-16-13-47 就可以开机自动启动容器了。 容器内我们是采用supervisord主进程来保持容器不自动销毁的,那么其他命令如果都加入supervisord,那会非常麻烦。 简单化,用lxc-execute来执行,比较麻烦的就是需要查出来lxc容器的名字,用以下命令查出jko2o-16-13-49的全名: docker inspect -f '{{.Id}}' jko2o-16-13-49 ebe2e6a1249f6f22334014b0072186dfaee52173f3df06cd826f9e64e7d4c51f 然后编辑/etc/rc.d/rc.local,用lxc-execute执行命令就可以了: #47 lxc-execute -n e223d81ea73551460b82e1977b92ef07e24437cd1f4494470feafd4ff455104b -- service mysqld start lxc-execute -n e223d81ea73551460b82e1977b92ef07e24437cd1f4494470feafd4ff455104b -- service httpd start #48 lxc-execute -n 1075971953b9c79494509bf89131e03bbd5ab0b9a388217bd9b6de7a553016a5 -- //www/wdlinux/init.d/mysqld start lxc-execute -n 1075971953b9c79494509bf89131e03bbd5ab0b9a388217bd9b6de7a553016a5 -- //www/wdlinux/init.d/httpd start lxc-execute -n 1075971953b9c79494509bf89131e03bbd5ab0b9a388217bd9b6de7a553016a5 -- //www/wdlinux/init.d/wdapache start lxc-execute -n 1075971953b9c79494509bf89131e03bbd5ab0b9a388217bd9b6de7a553016a5 -- //www/wdlinux/init.d/nginxd start lxc-execute -n 1075971953b9c79494509bf89131e03bbd5ab0b9a388217bd9b6de7a553016a5 -- //www/wdlinux/init.d/pureftpd start #49 lxc-execute -n ebe2e6a1249f6f22334014b0072186dfaee52173f3df06cd826f9e64e7d4c51f -- /export/servers/nginx178/sbin/nginx #50 lxc-execute -n 5b7e8cd3130d31bae5b089202c7e2092b9daca5f19cc055ce4ee50cf8b789504 -- /export/servers/tomcat/tomcat.sh

2024年1月8日

Openvpn服务器端无法开通udp端口的故障排除

openvpn server can’t use udp port 这个问题非常古怪,我们有两个机房。分别在两边假设了openvpn服务器,一个机房的ovpn就完全正常,而另一个机房的openvpn如果是tcp就没问题,如果是udp就报错,无法连接。把正常机房的openvpn完全复制一份拿过去,也是一样报错,太郁闷了! 错误提示是: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity) 非常古怪啊: 在内网用nc来试验udp是否正常: nc -ul 1194 在内网随便找一台机器测试: nc -u xxxx 1194 然后两边随便输入字符测试,没问题。 然后从公网测试,就出问题了。nc连接上以后,只能发送一次数据,然后管道就断裂了,无法再传数据。 nc -u 公网ip 1194 aaa nc: Write error: Connection refused 百思不得其解啊,试了若干次,才发现问题的症结所在。 错误的那台服务器,有两个网络地址: 172.16.8.4和172.16.8.1 其中8.4的地址是缺省地址,8.1的地址是用ifconfig手动后添加的。 而前端防火墙做得公网映射是映射到了8.1的1194端口 tcp由于双方是要校验来往src地址的,所以没问题,到了udp,只管发不管收,所以udp包就从8.4的缺省地址发出去,导致双方不一致,无法正常接收了。 解决方法也很简单,在openvpn服务器端的配置文件中强行指定local端的ip即可: local 172.16.8.1

2024年1月8日