对于我的工作,我们有一个测试空间,里面有一台 Ubuntu 服务器,它也是一个路由器。昨天我们在机架上放置了一台新服务器,我们的目的是让它成为一个可以从互联网访问的网络服务器。Ubuntu 服务器/路由器首先只是一个路由器,它将流量从内部重定向到外部,它是一个 DHCP 服务器。
为了使路由器路由到 Internet,我们使用iptables
NAT:
*nat
:PREROUTING ACCEPT [323:23056]
:INPUT ACCEPT [59:6795]
:OUTPUT ACCEPT [31:2677]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth5 -j MASQUERADE
-A POSTROUTING -o eth2 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [278:36336]
:FORWARD ACCEPT [18603:9408689]
:OUTPUT ACCEPT [105:12060]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
现在我们想将一些流量重定向到 Web 服务器,但我们有几个公网 IP 地址。我们想将所有到 IP 地址 xxx.xxx.xxx.14 的流量路由到内部 IP 地址 10.10.10.10。
我尝试应用以下规则iptables
:
iptables -t nat -A PREROUTING -d xxx.xxx.xxx.14 -j DNAT --to 10.10.10.10
iptables -t nat -A POSTROUTING -s 10.10.10.10 -j SNAT --to-source xxx.xxx.xxx.14
但它似乎没有起到作用。
由于我的 Ubuntu/Linux 技能很低,我不知道我到底做错了什么。有人能帮我解决我的问题吗?
意思是所有到 IP xxx.xxx.xxx.14 的流量都被重定向到 10.10.10.10。所有其他流量都不需要处理,可以作为普通 NAT 流量重定向到eth5
。
eth2
是外部以太网端口。eth5
是内部以太网端口。
答案1
请检查 IP 转发是否已启用,若未启用,请启用它。
$ cat /proc/sys/net/ipv4/ip_forward
1
$ sudo su
# echo "1" > /proc/sys/net/ipv4/ip_forward
# exit
exit
$
编辑:好的,因此 ip_forward 已启用。
然后删除对 eth5 执行 MASQUERADE 的行。
确保您的特定 POSTROUTING 命令在规则集中位于通用命令之前。我的意思是:
iptables -t nat -A POSTROUTING -s 10.10.10.10 -j SNAT --to-source xxx.xxx.xxx.14
可能需要这样:
iptables -t nat -I 1 POSTROUTING -s 10.10.10.10 -j SNAT --to-source xxx.xxx.xxx.14
(或类似的,我没有检查语法)或者如果您拥有整个主规则集,请将其放在另一个之前。
注意:
使用默认的 ACCEPT 策略规则,您不需要条件 ACCEPT。