我有一台笔记本电脑,其网络设置有些奇怪:为了能够将来自我的虚拟机和容器的任何互联网访问转发到我的笔记本电脑碰巧拥有的任何默认路由(可能是wlan0
、eth0
或ppp0
),我设置了通常的sysctl net.ipv4.ip_forward=1
和我的以下内容/etc/network/interfaces
:
auto lxcbr0
iface lxcbr0 inet static
address 192.168.56.1
netmask 255.255.255.0
bridge_ports none
bridge_fd 0
bridge_maxwait 0
# XXX: no --out-interface
up iptables -t nat -A POSTROUTING -j MASQUERADE
down iptables -t nat -D POSTROUTING -j MASQUERADE
我使用 NetworkManager 来获取 Internet 连接。到目前为止,这一切正常,直到我尝试启动fossil ui
,结果发现127.0.0.1
在此设置中连接会导致客户端地址来自不同的子网。
例如,以下 Perl 脚本:
#!/usr/bin/perl
use 5.020;
use IO::Socket::INET;
say IO::Socket::INET::->new(
Proto=>"tcp", Listen=>0,
LocalAddr=>"127.0.0.1:8080",
ReuseAddr=>1, ReusePort=>1,
)->accept->peerhost;
127.0.0.1
如果我用来连接它,通常会打印nc 127.0.0.1 8080
(并且在我的其他机器上也是如此),但在这台笔记本电脑上它会打印(这确实是我当前默认路由所在192.168.1.11
的地址)。wlan0
我尝试添加一条特殊的路线到127.0.0.0/8
via lo
,但它没有改变任何东西。
如何使本地主机连接的行为就像它们实际上来自本地主机一样?
答案1
将 NAT 防火墙规则添加! --out-interface lo
到了这一点:现在lo
访问受通常的法律管辖,并且不会受到任何伪装(因为它不应该受到伪装)。