设置 IPTables

jua*_*sta 4 linux iptables port-forwarding

我正在尝试从我们的产品中删除路由器并使用 iptables 替换其所有功能。

该系统需要执行一般流量控制以及将数据转发到位于 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
Run Code Online (Sandbox Code Playgroud)

这给了我结果链/规则设置 -

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   
Run Code Online (Sandbox Code Playgroud)

但是,我无法通过通过外部接口(防火墙外部)连接的客户端登录到我的内部 MySQL 服务器。

我已经读到数据包只通过每个 ONE 链(输入/转发/输出),但这里仍然是这种情况吗?是我的 FORWARD 数据包,然后在单独的接口上作为 INPUT 再次处理吗?

在上述任何配置中是否有任何明显错误的地方?

配置详情——

输出 netstat -rn

从客户端,我CAN从连接...

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
Run Code Online (Sandbox Code Playgroud)

Telnet 按预期连接。

从客户端,我CAN NOT从连接...

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
Run Code Online (Sandbox Code Playgroud)

Telnet 只是显示Trying 10.0.0.17...并且从未真正成功...

网络描述 -

10.0.0.0是一般办公网络,防火墙盒上的eth0接口连接这里。它的 IP 地址目前是 10.0.0.17...

10.0.1.0 是位于防火墙 eth1/2/3 后面的网络。

我想使用提供给 eth0 (10.0.0.17) 的 IP 地址访问防火墙后面的服务器。

Mad*_*ter 5

由于您列出了可以连接的客户端,因此您的iptables设置没有任何问题。然而,这并不是故事的全部:客户端必须有到达服务器转发地址的路由,服务器必须有返回的路由,以便数据包到达转发地址。

工作的客户端在 10.0.1.0/24 网络上有一些物理存在,因此有一条到那里的路由:

10.0.1.0        0.0.0.0         255.255.255.0   U         0 0          0 br0
Run Code Online (Sandbox Code Playgroud)

客户端不仅没有到 10.0.1.0/24 的路由,而且有一个到 10.0.0.0/16 的更通用的路由,将流量发送到其无线卡。

现在你还没有告诉我们发生这一切的网络的几何结构;从重叠空间的 /24 和 /16 网络掩码之间的混乱来看,我猜这一切都有些混乱(这不是保证;这样做是有正当理由的,但是他们通常被愚蠢的人打败)。此外,您网络的详细信息只对您感兴趣。

但结果是,任何想要到达 10.0.1.0/24 的客户端都10.0.1.2必须首先了解如何到达 10.0.1.0/24,而且它必须是一个正确的想法。

以与您的网络几何结构一致的方式修复客户端上的路由表,一切都会有所改善。