3
icmp和其他协议
服务器网卡处理
4
tcp
服务器上的v2ray client处理
4
udp
服务器上的v2ray client处理
服务器上的其他支持udp的client处理
服务器上的网卡处理


You:
搭建vpn server,客户机经过vpn server上网,vpn server可不可以把它的tcp连接direct去其他socks5 server,不使用本server的ip,然后除此之外,其他的都继续使用本server的,比如icmp处理,udp这些

ChatGPT:
是的,你的需求可以通过结合VPN和SOCKS5代理来实现。以下是一个方案和步骤来配置这样的系统:

1. 搭建VPN Server:
- 你可以使用OpenVPN或者WireGuard来搭建你的VPN服务器。假设你已经安装并配置好了VPN服务器,VPN客户端可以连接到该服务器,并通过VPN服务器上网。

2. 配置SOCKS5代理:
- 你需要一个SOCKS5代理服务器,假设它已经存在且可用。记下该SOCKS5代理服务器的IP和端口。

3. 设置iptables来路由TCP流量:
- 在VPN服务器上使用iptables来将特定的TCP流量路由到SOCKS5代理。
- 首先,确保你安装了redsocks,这个工具可以将TCP流量重定向到SOCKS5代理。

```bash
sudo apt-get install redsocks
```

4. 配置redsocks:
- 创建一个redsocks的配置文件,例如`/etc/redsocks.conf`,内容如下:

```conf
base {
log_debug = off;
log_info = on;
log = "file:/var/log/redsocks.log";
daemon = on;
redirector = iptables;
}

redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = ;
port = ;
type = socks5;
}
```

```
- 将``和``替换为你的SOCKS5代理服务器的IP和端口。
```

5\. 配置iptables:
\- 使用iptables将特定的TCP流量重定向到redsocks:

```bash
sudo iptables -t nat -N REDSOCKS
sudo iptables -t nat -A REDSOCKS -d /32 -j RETURN
sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

sudo iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner -j REDSOCKS
```

```
- ``是运行VPN的用户,例如`nobody`。你可以使用`id`命令来查看用户的UID。
- 确保你的SOCKS5代理服务器IP地址不会被重定向。
```

6\. 启动redsocks:

```bash
sudo redsocks -c /etc/redsocks.conf
```

7. 配置持久化:
- 确保redsocks和iptables规则在重启后依然有效。你可以将redsocks配置为系统服务,并保存iptables规则。

这个配置会将所有来自VPN用户的TCP流量通过redsocks重定向到SOCKS5代理,而其他类型的流量(如ICMP和UDP)将继续通过VPN服务器本身的IP来处理。


You:
如果我是用softether vpn server + windows10 作为vpn 服务器,要怎样实现

ChatGPT:
要在Windows 10上使用SoftEther VPN服务器并实现将VPN客户端的TCP流量通过SOCKS5代理,而其他流量(如ICMP和UDP)继续使用VPN服务器本身的IP,你可以按照以下步骤进行配置:

