全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1050|回复: 18

[美国VPS] Linux土制路由器:PVE下多接口与端口转发共存的方法

[复制链接]
发表于 2023-12-15 18:02:38 | 显示全部楼层 |阅读模式
本帖最后由 Just纱世里 于 2023-12-15 19:41 编辑

之前发了个求助贴,提问了【PVE下端口转发和全局代理共存时,端口不通】的问题。
感谢两边坛友的帮助。
我的需求如下
PVE服务器接入公网,并且作为网关负责路由客户端流量,同时在IPv4上开启端口转发。除此之外还要连接Wireguard,使整个局域网连接世界。
公网IP端口转发进来的数据包,走原路返回;内网设备主动上网的流量走Wireguard(扶墙)。
遇到的问题
端口转发和全局路由无法共存。
(但Openwrt下可以)
解决方法
通过iptables和连接跟踪,为NAT转发的数据包打上特定的标记,然后使用策略路由,打标记的原路返回;没标记的走WG接口。
解决步骤
PVE网络接口如下:
vmbr0网卡:192.168.1.1/24 (局域网,桥接虚拟机和接入设备); 2605:6400:XXXX:XXXX::1/64(BuyVM)
wan口: 118.81.0.1/32 (PPPoE动态公网IP)
wg:wireguard接口(连接到国外,NATv4和公网v6)
局域网设备:
eth0: 192.168.1.2,端口80有个网页服务器,想暴露给宽带自带公网的18080端口,域名已经解析到 118.81.0.1了。
本文和IPv6没有关系,v6不需要做NAT,直接能把远程的公网地址块分配给本机,然后继续划分子网。此处不再赘述。
首先更新系统软件包:
  1. apt update
复制代码

Openwrt之外的Linux发行版没有默认为路由器做优化,所以需要手动设置:
开启内核数据包转发:
  1. echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
  2. echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
  3. echo "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf
复制代码
这是让服务器转发【源IP和目标IP都不是本机】的数据包。
开启连接跟踪,关闭严格的数据包过滤:
  1. net.netfilter.nf_conntrack_acct = 1
  2. net.ipv4.conf.all.rp_filter = 0
复制代码
连接跟踪对于NAT很重要,端口转发也是一种NAT。
rp_filter =0: 不开启对数据包源地址的校验。因为这种情况下,来回程路由不一样。(不确定,但大佬建议我关闭)

设置连接标记:
  1. iptables -t mangle -A PREROUTING -p tcp --dport 18080 -j CONNMARK --set-mark 100
复制代码

为入站目标端口是18080的数据包打上标记0x64,就是十进制的100.
设置端口转发:
  1. iptables -t nat -A PREROUTING -p tcp --dport 18080 -j DNAT --to-destination 192.168.1.2:80
复制代码

将公网IP:18080 转发给局域网Web服务器的80端口,端口转发是DNAT(目标NAT)
再次设置标记(?):
  1. iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
复制代码

看命令的英文像是恢复标记,这条是GPT告诉我的,缺了它似乎不能用。
GPT的解释: 恢复连接标记,以确保数据包在经过 PREROUTING 链时能够保留先前设置的连接标记,从而让数据包按照正确的路径转发。
局域网IP开启NAT:
  1. iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
复制代码

然后创建路由表,搭配策略路由使用。
  1. nano /etc/iproute2/rt_tables
复制代码

在里面输入
  1. 100 remote
  2. 200 direct
复制代码
数字代表优先级,remote和direct代表表名。但实际上直连流量用默认的就可以,这里创建似乎没用到。
然后保存,回到终端,设置策略路由:
先启动WG接口,否则提示找不到设备:
  1. wg-quick up wg
复制代码
其中wg是配置文件的名字,将用作网卡名。位于 /etc/wireguard/里面。
为路由表remote添加一条默认路由:
  1. ip route add default dev wg table remote
复制代码

设置策略,NAT端口转发的流量被标记为100,走main表(系统自带的),优先级为1000(数字越小,优先级越高):
  1. ip rule add fwmark 100 table main priority 1000
复制代码

来自局域网vmbr0网卡的所有流量走扶墙,优先级为1500:
  1. ip rule add dev vmbr0 table remote priority 1500
复制代码

