找回密码
 立即注册
CeraNetworksBGVM服务器主机交流会员请立即修改密码Sharktech防护
查看: 14|回复: 0

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

[复制链接]

3

主题

44

回帖

143

积分

注册会员

积分
143
发表于 2023-12-15 18:02:38 | 显示全部楼层 |阅读模式
之前发了个求助贴,提问了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,直接能把远程的公网地址块分配给本机,然后继续划分子网。此处不再赘述。
首先更新系统软件包: apt update
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: 不开启对数据包源地址的校验。因为这种情况下,来回程路由不一样。(不确定,但大佬建议我关闭)
    设置连接标记:
    iptables -t mangle -A PREROUTING -p tcp --dport 18080 -j CONNMARK --set-mark 100
    为入站目标端口是18080的数据包打上标记0x64,就是十进制的100.
    设置端口转发:
    iptables -t nat -A PREROUTING -p tcp --dport 18080 -j DNAT --to-destination 192.168.1.2:80
    将公网IP:18080 转发给局域网Web服务器的80端口,端口转发是DNAT(目标NAT)
    再次设置标记(?):
    iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
    看命令的英文像是恢复标记,这条是GPT告诉我的,缺了它似乎不能用。
    GPT的解释: 恢复连接标记,以确保数据包在经过 PREROUTING 链时能够保留先前设置的连接标记,从而让数据包按照正确的路径转发。
    局域网IP开启NAT:
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
    然后创建路由表,搭配策略路由使用。
    nano /etc/iproute2/rt_tables
    在里面输入
    [ol]
  • 100 remote
  • 200 direct[/ol]复制代码数字代表优先级,remote和direct代表表名。但实际上直连流量用默认的就可以,这里创建似乎没用到。
    然后保存,回到终端,设置策略路由:
    先启动WG接口,否则提示找不到设备:wg-quick up wg其中wg是配置文件的名字,将用作网卡名。位于 /etc/wireguard/里面。
    为路由表remote添加一条默认路由: ip route add default dev wg table remote
    设置策略,NAT端口转发的流量被标记为100,走main表(系统自带的),优先级为1000(数字越小,优先级越高):
    ip rule add fwmark 100 table main priority 1000
    来自局域网vmbr0网卡的所有流量走扶墙,优先级为1500:
    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
    "
    在服务器上执行 conntrack -L | grep 18080 跟踪连接状态。
    如果报错找不到命令,则需要手动安装: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
    "
    端口转发和全局代理成功共存!
    鸣谢 & 参考资料 (排名不分先后)
    LOC坛友:@我太难了
    "
    NS坛友: starryloki
    "
    ChatGPT 3.5
    网络地址转换(NAT)之连接跟踪工具
    连接跟踪(conntrack):原理、应用及 Linux 内核实现
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|HS2V主机综合交流论坛

    GMT+8, 2024-11-1 13:33 , Processed in 3.208653 second(s), 5 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5 |   访问量:   |   访客量:  

    © 2001-2024 Discuz! Team. |   今日访问量:    |   今日访客量:  

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