1. 安装SoftEther VPN Server:
- 从SoftEther官网[下载SoftEther VPN Server](https://www.softether.org/)并安装到Windows 10上。
- 运行SoftEther VPN Server Manager并进行基本配置,创建虚拟HUB并添加用户。

2. 安装SOCKS5代理工具:
- 你可以使用工具如Proxifier来将特定的流量通过SOCKS5代理。

3. 配置Proxifier:
- 安装并运行Proxifier。
- 添加SOCKS5代理:
1. 打开Proxifier,点击`Profile -> Proxy Servers`。
2. 点击`Add`,输入SOCKS5代理服务器的IP和端口,并选择`SOCKS Version 5`。
3. 如果需要身份验证,请输入用户名和密码。
- 设置代理规则:
1. 点击`Profile -> Proxification Rules`。
2. 创建新规则,指定要通过SOCKS5代理的TCP流量:
- 规则名称可以是例如"VPN TCP through SOCKS5"。
- 应用程序可以留空或指定特定程序。
- 目标主机可以设为`*`。
- 协议选择`TCP`。
- 操作选择`Proxy SOCKS5`并选择刚刚添加的代理服务器。

4. 配置Windows防火墙(可选):
- 你可能需要配置Windows防火墙以确保VPN服务器允许必要的流量:
1. 打开`控制面板 -> 系统和安全 -> Windows Defender防火墙`。
2. 点击`高级设置`,在入站和出站规则中允许SoftEther VPN Server相关的端口(默认是443和5555)。

5. 配置SoftEther VPN Server:
- 确保SoftEther VPN Server已正确配置,虚拟HUB已创建,用户和路由已设置。
- 确保VPN客户端可以连接到VPN服务器,并且可以正常上网。

6. 配置VPN客户端:
- 在VPN客户端上连接到SoftEther VPN服务器。
- 配置VPN客户端使用Proxifier来将TCP流量通过SOCKS5代理。

以下是一个更详细的指南来配置Proxifier:

### 配置Proxifier以使用SOCKS5代理:

1. 添加SOCKS5代理服务器:
- 打开Proxifier,点击`Profile`,选择`Proxy Servers`。
- 点击`Add`按钮,输入SOCKS5代理服务器的详细信息,例如:
- Address: `SOCKS5_PROXY_IP`
- Port: `SOCKS5_PROXY_PORT`
- Protocol: `SOCKS Version 5`
- 如果需要身份验证,请勾选`Enable`并输入用户名和密码。
- 点击`OK`保存设置。

2. 创建代理规则:
- 在Proxifier中,点击`Profile`,选择`Proxification Rules`。
- 点击`Add`按钮创建新规则。
- 在`Name`字段中输入规则名称,例如"VPN TCP through SOCKS5"。
- 在`Applications`字段中,可以留空表示应用于所有程序,或指定特定程序。
- 在`Target Hosts`字段中,输入`*`表示应用于所有目标主机。
- 在`Action`字段中选择`Proxy SOCKS5`并选择你刚刚添加的SOCKS5代理服务器。
- 点击`OK`保存规则。

3. 应用规则:
- 确保你创建的规则在Proxification Rules列表中处于启用状态。
- 规则顺序可以影响应用顺序,确保你的规则在合适的位置。

通过以上步骤,你应该能够实现将VPN客户端的TCP流量通过SOCKS5代理,而其他流量继续使用VPN服务器的IP。这样,你的VPN服务器和SOCKS5代理的流量处理就分开了。


You:
如果连udp也要由socks5 server处理呢

ChatGPT:
要通过SOCKS5代理处理UDP流量,同时使用SoftEther VPN服务器和Windows 10,可以采用一些额外的工具和配置。以下是一个详细步骤来实现这一目标:

### 1. 安装和配置SoftEther VPN服务器

确保你已经在Windows 10上安装和配置了SoftEther VPN服务器,使其能够正常运行并允许VPN客户端连接。

### 2. 安装和配置Proxifier

Proxifier不支持直接通过SOCKS5代理处理UDP流量。然而,可以使用其他工具如SSTap,或结合使用redsocks和WSL(Windows Subsystem for Linux)来实现。这里,我们将介绍如何使用SSTap。

### 3. 使用SSTap处理TCP和UDP流量

SSTap 是一个可以在Windows上处理TCP和UDP流量并通过SOCKS5代理进行转发的工具。

#### 安装和配置SSTap

1. 下载并安装SSTap:
- 从[SSTap GitHub页面](https://github.com/FQM456/SSTap-Rule)下载SSTap安装包并进行安装。

2. 配置SOCKS5代理:
- 打开SSTap,点击`Profiles`,然后点击`Add`按钮添加一个新的代理配置。
- 在`Proxy type`中选择`SOCKS5`。
- 输入你的SOCKS5代理服务器的IP和端口。如果需要身份验证,请输入用户名和密码。

3. 配置路由规则:
- 在SSTap的主界面,点击`Route table`,然后点击`Add`按钮添加一个新的路由规则。
- 你可以设置规则以将所有流量(包括TCP和UDP)通过SOCKS5代理:
- `IP Range`: `0.0.0.0/0`
- `Port Range`: `0-65535`
- 选择刚刚添加的SOCKS5代理服务器。

4. 应用设置并启动SSTap:
- 返回主界面,点击`Connect`按钮以启动SSTap。现在,所有的TCP和UDP流量都会通过你配置的SOCKS5代理。

### 4. 配置Windows防火墙(可选)

确保Windows防火墙允许SSTap进行必要的网络访问:

1. 打开`控制面板 -> 系统和安全 -> Windows Defender防火墙`。
2. 点击`高级设置`,在入站和出站规则中允许SSTap相关的流量。

### 5. 测试配置

1. 连接到SoftEther VPN:
- 使用VPN客户端连接到SoftEther VPN服务器,确保VPN连接正常。
2. 验证流量路由:
- 通过SSTap连接后,你可以使用网络监测工具(如Wireshark)来验证所有的TCP和UDP流量都通过SOCKS5代理。

### 总结

通过以上步骤,你可以在Windows 10上使用SoftEther VPN服务器,同时使用SSTap将所有的TCP和UDP流量通过SOCKS5代理进行转发。这种配置确保了所有类型的流量都使用SOCKS5代理,而不是通过VPN服务器的IP地址直接访问网络。


You:
搭建vpn server,客户机经过vpn server上网,vpn server可不可以把它的tcp和udp连接direct去其他socks5 server,不使用本server的ip,然后除此之外,其他的都继续使用本server的,比如icmp处理,dhcp这些

ChatGPT:
是的,可以通过配置VPN服务器来实现客户机通过VPN服务器上网,并将VPN服务器的TCP和UDP连接转发到其他SOCKS5服务器,而其他类型的流量(如ICMP、DHCP等)继续使用VPN服务器的IP。可以使用一些网络工具和技术来实现这个功能。以下是一个大致的方案:

### 方案概述

1. VPN服务器:使用常见的VPN软件,如OpenVPN或WireGuard,来搭建VPN服务器。
2. SOCKS5代理服务器:配置SOCKS5代理服务器,用于处理TCP和UDP流量。
3. 路由规则:设置VPN服务器的路由和iptables规则,将特定流量(TCP和UDP)通过SOCKS5代理转发。

### 具体步骤

#### 1. 搭建VPN服务器

可以选择使用OpenVPN或WireGuard等来搭建VPN服务器。

OpenVPN示例:

1. 安装OpenVPN:
```bash
sudo apt-get update
sudo apt-get install openvpn
```
2. 配置OpenVPN,创建服务器配置文件 `/etc/openvpn/server.conf`。

WireGuard示例:

1. 安装WireGuard:
```bash
sudo apt-get update
sudo apt-get install wireguard
```
2. 配置WireGuard,创建配置文件 `/etc/wireguard/wg0.conf`。

#### 2. 搭建SOCKS5代理服务器

可以使用Dante SOCKS5服务器或Shadowsocks来搭建SOCKS5代理。

Dante SOCKS5示例:

1. 安装Dante:
```bash
sudo apt-get update
sudo apt-get install dante-server
```
2. 配置Dante,编辑配置文件 `/etc/danted.conf`。

Shadowsocks示例:

1. 安装Shadowsocks:
```bash
sudo apt-get update
sudo apt-get install shadowsocks-libev
```
2. 配置Shadowsocks,编辑配置文件 `/etc/shadowsocks-libev/config.json`。

#### 3. 配置路由和iptables规则

设置VPN服务器的路由和iptables规则,将TCP和UDP流量通过SOCKS5代理转发。

示例脚本:

```bash
#!/bin/bash

# VPN客户端网络接口
VPN_INTERFACE="tun0"
# SOCKS5代理服务器地址和端口
SOCKS5_SERVER="socks5://代理服务器IP:端口"

# 安装redsocks,用于将流量重定向到SOCKS5代理
sudo apt-get update
sudo apt-get install redsocks

# 配置redsocks
cat < /etc/redsocks.conf
base {
log_debug = on;
log_info = on;
log = "file:/var/log/redsocks.log";
daemon = on;
redirector = iptables;
}

redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = 代理服务器IP;
port = 端口;
type = socks5;
}
EOT

# 启动redsocks
sudo systemctl restart redsocks

# 配置iptables规则
sudo iptables -t nat -N REDSOCKS
sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A REDSOCKS -p udp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A PREROUTING -i $VPN_INTERFACE -p tcp -j REDSOCKS
sudo iptables -t nat -A PREROUTING -i $VPN_INTERFACE -p udp -j REDSOCKS

# 保持其他流量通过VPN服务器
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```

### 注意事项

1. 需要确保VPN服务器和SOCKS5代理服务器配置正确。
2. 需要在VPN服务器上启用IP转发:
```bash
sudo sysctl -w net.ipv4.ip_forward=1
```
3. 需要配置防火墙以允许相关端口的流量通过。

以上是一个基本的搭建和配置步骤,根据实际情况可能需要做一些调整和优化。


You:
redsocks可以redirect udp吗

ChatGPT:
Redsocks 是一个代理工具,主要用于将本地的 TCP 流量重定向到一个代理服务器,而不需要修改应用程序本身。然而,Redsocks 本身并不直接支持 UDP 流量的重定向。

如果你需要重定向 UDP 流量,可以使用 Redsocks 的变体或者结合其他工具实现此功能。例如,可以考虑以下方法:

1. Redsocks2: 这是 Redsocks 的一个分支,增加了一些新功能,包括对 UDP 流量的支持。可以参考 Redsocks2 的文档和配置文件设置 UDP 流量重定向。

2. Tproxy: 使用 iptables 和 Tproxy 可以实现对 UDP 流量的透明代理。这种方法比较复杂,需要深入了解 iptables 和网络配置。

3. Socks5 代理: 一些支持 UDP 的 Socks5 代理服务器(例如 Shadowsocks 或 V2Ray)可以与 Redsocks2 结合使用,实现 UDP 流量的重定向。

4. 其他工具: 使用专门设计用于 UDP 流量重定向的工具,如 `UDPspeeder` 或 `kcptun`,可以实现 UDP 流量的代理和加速。

如果你决定使用 Redsocks2,下面是一个简单的 Redsocks2 配置示例,包括 TCP 和 UDP 流量的重定向:

```text
base {
log_debug = on;
log_info = on;
log = "file:/var/log/redsocks2.log";
daemon = on;
redirector = iptables;
}

redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = 192.168.1.1;
port = 1080;
type = socks5;
}

redudp {
local_ip = 127.0.0.1;
local_port = 10053;
ip = 192.168.1.1;
port = 1080;
type = socks5;
udp_timeout = 30;
udp_timeout_stream = 180;
}
```

在这个配置中,`redsocks` 部分处理 TCP 流量,`redudp` 部分处理 UDP 流量。请根据你的代理服务器的 IP 和端口进行适当调整。

配置完成后,还需要设置 iptables 规则,将 TCP 和 UDP 流量重定向到 Redsocks2 监听的本地端口。例如:

```bash
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A OUTPUT -p udp -j REDIRECT --to-ports 10053
```

这只是一个基本示例,实际配置可能需要根据你的网络环境和需求进行调整。

透明代理 UDP 为什么要用 TProxy?



透明代理 UDP 为什么要用 TProxy?

闲云野马关注IP属地: 广东

0.6772019.11.17 00:50:19字数 1,166阅读 16,704
假设你在路由器上搭建透明代理,要将局域网发过来的 UDP 流量(不包括路由器本身发出的流量)转发到透明代理,你需要执行以下这些命令:


ip rule add fwmark 1 lookup 100
ip route add local default dev lo table 100
iptables -t mangle -I PREROUTING -p udp --dport 53 -j TPROXY --on-port 1090 --tproxy-mark 0x01/0x01
iptables -t mangle -I OUTPUT -p udp --dport 53 -j MARK --set-mark 1
# 透明代理端口为 1090,假设只转发 53 端口的 DNS 查询流量
如果你要转发的流量是 TCP,那你只需要执行一条命令就可以了:


iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 1090
# 假设只转发 80 端口的流量
为什么转发 UDP 不能像转发 TCP 那样配置?

先来看一个问题。转发 TCP 时,REDIRECT 后包的目的地址已经变了,理论上来说,原目的地址已经丢了,透明代理是拿不到原目的地址的。那为什么透明代理能正确转发包呢?

实际上 netfilter 框架(iptables 也是基于这个框架暴露的勾子开发的)有 SO_ORIGINAL_DST 选项可以支持拿到原目的地址,netfilter 会将包的原目的地址放在 socket 的 SO_ORIGINAL_DST 属性里。

那么为什么 TCP 可以通过 SO_ORIGINAL_DST 拿到原目的地址,UDP 却不行?

原因跟 netfilter 的实现有关,SO_ORIGINAL_DST 是在 socket 上实现的,当 TCP 建立连接后,从对端的 socket 上就能拿到这个连接的原目的地址,实现成本很低。


int main()
{
int sockfd, connfd, len;
struct sockaddr_in servaddr, cli;
sockfd = socket(AF_INET, SOCK_STREAM, 0);


bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
bind(sockfd, (SA*)&servaddr, sizeof(servaddr));
listen(sockfd, 5);


len = sizeof(cli);
connfd = accept(sockfd, (SA*)&cli, &len);
// 从 connfd 就能拿到该连接的原目的地址
// getsockopt(connfd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
close(sockfd);
}
而 UDP 不是面向连接的,无法从 socket 里去拿原目的地址:


int main() {
int sockfd;
char buffer[MAXLINE];
char *hello = "Hello from server";
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr));
int len, n;
n = recvfrom(sockfd, (char *)buffer, MAXLINE,
MSG_WAITALL, ( struct sockaddr *) &cliaddr,
&len);
buffer[n] = '\0';


// 由于 UDP 不是面向连接的,编程模型中也就没有对端 socket 了
// 那么非要实现,去拿原目的地址的话只能从 sockfd 去拿
// getsockopt(sockfd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
// 但问题是从上面 recvfrom 的调用到这个调用之间可能会有新包进来,
// 改变内部 socket 的状态,那这时调用 getsockopt,
// 是无法知道哪个原目的地址才是当前处理包的目的地址的
sendto(sockfd, (const char *)hello, strlen(hello),
MSG_CONFIRM, (const struct sockaddr *) &cliaddr,
len);
printf("Hello message sent.\n");
return 0;
}
上面就是 UDP 的透明代理转发不能用 REDIRECT 的原因。