这时候在ITDOG或者外网PING一下公网IP:转发端口,应该仍然可以PING通。
(之前如果不设置标记,则修改默认路由后,回程数据包也走扶墙出去了,所以出口IP也不同,TCP握手直接失败)
如果是转发的SSH,可以故意输错密码,看一下日志里面记录的IP,这样NAT是不会丢失源IP的(不会显示来自192.168.1.1)
TCPING 118.81.0.1 18080
来自 118.81.0.1:18080/TCP 的回复: 端口开放 时间=11ms
来自 118.81.0.1:18080/TCP 的回复: 端口开放 时间=11ms
来自 118.81.0.1:18080/TCP 的回复: 端口开放 时间=10ms
来自 118.81.0.1:18080/TCP 的回复: 端口开放 时间=11ms
118.81.0.1:18080 的 Ping 统计信息:
    数据包: 已发送 4,已接收 = 4,丢失 = 0,(0% 丢失)
往返行程的估计时间(以毫秒为单位):
    最短 = 10ms,最长= 11ms,平均= 11ms
在服务器上执行
  1. conntrack -L | grep 18080
复制代码
跟踪连接状态。
如果报错找不到命令,则需要手动安装:
  1. apt install conntrack
复制代码
连接跟踪工具。
输出:
tcp      6 431995 ESTABLISHED src=218.26.158.76 dst=118.81.0.1 sport=53199 dport=18080 src=192.168.1.2 dst=218.26.158.76 sport=80 dport=53199 [ASSURED] mark=100 use=1
可以看到,出站时,源端口是80,而进来时是18080.
出站的目标IP是公网IP,如果之前改了默认路由,则就走WG出去了,然后NAT成别的IP,就不能握手了。
mark = 100代表之前打的标记正确生效。
218.26.158.76是山西省联通手机流量的IP,代表我现在正在外网访问。
118.81.0.1是家宽IP。
客户端上网:
traceroute 1.1.1.1
traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 60 byte packets
1  192.168.1.1 (192.168.1.1)  0.271 ms  0.250 ms  0.222 ms | PVE路由器
2  100.74.0.1 (100.74.0.1)  100.120 ms  100.407 ms  100.708 ms | 远程Wireguard接口的IP(在VPS上)
3  one.one.one.one (1.1.1.1)  108.850 ms  108.995 ms  109.210 ms | CF的DNS,VPS套了Warp,所以显示一跳就到达。
端口转发和全局代理成功共存!
鸣谢 & 参考资料 (排名不分先后)
LOC坛友:@我太难了
我这样讲你看你理不理解,假设有个用户ip1访问你的服务器ip2,恰好你又装了wireguard ip3。本来应该是 ip2向ip1回数据包,这个时候会变成ip3向ip1回. 所以你在你的80端口的服务器上面,要配置路由表。源端口为80端口的不经过wireguard即可。wireguard的流量也是通过路由表控制的。
NS坛友: starryloki
我和楼主部署的情况类似,但是主路由用的是RouterOS,不过底层都是Linux该有的功能都会有。
在ROS上配置mangle标记数据包使返回包可以走源出口前需要关闭“rp-filter”以及打开“connection tracking”,都是Linux内核的功能,不知道楼主的PVE有没有正确配置这两个选项?
ChatGPT 3.5
网络地址转换(NAT)之连接跟踪工具
连接跟踪(conntrack):原理、应用及 Linux 内核实现
发表于 2023-12-15 19:06:49 | 显示全部楼层
本帖最后由 临云 于 2023-12-20 17:41 编辑
aliyunmm 发表于 2023-12-15 18:34
什么垃圾东西,话都说不清楚


你又是个什么j/8玩意?loc技术贴越来越少了,以前的大佬全被你们这群j/8玩意骂跑了。你牛逼你也写几个帖子来啊,怎么没看见你写?敲键盘谁不会?


更新:这说话风格好像是5K狗吧?
发表于 2023-12-15 19:09:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2023-12-15 18:57:55 | 显示全部楼层
我觉得你玩过Netch.exe之后可以不用Wireguard
 楼主| 发表于 2023-12-15 18:31:08 | 显示全部楼层
补充:Wireguard要增加 `Table = off` ,让它只负责接通线路,不去动系统路由。VPS上装Warp装失联的比比皆是,就是WG全局代理,把VPS的IP也代理了。
发表于 2023-12-15 18:34:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2023-12-15 18:47:20 | 显示全部楼层
牛逼,虽然看不懂
 楼主| 发表于 2023-12-15 19:03:39 | 显示全部楼层
lisa1937 发表于 2023-12-15 19:57
我觉得你玩过Netch.exe之后可以不用Wireguard

好久没更新了,毕竟V2没法代理ICMP,我还想连上之后随时测个路由

而且没有掉线保护,假如扶墙掉线,下面设备全断网了,这个掉了就直连了。

不过也挺好用的。
发表于 2023-12-15 19:07:49 | 显示全部楼层
看不懂绑定,支持技术贴
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-9 22:27 , Processed in 0.063548 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表