如何使用定义的本地 IP 而不是外部 IP

如何使用定义的本地 IP 而不是外部 IP

我有一个 Gentoo Linux 服务器。服务器连接到两个网络:内部和外部。

Internal network ip: 192.168.1.200
External network ip: 192.168.0.2

如果我尝试从服务器向自身发出请求,它会使用外部网络 IP。使用 Wget 连接到 nginx 会给出以下日志记录:

server ~ # tail -n 1 /var/log/nginx/error_log
192.168.0.2 - - [27/Aug/2014:19:04:42 +0300] "GET / HTTP/1.1" 200 5 "-" "Wget/1.14 (linux-gnu)"

尽管如此,我还是直接连接到 192.168.1.200:

server ~ # wget http://192.168.1.200/

路由表(外部网络上的指标较高,但似乎被忽略): ip路由显示

server ~ # ip route
192.168.0.0/30 dev wan  scope link  metric 20 
192.168.1.0/24 dev lan  scope link  metric 10 

ip路由获取:

server ~ # ip route get 192.168.1.200
local 192.168.1.200 dev lo  src 192.168.1.200 
    cache <local> 

如何让这台机器使用 192.168.1.200 而不是 192.168.0.2 连接到自身?

答案1

如果您运行的每个程序都遇到此问题,您应该检查您的服务器防火墙规则。确保它仅用于NAT外部目的地。如果您有广泛的规则,您的路由表就没有意义NAT

修复防火墙规则后,对于wget,您可以使用--bind-address选项来选择要使用的接口:

wget --bind-address=192.168.1.200 http://192.168.1.200/

wget 文档:

'--绑定地址=地址'

建立客户端 TCP/IP 连接时,绑定到本地计算机上的 ADDRESS。 ADDRESS 可以指定为主机名或 IP 地址。如果您的计算机绑定到多个 IP,则此选项会很有用。

您可以使用.wgetrc文件以使其永久生效。

答案2

正如 @Patrick 在对我的问题的评论之一中提到的,我遇到了iptablesNAT 规则的问题。

  • 以太网0:内部网络,192.168.1.200
  • eth1:外部网络,192.168.0.2

我的 NAT 规则是:

$ iptables -t nat -A POSTROUTING ! -o eth0 -j MASQUERADE

这意味着,所有输出目标设备不是接口的流量以太网0将会被伪装。本地流量也会发生同样的情况,因为它来自界面。

iptablesNAT 规则修复为:

$ iptables -t nat -A POSTROUTING ! -d 192.168.1.0/24 -j MASQUERADE

我的问题解决了!

相关内容