技术分享
🧱翻墙
00 min
Nov 1, 2023
Nov 1, 2023
type
status
date
slug
summary
tags
category
icon
password
sock5会代理TCP和UDP,HTTP只会代理HTTP协议
混合端口:sock+http
查看终端代理 ip 地址:

网络请求

域名 → IP

先检查浏览器和本地的DNS缓存,没有的话请求DNS服务器(本地会配置好DNS服务器的IP地址)
本地网段没有这个IP,就会发送给网关
同一局域网通信使用的是Mac地址
路由器的WAN有一个公网地址
需要做NAT(会记录映射关系),把内网源IP转换成公网IP
在公网上转发会不断地修改MAC地址

什么是长城防火墙

不仅审查目标IP、目标端口等等,也会审查数据包内的敏感词
防火墙是一个五层设备,可以直接看到里面的内容
  • 直接不让数据包出国
  • DNS污染:把你要来的IP改了
  • TCP重置攻击:GFW的NAT把IP伪造成谷歌服务器的IP,然后给你回一个“滚蛋”,你就放弃连接了

什么是VPN

VPN是Virtual private network (虚拟专用网)
很多公司是有跨国业务的,甚至就算都在境内,也需要通过专门的通道来沟通,,我自己也在阿里字节用过公司的VPN,这些VPN是经过备案的。
99%的出国流量都是有必要的。
但是VPN协议的特征过于明显,所以会被GFW知晓,所以会被盯上,也就需要你备案才会放你走。
特征:先发包要求构建加密通道

什么是翻墙

只要是能躲开GFW的方式都是翻墙,VPN只是其中一种方法。

其他协议

最经典的就是shadowsock协议,但ss协议也会被GFW主动探测

翻墙方式

  1. Clash、小火箭都是墙内的ss服务器(手机上的软件),在墙内就完成对数据包的加密,然后发送到海外的服务器再解密,之后代为转发请求。
    1. 本地完成加密,无需请求建立加密通道。
  1. 虚拟网卡 tun/tap,完成硬件层面的模拟,从而代理整台设备的流量
  1. 上面的方式是软件,权限可能不够,所谓的系统代理,得先将流量给它们才能翻墙,对于一些系统层面的流量,他们可能代理不到。
    1. 那就需要软路由的方式了,整个设备的所有流量都发送到路由器上,进行加密,然后再传输。
  1. 但路由器毕竟算力不够,所以我们可以用一台设备来做中转,也就网关代理,在Clash中可以通过打开「允许局域网连接」来让这台设备变成网关代理。
  • 代理服务器会过滤一些网络连接,只允许那些可以访问的通过。而网关却不做任何的过滤。
一般家里的路由器 = 路由器 + 交换机(网关,Gateway)+ DNS
光猫:数据链路,连着路由器
路由器通过PPPoE拨号获得公网IP
交换机到MAC,路由器到IP
notion image

Sock

socks是一种代理协议
互联网早期,企业内部网络为了保证安全性,都是置于防火墙之后,socks协议就是为了解决这个问题而诞生的。

虚拟设备

tun:三层,IP
tap:二层,MAC
绝不可能通过虚拟网卡向外界发送数据,外界数据也不可能直接发送到虚拟网卡上。能够直接收发外界数据的,只能是物理设备。
  • 可以将数据传输到本机的另一个网卡(虚拟网卡或物理网卡)或其它虚拟设备(如虚拟交换机)上;
  • 可以在用户空间运行一个可读写虚拟网卡的程序,该程序可将流经虚拟网卡的数据包进行处理,比如VPN 程序。
需要注意的是,用户空间的程序是无法对数据包做任何封装和解封操作的,所有的封装和解封都只能由内核的网络协议栈来完成。
VPN可以对数据再封装一层隧道IP层。

TUN应用

notion image

TAP应用

notion image
在虚拟机之间转发数据包

术语

VPS:Virtual private server (虚拟专用服务器)
IP是可以变化的
192.168.0.x 内网IP
127.0.0.1 localhost

NAT穿透

实际情况上,我们还处于运营商的大内网中,我们无法穿透他们的NAT,也就无法从外面访问内部的网络,往往需要通过其他有公网IP地址的服务器进行NAT穿透
todo:内网穿透

其他

IPV6 要2开头才是公网IP,fe开头还是内网
路由模式(IP层) vs 桥接模式(MAC层)
路由器会通过DHCP会内网设备分配内网IP、网关、DNS服务器等信息
系统代理一般是HTTP代理,基于TCP,所以UDP请求,不会走代理
虽然sock5支持UDP代理,但浏览器不支持将UDP流量交给sock5

Linux翻墙

SS/SSR/V2ray等客户端,默认会监听一个socks5端口,例如1080,因此让Linux终端命令走代理的方法便是设置这两个环境变量:
设置好这两个环境变量后,许多软件,例如curlwget,默认会读取变量的值,发现设置了就走代理,因此可以访问外网。
但并不是所有软件都遵循约定,例如git就不认这两个环境变量。git有自己的一套,需要单独设置:
如果不想软件走代理,unset这两个环境变量就可以了:
环境变量方式比较简单,但缺点也很明显:
  1. 环境变量设置是全局的(当前会话),设置后wget等命令都会走代理,不想经过代理只能先unset再运行,比较麻烦;
  1. 不少软件不认这两个环境变量,设置了也不起作用。

proxychains方案

本节以Ubuntu系统介绍使用proxychains克服环境变量方案的两个缺点,实现按需、所有软件都能走代理。
首先安装proxychainssudo apt install -y proxychains
然后编辑 /etc/proxychains.conf 文件,在最后的[ProxyList]一节中增加代理设置,例如:
接下来,所有希望走代理的命令,前面增加proxychains即可,例如:
需要连外网的命令比较少,并且可以让所有软件都走代理,因此proxychains是推荐方式。

Comments