系统需要执行一般流量控制以及将数据转发到位于LAN后面的特定服务器.目前的设置是 –
> eth0 – 外部
> eth1 – 内部
> eth2 – 内部
> eth3 – 内部
eth0通过DHCP获取IP.
eth1,eth2和eth3构成桥(br0)的一部分,其静态地址为10.0.1.1.
10.0.1.2上有一台服务器,需要为HTTP和MySQL流量提供服务.无法保证将此服务器插入的位置(eth1 / 2/3),但IP是静态的.
我试图设置iptables规则,这似乎很容易只用一个eth设备,但是当需要转发时我会被打结.
这是我到目前为止所尝试的:
# clear and flush everything iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -t raw -F iptables -t raw -X iptables -t security -F iptables -t security -X # DROP packets unless covered by rules iptables -P FORWARD DROP iptables -P INPUT DROP # No intention of filtering any outgoing traffic iptables -P OUTPUT ACCEPT # Handle our routing iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.1.2:80 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3306 -j DNAT --to 10.0.1.2:3306 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # Input Chain iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # ssh iptables -A INPUT -s 10.0.1.2 -p tcp --dport 3306 -j ACCEPT # ssh # Forward Chain iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 10.0.1.2 -j ACCEPT iptables -A FORWARD -i eth0 -p tcp --dport 3306 -d 10.0.1.2 -j ACCEPT # enable ipv4 forwardning for the system echo 1 > /proc/sys/net/ipv4/ip_forward
这给了我最终的链/规则设置 –
Chain INPUT (policy DROP 1 packets,49948 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 1 52 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 10.0.1.2 0.0.0.0/0 tcp dpt:3306 Chain FORWARD (policy DROP 0 packets,0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 10.0.1.2 tcp dpt:80 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 10.0.1.2 tcp dpt:3306 Chain OUTPUT (policy ACCEPT 1 packets,196 bytes) pkts bytes target prot opt in out source destination
但是,我无法通过外部接口(防火墙外部)连接的客户端登录我的内部MysqL服务器.
我已经读过数据包只能通过每一个链(INPUT / FORWARD / OUTPUT),但这仍然是这种情况吗?是我的FORWARD数据包,然后在另一个接口上再次作为INPUT处理?
在上面的任何配置中有什么突出的错误吗?
配置细节 –
netstat -rn的输出
从我可以连接的客户端…
Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 10.0.0.139 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br0
Telnet按预期连接.
来自我无法连接的客户……
Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 10.0.0.139 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan0
Telnet只显示Trying 10.0.0.17 …并且实际上从未成功…
网络描述 – s
10.0.0.0是通用办公网络,防火墙框上的eth0接口连接在这里.它的IP地址目前是10.0.0.17 …
10.0.1.0是防火墙eth1 / 2/3后面的网络.
我想通过使用给予eth0(10.0.0.17)的IP地址来访问防火墙后面的服务器.
解决方法
工作的客户端在10.0.1.0/24网络上具有一些物理存在,因此是其路由:
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
客户端不仅没有到10.0.1.0/24的路由,而且有更通用的路由到10.0.0.0/16从其无线网卡发送流量.
现在你还没有告诉我们网络的几何形状,这一切都在发生;从重叠空间的/ 24和/ 16网络掩模之间的混淆,我猜它有点混乱(这不是一个保证;有合理的理由这样做,但他们通常超过愚蠢的人数).此外,您的网络细节只对您有意义.
但结果是任何想要获得10.0.1.2的客户首先必须知道如何到达10.0.1.0/24,而且它必须是一个正确的想法.
以符合网络几何的方式修复客户端上的路由表,一切都应该改进.