·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

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

287 9
发表于 2023-12-15 19:19:14 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
之前发了个求助贴,提问了【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.confecho "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.confecho "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf
复制代码
这是让服务器转发【源IP和目标IP都不是本机】的数据包。
开启连接跟踪,关闭严格的数据包过滤:
  1. net.netfilter.nf_conntrack_acct = 1net.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 remote200 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 内核实现
我要说一句 收起回复

评论9

浅生Lv.8 发表于 2023-12-15 19:20:04 | 查看全部
你又是个什么j/8玩意?loc技术贴越来越少了,以前的大佬全被你们这群j/8玩意骂跑的,你牛逼你也写几个帖子来啊,敲键盘谁不会?
我要说一句 收起回复
独家记忆Lv.8 发表于 2023-12-15 19:21:00 | 查看全部
我觉得你玩过Netch.exe之后可以不用Wireguard
我要说一句 收起回复
CrystαlLv.8 发表于 2023-12-15 19:21:12 | 查看全部
补充:Wireguard要增加 `Table = off` ,让它只负责接通线路,不去动系统路由。VPS上装Warp装失联的比比皆是,就是WG全局代理,把VPS的IP也代理了。
我要说一句 收起回复
婷姐Lv.8 发表于 2023-12-15 19:21:23 | 查看全部
什么垃圾东西,话都说不清楚
提问了PVE下让端口转发和全局代理共存时不通的问题。
我要说一句 收起回复
CrystαlLv.8 发表于 2023-12-15 19:21:57 | 查看全部
改了,没必要这么大戾气吧。:)
我要说一句 收起回复
IT618发布Lv.8 发表于 2023-12-15 19:22:31 | 查看全部
牛逼,虽然看不懂
我要说一句 收起回复
CrystαlLv.8 发表于 2023-12-15 19:23:22 | 查看全部
好久没更新了,毕竟V2没法代理ICMP,我还想连上之后随时测个路由:lol

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

不过也挺好用的。
我要说一句 收起回复
TyCodingLv.8 发表于 2023-12-15 19:24:20 | 查看全部
看不懂绑定,支持技术贴
我要说一句 收起回复
婷姐Lv.8 发表于 2023-12-15 19:24:53 | 查看全部
使整个局域网连接世界

世界?

小学作文水平都没过关

不说了。累
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

最新热评 加载中...
AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:216.73.216.34,GMT+8, 2025-6-1 12:45 , Processed in 0.636196 second(s), 104 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表