iptables:IP 别名和端口转发

Eam*_*orr 1 networking linux iptables

我无法弄清楚 iptables,我对网络也不太了解,我真的希望有人能帮助我。

我有一个服务器,它有两个关联的 IP 地址:1.1.1.1 和 2.2.2.2

运行 Ubuntu 10.04

这是我的 ifconfig:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:xx:xx:xx  
          inet addr:1.1.1.1  Bcast:xxx.xxx.xxx.xxx  Mask:xxx.xxx.xxx.xxx
          inet6 addr: xxxxxxxxxxxxxxxxxxxxxxxx Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8601280 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2520243 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1736805563 (1.7 GB)  TX bytes:412953236 (412.9 MB)
          Interrupt:11 

eth0:0    Link encap:Ethernet  HWaddr 00:16:3e:xx:xx:xx  
          inet addr:2.2.2.2  Bcast:xxx.xxx.xxx.xxx  Mask:xxx.xxx.xxx.xxx
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:11 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1216209 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1216209 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:13294196379 (13.2 GB)  TX bytes:13294196379 (13.2 GB)
Run Code Online (Sandbox Code Playgroud)

一切正常:当我在浏览器的地址栏中输入 1.1.1.1 或 2.2.2.2 时,我会按预期获得默认的 Apache2 页面。

现在,我有一个在浏览器中运行的应用程序,该应用程序在端口 8000 上有一个 WebSocket 连接。我像往常一样使用 1.1.1.1 通过端口 80 (http) 为页面提供服务,并且我让 WebSocket 在后台与 2.2.2.2 通信通过端口 8000。一切都很好。

现在我插入阻止端口 8000 的 3G 调制解调器。我与 2.2.2.2 的 WebSocket 通信失败。

我希望 WebSocket 通过端口 80 与 2.2.2.2 通信,但让服务器将 2.2.2.2:80 上的请求转换为 1.1.1.1:8000。

我发现了这个:meteorserver dot org/installation/(见第 6 节)但它没有用;(我也试过这个:http ://www.cyberciti.biz/faq/linux-port-redirection-with-iptables/但它给了我以下错误:

ubuntu> sudo iptables -t nat -A PREROUTING -i eth0:0 -p tcp --dport 80 -j REDIRECT --to-port 8000
Warning: weird character in interface `eth0:0' (No aliases, :, ! or *).
Run Code Online (Sandbox Code Playgroud)

显然不支持 IP 别名;(我尝试将 eth0:0 放在引号中,但仍然无法正常工作。

我完全被难住了。

Eva*_*son 10

你在正确的轨道上。您不必指定“别名”输入接口。从 iptables 的角度来看,即使目标 IP 地址是 2.2.2.2,输入接口仍然是 eth0。试试这种方式:

iptables -t nat -A PREROUTING -i eth0 -d 2.2.2.2 -p tcp --dport 80 -j REDIRECT --to-port 8000
Run Code Online (Sandbox Code Playgroud)

那应该做你正在寻找的。

编辑:

您需要在该命令中使用“eth0”——而不是“eth0:0”(这是不合法的)。数据包进入的物理接口是“eth0”,这是所有 iptables 所关心的。

除非您使用的协议是基于 UDP 的,否则您不需要相应的“-p udp”条目。

现在要查看“PREROUTING”链中的内容,请执行iptables -t nat -L. 您可以使用以下方式从链中删除单个条目,iptables -t nat -D PREROUTING x其中“x”是您要删除的链中条目的顺序计数(第一个是“1”,第二个是“2”等),如下所示iptables -t nat -L.