通过Squid代理在Tailscale中共享L2TP访问权限

阿里云教程3个月前发布
22 0 0

通过Squid代理在Tailscale中共享L2TP访问权限

一、需求二、解决方案1、整体架构2、各组件作用详解
三、工作原理1、数据流向详解2、关键技术点说明
四、操作指南1、L2TP连接配置1.1、安装必要软件1.2、配置连接参数1.3、创建配置文件1.4、启动和连接1.5、关闭L2TP(不用时)
2、Squid代理服务器配置2.1、安装Squid2.2、配置网络参数2.3、配置Squid2.4、配置高级路由策略
3、测试和验证3.1、基础连通性测试3.2、访问内部资源测试

一、需求

公司或家庭网络分布在不同的地理位置,比如:

总部办公室有一个私有网络(包含内部系统、文件服务器等)你家里的电脑需要访问总部网络可能还有其他地方的设备也需要接入

核心矛盾

只有一台特定设备(我们称为”网关设备”)可以通过L2TP直接连接到总部网络但其他设备也想要访问总部的资源

二、解决方案

1、整体架构


[其他设备] ←→ [Tailscale虚拟局域网] ←→ [网关设备] ←→ [L2TP ] ←→ [总部网络]

通过Squid代理在Tailscale中共享L2TP访问权限

2、各组件作用详解

Tailscale – 虚拟快递网络

作用:把所有设备连接成一个虚拟局域网优势:自动组网、加密传输、无需复杂配置

L2TP – 专用运输通道

作用:建立一条安全的隧道连接到总部网络特点:只有网关设备有这个特殊通道

Squid代理 – 智能快递中转站

作用:接收其他设备的请求,通过L2TP通道转发到总部类比:就像快递中转站帮你把包裹从普通网络转到专用通道

三、工作原理

1、数据流向详解


设备A (Tailscale IP: 100.10.10.200)
         ↓ HTTP请求: 访问内部系统
    Squid代理 (Tailscale IP: 100.10.10.100, 监听3128端口)
         ↓ 通过ppp0网卡转发
    L2TP 隧道 (ppp0: 10.1.1.100)
         ↓
    总部内部网络 (如: 192.168.1.0/24)

2、关键技术点说明

路由策略

创建特殊路由表
ppp0-table
告诉系统:“所有从ppp0网卡来的流量,都要通过ppp0网卡回去”避免流量绕路,确保响应数据正确返回

网络地址转换

Squid的
tcp_outgoing_address
配置确保所有出站流量使用分配的IP这样总部网络看到的请求都来自”合法”的 IP地址

安全隔离

Tailscale网络和总部网络是隔离的只有HTTP/HTTPS流量可以通过代理转发其他类型的网络访问仍然受到限制

四、操作指南

1、L2TP连接配置

1.1、安装必要软件

# 更新软件包列表,确保获取最新版本
apt-get update

# 安装三个核心组件:
# strongswan - IPsec加密支持
# xl2tpd - L2TP协议实现  
# net-tools - 网络调试工具
apt-get install strongswan xl2tpd net-tools -y
1.2、配置连接参数

# 这些信息需要从你的服务商获取
_SERVER_IP=''       # 服务器地址
_IPSEC_PSK=''       # 预共享密钥,相当于密码
_USER=''            # 用户名
_PASSWORD=''        # 用户密码

注意:在实际生产环境中,建议将密码存储在安全的地方,而不是直接写在脚本中

1.3、创建配置文件

IPsec配置 (
/etc/ipsec.conf
):


cat > /etc/ipsec.conf <<EOF
conn myvpn
  auto=add
  keyexchange=ikev1
  authby=secret
  type=transport
  left=%defaultroute
  leftprotoport=17/1701
  rightprotoport=17/1701
  right=$_SERVER_IP
  ike=aes128-sha1-modp2048
  esp=aes128-sha1
EOF

cat > /etc/ipsec.secrets <<EOF
: PSK "$_IPSEC_PSK"
EOF
chmod 600 /etc/ipsec.secrets

L2TP配置 (
/etc/xl2tpd/xl2tpd.conf
):


cat > /etc/xl2tpd/xl2tpd.conf <<EOF
[lac myvpn]
lns = $_SERVER_IP
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
EOF

cat > /etc/ppp/options.l2tpd.client <<EOF
ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-chap
noccp
noauth
mtu 1280
mru 1280
noipdefault
defaultroute
usepeerdns
connect-delay 5000
name "$_USER"
password "$_PASSWORD"
EOF

chmod 600 /etc/ppp/options.l2tpd.client
mkdir -p /var/run/xl2tpd
touch /var/run/xl2tpd/l2tp-control
1.4、启动和连接

# 重启服务使配置生效
ipsec restart
service xl2tpd restart

# 建立IPsec安全关联
ipsec up myvpn

# 发起L2TP连接(c = connect)
echo "c myvpn" > /var/run/xl2tpd/l2tp-control

验证连接


# 检查是否出现了ppp0接口
ifconfig ppp0

# 应该看到类似信息:
# ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1280
#         inet 10.1.1.100  netmask 255.255.255.255  destination 10.1.1.1
1.5、关闭L2TP(不用时)

echo "d myvpn" > /var/run/xl2tpd/l2tp-control
ipsec down myvpn

2、Squid代理服务器配置

2.1、安装Squid

sudo apt update
sudo apt install squid -y
sudo systemctl enable squid
2.2、配置网络参数

PPP_INTERFACE="ppp0"      # L2TP创建的虚拟网卡
PPP_GATEWAY="10.1.1.1"    # 网络的网关地址
ROUTE_TABLE="ppp0-table"  # 自定义路由表名称
PPP_IP="10.1.1.100"       # 当前设备在中的IP地址
2.3、配置Squid

cat > /etc/squid/squid.conf << EOF
# 基本设置
http_port 3128                 # 监听3128端口提供代理服务
always_direct allow all        # 所有请求都直接转发,不经过其他代理

# DNS设置
dns_nameservers 8.8.8.8 1.1.1.1  # 使用Google和Cloudflare的DNS
dns_v4_first on                # 优先使用IPv4解析

# 出站设置
tcp_outgoing_address $PPP_IP  # 关键!所有出站流量使用 IP

# 访问控制列表
acl local_net src all          # 允许所有来源IP
acl SSL_ports port 443         # 定义HTTPS端口
acl Safe_ports port 80         # 定义HTTP端口  
acl Safe_ports port 443        # HTTPS也是安全端口
acl CONNECT method CONNECT     # CONNECT方法(用于HTTPS)

# 隐私和安全
via off                        # 不添加Via头
forwarded_for delete           # 删除X-Forwarded-For头
ssl_bump none                  # 不拦截SSL流量
cache deny all                 # 禁用缓存

# 访问权限规则
http_access allow local_net CONNECT SSL_ports  # 允许HTTPS隧道
http_access allow local_net Safe_ports         # 允许HTTP/HTTPS访问
http_access deny !Safe_ports                   # 拒绝其他端口
http_access deny all                           # 默认拒绝所有
EOF

# 重启squid使配置生效
sudo systemctl restart squid
2.4、配置高级路由策略

# 添加自定义路由表
sed -i '/'$ROUTE_TABLE'/d' /etc/iproute2/rt_tables  # 先删除可能存在的旧配置
echo "100 $ROUTE_TABLE" >> /etc/iproute2/rt_tables  # 添加新路由表

# 配置路由表内容
ip route flush table $ROUTE_TABLE 2>/dev/null   # 清空旧路由
ip route add default via $PPP_GATEWAY dev $PPP_INTERFACE table $ROUTE_TABLE  # 设置默认路由

# 创建路由规则:来自 IP的流量使用特殊路由表
ip rule add from $PPP_IP lookup $ROUTE_TABLE

这个路由配置的作用

确保从返回的响应数据通过正确的路径返回避免”非对称路由”问题(请求走,响应走普通网络)

3、测试和验证

3.1、基础连通性测试

# 测试代理服务器是否工作
curl -x http://100.10.10.100:3128 https://ipinfo.io/json

# 如果成功,你会看到:
# {
#   "ip": "XXXX",      # 注意这里显示的是 IP
#   "city": "Hong Kong",
#   "region": "Hong Kong",
#   ...
# }
3.2、访问内部资源测试

# 设置环境变量(让所有程序自动使用代理)
export http_proxy="http://100.10.10.100:3128"
export https_proxy="http://100.10.10.100:3128"
© 版权声明

相关文章

暂无评论

none
暂无评论...