我有一个 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 在对我的问题的评论之一中提到的,我遇到了iptables
NAT 规则的问题。
- 以太网0:内部网络,192.168.1.200
- eth1:外部网络,192.168.0.2
我的 NAT 规则是:
$ iptables -t nat -A POSTROUTING ! -o eth0 -j MASQUERADE
这意味着,所有输出目标设备不是接口的流量以太网0将会被伪装。本地流量也会发生同样的情况,因为它来自罗界面。
将iptables
NAT 规则修复为:
$ iptables -t nat -A POSTROUTING ! -d 192.168.1.0/24 -j MASQUERADE
我的问题解决了!