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

查看 57|回复 2
作者:Just纱世里   
   
之前发了个求助贴,提问了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,直接能把远程的公网地址块分配给本机,然后继续划分子网。此处不再赘述。
首先更新系统软件包:[ol]apt update[/ol]复制代码
Openwrt之外的Linux发行版没有默认为路由器做优化,所以需要手动设置:
开启内核数据包转发:
[ol]echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf[/ol]复制代码这是让服务器转发【源IP和目标IP都不是本机】的数据包。
开启连接跟踪,关闭严格的数据包过滤:
[ol]net.netfilter.nf_conntrack_acct = 1
net.ipv4.conf.all.rp_filter = 0[/ol]复制代码连接跟踪对于NAT很重要,端口转发也是一种NAT。
rp_filter =0: 不开启对数据包源地址的校验。因为这种情况下,来回程路由不一样。(不确定,但大佬建议我关闭)
设置连接标记:
[ol]iptables -t mangle -A PREROUTING -p tcp --dport 18080 -j CONNMARK --set-mark 100[/ol]复制代码
为入站目标端口是18080的数据包打上标记0x64,就是十进制的100.
设置端口转发:
[ol]iptables -t nat -A PREROUTING -p tcp --dport 18080 -j DNAT --to-destination 192.168.1.2:80[/ol]复制代码
将公网IP:18080 转发给局域网Web服务器的80端口,端口转发是DNAT(目标NAT)
再次设置标记(?):
[ol]iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark[/ol]复制代码
看命令的英文像是恢复标记,这条是GPT告诉我的,缺了它似乎不能用。
GPT的解释: 恢复连接标记,以确保数据包在经过 PREROUTING 链时能够保留先前设置的连接标记,从而让数据包按照正确的路径转发。
局域网IP开启NAT:
[ol]iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE[/ol]复制代码
然后创建路由表,搭配策略路由使用。
[ol]nano /etc/iproute2/rt_tables[/ol]复制代码
在里面输入
[ol]100 remote
200 direct[/ol]复制代码数字代表优先级,remote和direct代表表名。但实际上直连流量用默认的就可以,这里创建似乎没用到。
然后保存,回到终端,设置策略路由:
先启动WG接口,否则提示找不到设备:[ol]wg-quick up wg[/ol]复制代码其中wg是配置文件的名字,将用作网卡名。位于 /etc/wireguard/里面。
为路由表remote添加一条默认路由:[ol]ip route add default dev wg table remote[/ol]复制代码
设置策略,NAT端口转发的流量被标记为100,走main表(系统自带的),优先级为1000(数字越小,优先级越高):
[ol]ip rule add fwmark 100 table main priority 1000[/ol]复制代码
来自局域网vmbr0网卡的所有流量走扶墙,优先级为1500:
[ol]ip rule add dev vmbr0 table remote priority 1500[/ol]复制代码
这时候在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
在服务器上执行[ol]conntrack -L | grep 18080[/ol]复制代码跟踪连接状态。
如果报错找不到命令,则需要手动安装:[ol]apt install conntrack[/ol]复制代码连接跟踪工具。
输出:
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 内核实现

端口, 公网, 数据包

Just纱世里
OP
  
补充:Wireguard要增加 `Table = off` ,让它只负责接通线路,不去动系统路由。VPS上装Warp装失联的比比皆是,就是WG全局代理,把VPS的IP也代理了。
aliyunmm   
什么垃圾东西,话都说不清楚
提问了PVE下让端口转发和全局代理共存时不通的问题。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部