我有 CentOS 实例,就像本地网络的 NAT。本地网络中有一些子网。其中一个子网内有一个 PPTP VPN 服务器。我需要将此服务器发布到 Internet。
所以。我的问题是流量无法从一条nat/PREROUTING
链传递到另一条filter/FORWARD
链。
1.1.1.1
我的外部 IP 是192.168.10.1
是我的内部IP10.0.1.1
是 VPN 服务器 IPeth0
是外部接口eth1
是内部接口
NAT 规则(它起作用了,PKTS
而且BYTES
发生了改变)
-A PREROUTING -d 1.1.1.1/32 -i eth0 -p tcp -m tcp --dport 1723 -j DNAT --to-destination 10.0.1.1
-A PREROUTING -d 1.1.1.1/32 -i eth0 -p gre -j DNAT --to-destination 10.0.1.1
FILTER 规则(它不起作用。PKTS
并且BYTES
没有改变)
-A FORWARD -d 10.0.1.1/32 -i eth0 -o eth1 -p tcp -m tcp --dport 1723 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.0.1.1/32 -i eth1 -o eth0 -p tcp -m tcp --sport 1723 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.1.1/32 -i eth0 -o eth1 -p gre -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.0.1.1/32 -i eth1 -o eth0 -p gre -m state --state RELATED,ESTABLISHED -j ACCEPT
当然,net.ipv4.ip_forward = 1
我可以10.0.1.1
从 NAT 服务器 ping 通。
端口tcpdump
1723 上仅显示外部接口上的操作。
我不知道。
UPD1
。我用检查了路由ip route get 10.0.1.1 from <src> iif eth0
,得到了RTNETLINK answers: Invalid argument
。顺便说一句,我得到了一些答案,然后我使用了任何名称iif
(eth0
,,)。我得到了有效的路线,然后没有使用参数。eth1
eth2
iif
UPD2
。我首先将-A FORWARD -d 10.0.1.1/32 -j ACCEPT
规则添加到filter/FORWARD
链中。但什么也没有。数据包和字节为零。
答案1
其他规则非常重要。规则的顺序也很重要。因此,请检查命令的输出
iptables-save -c
。调查您创建的规则之上的规则。nat/PREROUTING
在和链之间filter/FORWARD
做出路由决策。使用检查路由ip route get 10.0.1.1 from <src> iif eth0
。它应该返回有效路由。如果是其他内容,请将其粘贴到问题中。还调查命令的输出
nstat -az
。要通过 NAT 传递 pptp,您需要加载 conntrack 模块:
nf_conntrack_proto_gre
nf_nat_proto_gre
nf_conntrack_pptp
nf_nat_pptp
在最近的内核中,您应该明确启用 conntrack 助手,尤其是对于 pptp。因此您需要添加附加规则。
iptables -t raw -A PREROUTING -p tcp -m tcp --dport 1723 -j CT --helper pptp
- 启用帮助程序的另一种方法是 sysctl 命令:
sysctl -w net.netfilter.nf_conntrack_helper=1
- 解决问题的其他工具:
conntrack -E
- conntrack 事件监控tcpdump
-j NFLOG
和tcpdump -ni nflog
- 允许从 iptables 规则捕获数据包。-j TRACE
目标 - 您可以通过防火墙规则调查数据包的路径。
附言如果您仍然遇到困难,请更新问题。