我正在尝试使用 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
这是仅有的接受RELATED
或ESTABLISHED
连接进入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
希望这可以帮助