再看看最开始的 TProxy 方案为什么可以。


ip rule add fwmark 1 lookup 100
ip route add local default dev lo table 100
iptables -t mangle -I PREROUTING -p udp --dport 53 -j TPROXY --on-port 1090 --tproxy-mark 0x01/0x01
iptables -t mangle -I OUTPUT -p udp --dport 53 -j MARK --set-mark 1
# 透明代理端口为 1090,假设只转发 53 端口的 DNS 查询流量
TProxy 可以不改变包的头,将包重定向到本地 socket,所以


iptables -t mangle -I PREROUTING -p udp --dport 53 -j TPROXY --on-port 1090 --tproxy-mark 0x01/0x01
这一句直接就将包原封不动地投递到本地 1090 的 udp socket 了,那么为何还要搞个 --tproxy-mark 0x01/0x01 的选项呢?


iptables flow

从数据包流向知道,PREROUTING 之后可能走 INPUT,也可能走 FORWARD,那到底走哪条,是由路由表决定的,因此,得有一条路由指示该包就是给本机的。

系统中初始就有两张路由表,一张 local (ID 255),一张 main (ID 254),可通过 ip route show table tableID查看。这两张表都是按目的地址来路由的,如果照这两张表去走,这个包妥妥地就走 FORWARD 转发流程了,因为包的目的地址不是本机。

