如何仅使用iptables将特定流量通过指定WAN接口转发?
如何仅使用iptables将特定流量通过指定WAN接口转发?
当然可以只用iptables(配合少量路由策略命令)实现这个需求!你之前只完成了数据包标记这一步,但还缺少路由规则和地址转换的关键配置,这就一步步帮你搞定:
第一步:标记目标LAN流量
先完善你的数据包标记规则,确保只针对从LAN接口(eth0)发往指定IP的80/443流量打标记,避免误处理其他流量:# 替换$PUBLIC_IP为你要定向的目标IP,比如8.8.8.8 iptables -t mangle -A PREROUTING -i eth0 -d $PUBLIC_IP -p tcp --dports 80,443 -j MARK --set-mark 0x77你可以用
iptables -t mangle -L PREROUTING -n -v命令检查这条规则是否生效。第二步:创建专属路由表并配置默认路由
我们需要给标记过的流量单独设置一条走wan1的路由:- 首先在路由表配置文件里添加一个专属表:
echo "100 wan1route" >> /etc/iproute2/rt_tables - 给这个表添加wan1的默认路由(替换
<wan1网关>为你实际的wan1网关地址,比如192.168.2.1):ip route add default via <wan1网关> dev wan1 table wan1route
- 首先在路由表配置文件里添加一个专属表:
第三步:让标记流量走专属路由表
告诉系统,所有带有0x77标记的数据包都使用我们刚创建的wan1route路由表:ip rule add fwmark 0x77 table wan1route可以用
ip rule list查看这条规则是否存在。第四步:配置源地址转换(SNAT)
从wan1出去的流量必须把源地址换成wan1的公网IP,否则返程流量找不到回到LAN的路径:- 如果wan1是静态IP(替换
<wan1公网IP>为实际地址):iptables -t nat -A POSTROUTING -o wan1 -m mark --mark 0x77 -j SNAT --to-source <wan1公网IP> - 如果wan1是DHCP动态获取的IP,用MASQUERADE更灵活:
iptables -t nat -A POSTROUTING -o wan1 -m mark --mark 0x77 -j MASQUERADE
- 如果wan1是静态IP(替换
第五步:保存配置,确保重启后生效
- 保存iptables规则:根据你的系统,执行
iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或者service iptables save(CentOS/RHEL) - 保存路由规则:把添加路由和ip rule的命令加到
/etc/rc.local或者系统的开机启动脚本中,避免重启后配置丢失。
- 保存iptables规则:根据你的系统,执行
小提示
可以用traceroute 8.8.8.8从LAN内的设备测试,看看流量是否走wan1的网关;也可以用iptables -t mangle -vL PREROUTING查看标记规则的匹配计数,确认流量是否被正确标记。
备注:内容来源于stack exchange,提问作者murselmurga
相关产品推荐
相关产品推荐

