1.1.1 iptables原理
1.1.2 以本地为源的包路径
Step | Table | Chain | Comment |
1 |
|
| 本地程序(比如,服务程序或客户程序) |
2 |
|
| 路由判断,要使用源地址,外出接口,还有其他一些信息。 |
3 | mangle | OUTPUT | 在这儿可以mangle包。建议不要在这儿做过滤,可能有副作用哦。 |
4 | nat | OUTPUT | 这个链对从防火墙本身发出的包进行DNAT操作。 |
5 | filter | OUTPUT | 对本地发出的包过滤。 |
6 | mangle | POSTROUTING | 这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。 |
7 | nat | POSTROUTING | 在这里做SNAT。但不要在这里做过滤,因为有副作用,而且有些包是会溜过去的,即使你用了DROP策略。 |
8 |
|
| 离开接口(比如: eth0) |
9 |
|
| 在线路上传输(比如,Internet) |
1.1.3 规则添加
从上面可以看出只需要在OUTPUT链增加如下的类似规则即可实现将特定ip + port的tcp连接劫持到本地某个端口即可
目的ip: 200.200.30.228 端口443
本地ip: 200.200.30.122, 端口28888
iptables -t nat -A OUTPUT -p tcp -d 200.200.30.228 -j DNAT --dport 443 --to-destination 200.200.30.122:28888
测试OK
1.1.4 相关处理
(1) 依赖于iptables工具
(2) 应用层如何获取对应关系?
其实这个时候可以通过netstat命令发现如下奇怪的现象:
同时和200.200.30.228的443端口和本地28888端口建立了连接,
所以这里也可以获取到原来要连接的资源和端口
SO_ORIGINAL_DST是一个socket参数(SOL_IP层的)。
调用方式如下:
getsockopt (clifd, SOL_IP, SO_ORIGINAL_DST, &orig_addr, &sin_size);
clifd是hijack到的客户socket,orig_addr是sockaddr_in结构的参数,sin_size=sizeof(sockaddr_in).
返回0如果成功,-1失败。
如果成功orig_addr将是客户真正需要去的方向