Skip to main content

对外开放localhost服务

背景:在本地localhost搭建了一个Httpserver,监听在4000端口,现在想通过eth0在不改动代码的情况下对外发布服务。

rinetd

最先想到的就是端口映射,rinetd服务,使用也很简单,直接配置外部ip到环回地址的映射就可以了:

root@lfgphicpra39095:/usr1/# cat /etc/rinetd.conf
......
#
# forwarding rules come here
#
# you may specify allow and deny rules after a specific forwarding rule
# to apply to only that forwarding rule
#
# bindadress bindport connectaddress connectport

**10.252.64.154 4000 127.0.0.1 4000**

但是这样一来,一旦eth0的地址发生了改变,就需要再修改配置文件。

iptables

另一种方法就是通过iptables就行重定向:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 4000 -j DNAT --to-destination 127.0.0.1

配置后,外部访问不通,通过抓包分析,协议栈没有回复syc+ack报文,看来是路由的问题。

内核协议栈会丢弃路由 对于源地址或目的地址为loopback地址的,内核协议栈的认为这是一个martian packet,直接丢弃。

route_localnet – BOOLEAN: Do not consider loopback addresses as martian source or destination while routing. This enables the use of 127/8 for local routing purposes (default FALSE).

这个特性是对每个网卡设备生效的,所以只需要在eth0上开启环回地址路由就可以了

echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet