我搞不懂 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 地址用于规则。
看一下这个:
答案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 了。