作者zhucc (阿朱哥)
看板Linux
标题[问题] iptables 问题
时间Tue Oct 22 20:22:43 2013
目前架构是
PC3 ----- 小乌龟----switch-----PC1
Internet | 192.168.1.254 (拨接,NAT)
| eth0 ppp0
PC2
192.168.1.250(拨接)
eth0 ppp0
PC1 和 PC2 系统都是 centos
PC1 用 @ip.hinet.net 拨接、然後负责 NAT 和 DHCP
PC2 用 @hinet.net 拨接
现在 PC3 要透过 PC1 的 9999 port 的 IP 连进 PC2 的 port 3306
我在 PC1 设 iptables ,把 port 9999 都导到 PC2 的 port 3306 ,但是一直无法连线
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 9999 -j DNAT
--to-destination 192.168.1.250:3306
请问有那个地方该修改的吗?
个人思考应该是和 PC2 也有拨接的关系、但不知道该怎麽改
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.33.55.125
※ zhucc:转录至看板 Network 10/22 20:35
1F:→ paar:这是 PC2 default gateway 的问题 10/22 21:29
所以请问有解吗? 因为PC2有自行对外连线的需求,所以没办法关 pppoe 连线
2F:推 yvb:大概两种解法.[1]PC1转送PC2时做SNAT,但PC2无法得知真正来源. 10/22 22:05
3F:→ yvb:[2]PC2对特定port用policy route,但外面无法直接连PC2该port. 10/22 22:08
4F:推 rickieyang:policy route 应该没用, 只能 SNAT. 10/22 23:09
5F:→ rickieyang:PC2看到同内网连线就直接回, 但PC3不认帐, drop 掉... 10/22 23:10
6F:→ rickieyang:等等...... PC3 是内网吧?? @@ 10/22 23:11
PC3 是指外网,抱歉没说清楚
另外可以单就 PC1到PC2 转送时做 SNAT 吗?
指令该怎麽下,因为我对这边实在不是很熟悉
7F:→ rellik:-i ppp0 你的 interface 是 ppp0 吗? 能否贴个 ifconfig 10/22 23:59
8F:→ rellik:另外贴一下 iptables-save 10/23 00:03
9F:→ rellik:看到最底下PC2也拨接? 既然和PC1是同网段怎麽不是把default 10/23 00:06
10F:→ rellik:gateway 设定在 PC1 呢? 10/23 00:07
是 ppp0 没错
然後因为有跑某些程式,所以 dafault gateway 没办法设在 PC1
iptables-save
*nat
:PREROUTING ACCEPT [128:15380]
:POSTROUTING ACCEPT [3407:204420]
:OUTPUT ACCEPT [6799:406670]
-A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
*filter
:INPUT DROP [4625:1814415]
:FORWARD ACCEPT [3493355:2820439735]
:OUTPUT ACCEPT [4207862:890968157]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i ppp0 -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
COMMIT
ifconfig
eth0 Link encap:Ethernet HWaddr 00:E0:81:2D:06:0C
inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
ppp0 Link encap:Point-to-Point Protocol
inet addr:***.***.***.*** P-t-P:168.95.98.254 Mask:255.255.255.255
11F:推 rellik:所以 PC2 因为有跑拨接的关系,192.168.1 的网段也是 nat 来 10/23 01:30
12F:→ rellik:的吗? 还是说是另外接网卡在 switch 上? 10/23 01:31
13F:→ rellik:换个问法, PC1和 PC2 192.168.1的ip是可以互相ping有回应? 10/23 01:37
PC1 和 PC2 都有跑拨接
然後 192.168.1.0/24 是自订的网段,可以互相 ping 没问题
两台机器都只有一张网卡而已
14F:推 yvb:回四楼rick大, 看原po的iptables rule, 是从ppp0来的才DNAT, 10/23 13:16
15F:→ yvb:不是内网,所以 policy route 不会不 work. 10/23 13:16
16F:→ yvb:另外, 关於SNAT的部分, 在PC2只会看到是192.168.1.254连过来; 10/23 13:16
17F:→ yvb:作法最好搭配 mangle table 及 fwmark 来做: 10/23 13:16
18F:→ yvb:iptables -t mangle -A PREROUTING -i ppp0 -p tcp \ 10/23 13:17
19F:→ yvb: --dport 9999 -j MARK --set-mark 0x1/0x1 ; 10/23 13:17
20F:→ yvb:iptables -t nat -A PREROUTING -m mark --mark 0x1/0x1 \ 10/23 13:17
21F:→ yvb: -j DNAT --to-destination 192.168.1.250:3306 ; 10/23 13:17
22F:→ yvb:iptables -t nat -A POSTROUTING -d 192.168.1.250 \ 10/23 13:17
23F:→ yvb: -m mark --mark 0x1/0x1 -j MASQUERADE ; 10/23 13:17
24F:→ yvb:上面的 -j MASQUERADE 也可改为 10/23 13:18
25F:→ yvb: -j SNAT --to-source 192.168.1.254 10/23 13:18
26F:→ yvb:效果相同, 但用 -j MASQUERADE 较方便. 10/23 13:18
27F:→ yvb:当然, -d 192.168.1.250 在这情况下改用 -o eth0 也可以. 10/23 13:18
28F:→ yvb:若按上面的设定, 原 po 原来的那一笔 DNAT 就要拿掉. 10/23 13:21
29F:→ yvb:其实 -d 192.168.1.250 或 -o eth0 不写应该也 OK. 10/23 13:26
感谢 yvb 大的教学,上面指令做点小更动确定可以用
iptables -t mangle -A PREROUTING -i ppp0 -p tcp --dport 9999 \
-j MARK --set-mark 0x1/0x1
iptables -t nat -A PREROUTING -m mark --mark 0x1/0x1 -p tcp \
-j DNAT --to-destination 192.168.1.250:3306
iptables -t nat -A POSTROUTING -d 192.168.1.250 -m mark --mark 0x1/0x1 \
-j MASQUERADE
※ 编辑: zhucc 来自: 114.33.55.125 (10/23 14:17)
30F:推 yvb:一时不查. 有设定 port (像上述 DNAT) 时就要加上 protocol. 10/23 16:24