昨天,我发了一个问题
here,但我认为我的话并不清楚.顺便说一句,这个问题不重复.
我有AWS VPC设置如下.
目标/问题:从互联网SSH到服务器A.它不起作用.
服务器A在私有子网中,因此我想在我的NAT实例上启用iptables NATing,以便我可以直接从Internet上ssh到SErver A.
我在NAT实例上运行以下命令:
NAT# iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 10.0.1.243:22
在NAT实例上启用IP转发:
NAT# sysctl -p net.ipv4.ip_forward = 1
MASQUERADE在NAT实例上运行:
NAT# iptables -t nat -vnL POSTROUTING Chain POSTROUTING (policy ACCEPT 6 packets,312 bytes) pkts bytes target prot opt in out source destination 199 16466 MASQUERADE all -- * eth0 10.0.0.0/16 0.0.0.0/0
AWS安全组配置正常,允许此测试用例所需的各种访问.
故障排除:
我可以通过端口22从NAT远程登录到服务器A.所以Access很好.
当我在笔记本电脑上运行telnet 54.213.116.251 2222时,我在NAT上的tcpdump中看到以下条目:
NAT# tcpdump -n -i eth0 dst 10.0.1.243 and port 22 09:59:13.738316 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S],seq 1868541786,win 8192,options [mss 1460,nop,wscale 2,sackOK],length 0 09:59:16.737009 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S],length 0 09:59:22.775567 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S],length 0
所以这意味着iptables将数据包路由到10.0.1.243. (BTW,xxx.xxx.xxx.xxx是我笔记本电脑的公共IP地址)
但是当我在服务器A上运行tcpdump时,我看不到任何来自10.0.0.54的内容,这是NAT的内部/私有IP地址(我认为这是问题):
Server A# tcpdump -n src 10.0.0.54 tcpdump: verbose output suppressed,use -v or -vv for full protocol decode listening on eth0,link-type EN10MB (Ethernet),capture size 65535 bytes
但是如果我从NAT实例telnet到服务器A,我在服务器A上的tcpdump中看到了好东西(这意味着,我的整体PREROUTING规则没有按预期工作):
Server A# tcpdump -n src 10.0.0.54 05:01:47.500080 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [S],seq 2862522431,win 14600,sackOK,TS val 3013083 ecr 0,wscale 7],length 0 05:01:47.501601 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.],ack 760676524,win 115,options [nop,TS val 3013083 ecr 12074896],length 0 05:01:47.535720 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.],ack 22,TS val 3013092 ecr 12074928],length 0
结论:
从NAT上的tcpdump输出,似乎Iptables正在转发我的数据包.
从服务器A上的TCP转储,我有从NAT到服务器A的良好连接.
但在端到端,我无法从笔记本电脑连接到服务器A.
(顺便说一句,我知道SSH隧道和其他好东西.但我只想让Iptables来帮助我.)
解决方法
最后,我破解了!!!!
在NAT实例上,我不得不更改以下命令:
从:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j MASQUERADE
至:
iptables -t nat -A POSTROUTING -j MASQUERADE
它工作了!!!!
因此,我将很快在ServerFault上创建一个新问题,询问使用上述两个命令有哪些优缺点.