我是 iptables 的新手,几天来我一直在 Google 上搜索,但没有找到解决这个问题的好方法。
我有一台计算机 A,它有一个公共 IP 地址(例如 192.0.2.1),可以不受限制地访问互联网。我还有另一台计算机 B,它有一个私有 IP 地址(192.168.1.1),只能访问计算机 A。如何使用 iptables 将网络流量从 B 通过 A 转发到互联网?我需要使用 http、ftp 和 https 才能将 apt-get 与 sudo 一起使用。
两台计算机都运行 Ubuntu Linux。我尝试过使用 Squid,但我认为它对于我需要做的事情来说太复杂了。
答案1
我认为这会满足您的要求,假设网络是这样的:
Internet <---->计算机A<---->计算机B
注:是连接到互联网的
<external interface>
接口(如eth0
、等)p1p1
计算机A.<internal interface>
接口是计算机A连接到计算机B。
这些命令需要以 root 身份运行(su -
在计算机A(可以访问互联网的那个)。
EXT=<external interface>
INT=<internal interface>
echo 1 > /proc/sys/net/ipv4/ip_forward #Tell the system it is OK to forward IP packets
iptables -t nat -A POSTROUTING -o $EXT -j MASQUERADE
iptables -A FORWARD -i $EXT -o $INT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -j ACCEPT
ip addr show $INT
在命令的输出中ip addr
,找到以 开头的行inet
(inet6
如果您使用的是 IPv6)。在以下命令中,以 root 身份使用该行上的 IP 地址计算机B:
ip route add default via <put ComputerA's internal IP address here>
ping google.com
现在,通过运行来查看它是否有效计算机B,或者只是尝试在浏览器中加载网页。
如果你想保存更改计算机A,以 root 身份运行以下命令:
apt-get install iptables-persistent
/etc/init.d/iptables-persistent save
现在我不知道如何在启动时恢复已保存的规则,有人能建议一下吗?/etc/init.d/iptables-persistent reload
每次启动后都应该以 root 身份执行此操作,但这会很麻烦。
制作计算机B总是使用计算机A因为默认网关需要在计算机A,我不想在这个答案中深入讨论。
答案2
现在我不知道如何在启动时恢复已保存的规则,有人能给出建议吗?每次启动后执行 /etc/init.d/iptables-persistent reload(以 root 身份)应该可行,但那会很麻烦。
只需在 /etc/rc.local 或类似文件中添加更改
要使计算机 B 始终使用计算机 A 作为默认网关,需要在计算机 A 上安装 DHCP,我不想在此答案中详细介绍。
静态设置地址
答案3
我使用 squid 来做这件事,它是一种功能强大且复杂的工具,但 Squid 真正用于缓存。然后,您将使用 host1 作为缓存代理主机,尽管您可以使用它,但它却没有抓住要点。我之前使用 IPTABLES 做过您想做的事情(回到 ipchains 之后!)。如果我没记错的话,它涉及编写一条规则,将传入的匹配数据包转发到另一条路由。这里有很多信息(如果上面的链接没有足够的信息)。
http://www.linuxtopia.org/Linux_Firewall_iptables/c951.html
我不认为使用 VPN 真的是一种简单的解决方案,但它错过了你想要做的事情的重点,所以我首先以正确的方式去做。VPN 适用于加密到另一台主机的流量。
答案4
尝试这个
http://www.debuntu.org/how-to-redirecting-network-traffic-to-a-new-ip-using-iptables/
或者使用“简单”的方式并使用 VPN。