使用外部转发端口通过 OpenVPN(tun0)进行 IP 转发

使用外部转发端口通过 OpenVPN(tun0)进行 IP 转发

我正在尝试使用 Ubuntu Server 15.04 配置一个非常基本的路由设置。

我有一个内部接口 p4p1(IP 192.168.0.23)和一个使用 tun0 的工作 OpenVPN 连接。

我想将所有流量从 p4p1 转发到 tun0 和互联网,以便我的整个网络都能获得 OpenVPN 连接的好处——我知道这并不是什么新鲜事。

显然,这很常见,并且网络上有很多指南,我遵循了以下指南:https://help.ubuntu.com/community/Router。具体来说,是“4.5. 启用 IP 转发和伪装”,一切按预期运行 - 除了我的外部转发端口不再工作。从那篇文章中,这是我正在使用的脚本:

echo -e "\n\nLoading simple rc.firewall-iptables version $FWVER..\n"
DEPMOD=/sbin/depmod
MODPROBE=/sbin/modprobe

EXTIF="tun0"
INTIF="p4p1"

echo "   External Interface:  $EXTIF"
echo "   Internal Interface:  $INTIF"

#======================================================================
#== No editing beyond this line is required for initial MASQ testing == 
echo -en "   loading modules: "
echo "  - Verifying that all kernel modules are ok"
$DEPMOD -a
echo "----------------------------------------------------------------------"
echo -en "ip_tables, "
$MODPROBE ip_tables
echo -en "nf_conntrack, " 
$MODPROBE nf_conntrack
echo -en "nf_conntrack_ftp, " 
$MODPROBE nf_conntrack_ftp
echo -en "nf_conntrack_irc, " 
$MODPROBE nf_conntrack_irc
echo -en "iptable_nat, "
$MODPROBE iptable_nat
echo -en "nf_nat_ftp, "
$MODPROBE nf_nat_ftp
echo "----------------------------------------------------------------------"
echo -e "   Done loading modules.\n"
echo "   Enabling forwarding.."
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "   Enabling DynamicAddr.."
echo "1" > /proc/sys/net/ipv4/ip_dynaddr 
echo "   Clearing any existing rules and setting default policy.."

iptables-restore <<-EOF
*nat
-A POSTROUTING -o "$EXTIF" -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i "$EXTIF" -o "$INTIF" -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
-A FORWARD -i "$INTIF" -o "$EXTIF" -j ACCEPT
-A FORWARD -j LOG
COMMIT
EOF

echo -e "\nrc.firewall-iptables v$FWVER done.\n"

通过我的 VPN 提供商,我转发了两个端口,因此我可以通过 VPN 连接访问 Ubuntu Server 上的各种服务。当我没有启用 IP 转发和伪装(通过该文章中的脚本)时,一切都按预期工作,但只要我使用该脚本,转发的端口就不起作用。

我显然错过了一些东西,并且对 iptables 了解不够,无法弄清楚如何仍然可以将流量从 p4p1 转发到 tun0,并且仍然允许通过转发的端口进行外部访问。

任何帮助都将不胜感激 - 如果您愿意解释您提供的解决方案,我很乐意进一步了解发生了什么。

谢谢你!

答案1

您的问题可能是由于以下规则而发生的:

-A FORWARD -i "$EXTIF" -o "$INTIF" -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 

这是仅有的接受RELATEDESTABLISHED连接进入tun0(外部)接口并离开p4p1(内部)接口,因此当外部连接尝试连接到您的端口转发服务时,连接将被丢弃,因为它是NEW。您必须修改该规则以完全排除 conntrack 模块,或包含该NEW参数。

以下两条规则中的任何一条都应该可以解决您的问题:

-A FORWARD -i "$EXTIF" -o "$INTIF" -j ACCEPT

-A FORWARD -i $EXTIF -o $INTIF -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

希望这可以帮助

相关内容