iptables:IP 别名和端口转发

iptables:IP 别名和端口转发

我搞不懂 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)

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

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

现在我插入了阻止端口 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 *).

显然不支持 IP 别名;(我尝试将 eth0:0 放在引号中,但仍然不起作用。

我完全不知所措。

答案1

您走在正确的轨道上。您不必指定“别名”输入接口。从 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

这应该能满足您的要求。

编辑:

您需要在该命令中使用“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

答案2

不要匹配设备名称。尝试仅根据 IP 进行匹配

sudo iptables -t nat -A PREROUTING --destination 2.2.2.2 -p tcp --dport 80 -j REDIRECT --to-port 8000

答案3

我将用其他问题来回答你的问题:D

问:如何在规则中将别名网络接口与防火墙一起使用(例如 eth0:0)?

A:当前 Linux 实现不允许在 iptables/netfilter 规则中区分 eth0 或 eth0:0。您只能指定 eth0,它会自动包含 eth0:0(和其他别名接口)。但是,您可以将别名接口的 IP 地址用于规则。

看一下这个:

Linux iptables:端口重定向示例

答案4

另一种方法:使用虚拟接口(macvlan)。

IP 别名是一种高级技巧,iptables 只会看到一个接口(真实接口)。您可以按照建议直接使用 IP 范围来避免此问题。

使用 vlan 接口时,您不应该遇到任何 netfilter/iptables 问题,因为它们在内核级别上的行为与普通接口一样。要添加新的(您不需要指定 mac):

ip link 添加链接 name_real_if 地址 mac:virt:if name_virt_if 类型 macvlan

这样,您就可以直接在 osi2 上工作,实际上您可以在网桥配置中使用它们,独立于 ip 分配制定防火墙/qos 规则......

我花了一段时间才找到这个解决方案,我一直使用 ifconfig eth0:0,它快速且有用,但也许是时候迁移到 iproute2 了。

相关内容