我无法弄清楚iptables,而且我不太了解networking,我真的希望有人能帮助我。
我有一个服务器与两个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)
一切工作正常:当我在浏览器的地址栏中input1.1.1.1或2.2.2.2时,按照预期得到默认的Apache2页面。
现在,我有一个运行在浏览器中的应用程序,它具有通过端口8000的WebSocket连接。我使用1.1.1.1通过端口80(http)服务页面,并且我使用WebSocket在后台与2.2.2.2通过8000端口。一切都很好。
现在我插入我的3G调制解调器阻塞端口8000.我的WebSocket通信到2.2.2.2失败。
我希望WebSocket通过端口80与2.2.2.2进行通信,但要让服务器将2.2.2.2:80上的请求转换为1.1.1.1:8000。
我发现这个:meteorserver点org /安装/(见第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引号,它仍然无法正常工作。
我完全难倒了。
你在正确的轨道上。 您不必指定“别名”input界面。 从iptables的angular度来看,input接口仍然是eth0,即使目标IP地址是2.2.2.2。 试试这个方法:
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 。
不匹配设备名称。 尝试仅基于IP进行匹配
sudo iptables -t nat -A PREROUTING --destination 2.2.2.2 -p tcp --dport 80 -j REDIRECT --to-port 8000
我会回答你的问题与其他问题:D
问:如何在防火墙中使用别名networking接口(如eth0:0)?
答:当前的Linux实现不允许在例如eth0或eth0:0之间进行区分。 iptables / netfilter规则。 您只能指定自动包含eth0:0的eth0(以及其他别名接口)。 但是,您可以使用别名接口的IP地址作为规则。
看一下这个:
Linux iptables:端口redirect示例
另一种方法:使用虚拟接口(macvlan)。
ip别名是一个更高层次的技巧,iptables只会看到一个接口(真正的接口)。 build议您可以避免使用直接IP范围的问题。
对于vlan接口,你不应该在netfilter / iptables中遇到任何问题,因为它们在内核级别上的行为与普通接口相似。 添加一个新的(你不需要指定mac):
ip link add link name_real_if address mac:virt:if name_virt_if type macvlan
这样你直接在osi2上工作,确实可以在桥接configuration中使用它们,使ip / ip分配独立于防火墙/ qos规则。
我花了一段时间才find这个解决scheme,Id总是使用ifconfig eth0:0,它的速度和有用性,但也许有时间迁移到iproute2。