于是,就需要配置路由表,不能按目的地址来路由,所以配置按 mark 来路由:


ip rule add fwmark 1 lookup 100 # 对于 fwmark 为 1 的包,去 table 100 查找路由
ip route add local default dev lo table 100 # 添加一条默认路由,直接走 lo 出
这就是为什么 TProxy 要设置 mark 的原因,实际上不在 TProxy 设置 mark,单独在 TProxy 后面再加一个设置 mark 的 iptables 规则应该也是可以的。

由此,iptables 将包投给了本地透明代理进程。

但本地代理进程理论上来说应该是不接收的,因为不论是 TCP 还是 UDP,编程模型都需要 bind 本机地址(或者 0.0.0.0),不是给本机的包,进程不收。但 2.6.24 的内核出了个 IP_TRANSPARENT 的 socket 选项,打开这个选项,就可以接收任意目的地址的包了。

以上是局域网过来的包的重定向,那路由器本身出去的 UDP 要如何重定向到透明代理呢?

TProxy 只能在 PREROUTING 链上设置,不能在 OUTPUT 上设置,想想也是,如果能设在 OUTPUT 上,本来要出去的包又给塞回来,直接就死循环了。

这种情况,只能让包出去,再回来,回来的时候再通过 TProxy 规则重定向到透明代理。

那怎么让它从本网口出去又马上回到本网口来呢?还是走路由,在 OUTPUT 链给包打上 1 的mark,出去的时候就会查路由表,一查发现是给到 lo 口的,于是又回来了。


iptables -t mangle -I OUTPUT -p udp --dport 53 -j MARK --set-mark 1
当然,等到包从透明代理出去的时候,它的原目的地址和端口已经变了,不会再被 OUTPUT 链上的 mark 规则匹配到了,否则又会死循环的(所以这个规则配置要注意,配置不当,还是有死循环的可能的)。

参考资料:
最后编辑于 :2019.11.25 15:16:30
©著作权归作者所有,转载或内容合作请联系作者


linux
openvpn as srv
tproxy+iptables
socks5 client