服务器A
- eth0 网络接口
- wg0 vpn接口10.66.66.1
服务器B
- wg0 vpn接口 10.66.66.2
如何使用 iptables 将流量从 eth0 转发到 wg0 10.66.66.2?我想将以下 TCP 和 UDP 端口转发到服务器B
TCP:2302, 27015-27030, 27036-27037 UDP:2302, 4380, 27000-27031, 27036
我已经尝试过转发所有短信,但无济于事。
sudo iptables -A FORWARD --in-interface eth0 -j ACCEPT
sudo iptables --table nat -A POSTROUTING --out-interface wg0 -j MASQUERADE
编辑:
我是否iptables -L
需要介意传统 iptables 与“正常” iptables 之间的歧义
[root@vmd40065 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# Warning: iptables-legacy tables present, use iptables-legacy to see them
[root@vmd40065 ~]# iptables-legacy -L
bash: iptables-legacy: command not found...
答案1
IP 转发
如何使用 iptables 将流量从 eth0 转发到 wg0 10.66.66.2?
您无法使用 iptables (单独) 来执行此操作。使用 iptables,您可以进行过滤和 NAT,但 iptables 不执行数据包转发。
要转发传入的数据包,您需要在内核中启用 IP 转发。sysctl net.ipv4.ip_forward
您可以使用该命令检查 IP 转发是否已启用。
引自Linux 内核文档:
0 - disabled (default)
not 0 - enabled
Forward Packets between interfaces.
您可以通过执行 来启用此功能sysctl net.ipv4.ip_forward=1
,但此更改不是永久性的,它会在重启时重置。要使其永久生效,您需要net.ipv4.ip_forward = 1
在 sysctl 配置文件之一(例如/etc/sysctl.conf
)中添加配置条目 ( )。请参阅man sysctl.conf
了解配置文件的完整列表。
如果你想限制转发的内容,你可以向你的向前规则,例如:
--protocol tcp
或者--protocol udp
--destination-port 27000:27031
如果需要,请参阅man iptables
和iptables-extensions
了解更多参数。
请注意添加接受规则向前如果连锁政策是接受无论如何,你没有任何降低規則。
NAT
您的 iptables SNAT 规则路由后链条看上去正确。
如果来自 eth0 的流量尚未将其目标地址设置为10.66.66.2
,那么您还需要在预路由chain。这是为了修改数据包的目标地址,以便路由可以相应地选择传出接口。这应该是这样的:
iptables --table nat --append PREROUTING --in-interface eth0
--protocol udp --destination-port 27000:27031
--jump DNAT --to-destination 10.66.66.2:27000-27031
调试
对于调试目的来说,以下做法可能会有帮助:
tcpdump
观察两台服务器上的流量。- 列出规则时添加
--verbose
到 iptables。这样,您可以看到有多少数据包(如果有)受到哪条规则的影响。