linux,生成虚拟网卡,指定此虚拟网卡的数据流走向,如何做?

2015-12-16 18:32:31 +08:00
 yalltd

ubuntu 系的 OS ,跑几个虚拟机,每个虚拟机需要不同的代理,加上客户机的操作系统有些是偏门 linux 和过时的 XP ,调试不同的代理很麻烦,我想这样:

[1] 在主机上生成几个虚拟网卡

[2] 每个虚拟网卡分别设定不同的走向,比如
vnet0 走 127.0.0.1:10000 ,
vnet1 走 127.0.0.1:20000,
vnet2 走 192.168.1.111:1080,
vnet3 走 172.16.66.123:1024 ……

[3] 每台虚拟机的网络设定为“桥接”到特定的虚拟网卡,实现该虚拟 OS 全系统走指定代理

那么问题来了: linux 系统上生成虚拟网卡用什么程序来实现比较好?然后指定每个虚拟网卡的走向又要用什么程序来实现?(本人小白啊)

谢谢各位大侠

14823 次点击
所在节点    Linux
35 条回复
yalltd
2015-12-18 03:29:39 +08:00
@billlee 在 host 上安装 redsocks 然后配置 iptables REDIRECT ?
msg7086
2015-12-18 04:01:47 +08:00
#18 @yalltd 因为这东西本来就很边缘啊。
一个网卡流过一个 socks ,其实就是开着 socks 跑 openvpn 代理嘛。
加虚拟网卡就是加 tun/tap 设备(然而这又是更复杂的课题了)。

#17 加 IP 倒是简单,自己看看 ip a 命令吧。
加网卡可以试试 ip l 命令。
datocp
2015-12-18 10:40:22 +08:00
基础太差。。。很多东西理解起来也困难。

原先就是看了这篇文档以为很简单,结果还是有很多特定环境的限制,包括 ipv4+ipv6 环境,服务器不支持 ip6tables -t nat ,需要禁用 AAAA 查询,还包括 iproute2 的一些无底坑,这些坑在官方文档中都没有任何提及。
OpenWrt VPN 按域名路由
https://blog.sorz.org/p/openwrt-outwall/

redsocks2 原先在 openwrt 下面配置成功过,可是 vps 。。。反正在透明代理这块基本上网上能找到的实例,命令打一遍最终没效果,也不知道坑在哪里。。。

所以最终用 softether vpn ,这东东无比的强大,它本身就有虚拟网卡实现,最终基本甚至没用到任何的虚拟 L3 路由功能。目前实现的效果就是 就近访问日本 vps , vps 中一部分 youtube 流量中转的是美国 vps 上的流量,所以跟你想要实现的效果差不多。自己多试几遍吧,回头看看还是挺简单的,但是可扩展效果比透明代理好多了。实例虽然是用 dnsmasq ipset 特定域名,其实可以实现建立 ipset -N outwall4 nethash ,然后直接写路由表。

vpn 采用 softether vpn server
服务器端
创建虚拟 HUB server/管理虚拟 HUB/并添加用于客户端连接用的 管理用户
本地网桥设置 /将虚拟 HUB server 选择创建的类型 新 tap 设备的桥接,并输入设备名称 soft1
ifconfig tap_soft1 192.168.60.100
ifconfig tap_soft1 mtu 1392
添加 ipv6 地址,只是为了以后不需要改动服务器配置所以固定一个地址
ip address add fe80::4ac:20ff:fe9c:1000/128 dev tap_soft1
#ip address del fe80::4ac:20ff:fe9c:1000/128 dev tap_soft1

客户端
创建虚拟 HUB client/管理虚拟 HUB/管理级联连接 创建到服务器端的连接
本地网桥设置 /将虚拟 HUB client 选择创建的类型 新 tap 设备的桥接,并输入设备名称 soft1
ifconfig tap_soft1 192.168.60.200
ifconfig tap_soft1 mtu 1392
#ip address add fe80::4ac:20ff:fe9c:2000/128 dev tap_soft1
#ip address del fe80::4ac:20ff:fe9c:2000/128 dev tap_soft1

如果能互相 ping 通 vpn 连接已经没有任何问题。
ping 192.168.60.100
ping6 -I tap_soft1 fe80::4ac:20ff:fe9c:1000


* 2015 年 12 月 14 日星期一
- [bash] iptables iproute2 and multiple routes
http://aftermanict.blogspot.it/2015/11/bash-iptables-iproute2-and-multiple.html
- 今天按这篇文档一路设置下来第一次用 fwmark 成功设置路由,由于服务器并没有 ip6table_nat 模块,所以仅能使用 iptable_nat
- 另外似乎设置的 set-mark 3 和原先的 QOS 标记有冲突,只有在 iptables -t mangle -F 清空原先的标记时才有效果,应该是能解决的
- 这次设置最成功的地方在于不会有 vpn 客户端拔号时出现因为接口的问题而无法访问网络
- 另外第一次注意到 iptabes 的全局 ACCEPT 并不是万能的,像此例必须指定特定接口的 MASQUERADE 才可以成功。
/etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done

iptables -I OUTPUT -o eth0 -p udp --dport 53 -m string --hex-string "|07|youtube|03|com|00001c|" --algo bm -j DROP

dnsmasq.conf
ipset=/youtube.com/outwall4,outwall6

iptables-restore /da/fw
ipset destroy outwall6
ipset -N outwall6 iphash family inet6
ipset destroy outwall4
ipset -N outwall4 iphash

##echo "200 outwall" >> /etc/iproute2/rt_tables
ipset -L outwall4 >/tmp/outwall4.tmp
for i in `sed -n "7,$ p" /tmp/outwall4.tmp`;do echo $i;ipset -D outwall4 $i;done
kill -HUP $(pidof dnsmasq)
nslookup www.youtube.com
nslookup m.youtube.com
nslookup youtube.com
#ipset 需要 dnsmasq 通过本地像 192.168.40.253:53 进行查询,直接外部 dns 服务器会没结果
ipset -L outwall4
iptables -t mangle -D PREROUTING -m mark --mark 0x0/0xff00 -m set --match-set outwall4 dst -j MARK --set-xmark 0xfe00/0xff00
iptables -t mangle -D OUTPUT -m mark --mark 0x0/0xff00 -m set --match-set outwall4 dst -j MARK --set-xmark 0xfe00/0xff00
iptables -t mangle -I PREROUTING 2 -m mark --mark 0x0/0xff00 -m set --match-set outwall4 dst -j MARK --set-xmark 0xfe00/0xff00
iptables -t mangle -I OUTPUT -m mark --mark 0x0/0xff00 -m set --match-set outwall4 dst -j MARK --set-xmark 0xfe00/0xff00
##ip route add 192.168.40.0/24 via 192.168.30.254 dev tap_soft
ip route flush table outwall
ip route add default via 192.168.30.254 dev tap_soft table outwall
#ip route add 192.168.40.0/24 via 192.168.30.254 dev tap_soft table outwall
ip rule del table outwall
ip rule add fwmark 0xfe00/0xff00 table outwall prio 1
#ip rule add from 192.168.50.0/24 table outwall prio 1
ip route flush cache

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o vpns+ -j MASQUERADE
iptables -t nat -A POSTROUTING -o tap_soft -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


- 调整了原先的 qos 标记为 0x00/0xff ,路由标记为 0xfe00/0xff00,如果标记为 0xff00/0xff00 则变为 or 标记。注意使用 iptables -I 将规则放在最前面。有关 iptables xmark 的描述看不懂,有人说可以把不同的 mask 看成是 subnet 。
- qos-scripts currently uses the last 8 bits to mark traffic e.g.-j MARK --set-xmark 0x44/0xff
whereas multi-wan uses the next 8 bits (0xff00) to mask its marks:


yalltd
2015-12-18 12:10:27 +08:00
@datocp 看不懂……泪崩……
yalltd
2015-12-18 12:28:35 +08:00
@msg7086 您说到点子上了!~

通过 socks 连 openvpn 好办,但是通过 socks 连 softether vpn 真不好办!一次都没成功过!所以想设计这样一个情况:虚拟机里的 softether vpn 去连服务器的时候是已经走在 socks 里面的了,虚拟机套虚拟机说不定可以,但是这样的效率肯定惨不忍睹……
datocp
2015-12-18 12:57:08 +08:00
先把这两篇基础的搞定,对 softether 就有个大概的了解。不懂为什么 softether 外面又有一层 socks 连接。如果用 vpn ,你原先的环境就要变化,按现在的设想是有个网关设备,统一将不同的代理服务器连接到本地虚拟机操作系统里的虚拟接口 soft soft1 soft2 soft3 ,然后用策略路由#ip rule add from 192.168.50.0/24 table outwall prio 1 或者干脆把相应的接口直接安装到特定的虚拟机里,原则上 xp 也是没问题的,太古董了没操作过。。。 linux ip route 策略路由不怎么熟悉,大体是这样。 softether 我已经好久没在国内网络用过了,担心穿墙时是否会被挡。

Softether on VPS Using Local Bridge
http://blog.lincoln.hk/blog/2013/05/17/softether-on-vps-using-local-bridge/
Build a LAN-to-LAN VPN (Using L3 IP Routing)
https://www.softether.org/4-docs/1-manual/A._Examples_of_Building_VPN_Networks/10.6_Build_a_LAN-to-LAN_VPN_(Using_L3_IP_Routing)
yalltd
2015-12-18 13:45:45 +08:00
@datocp softether 和 openvpn 都是被 GFW 盯的死死的啊,不套一层加密的 socks 不可能连接成功啊

openvpn 本身就可以设置 socks 代理或者 http 代理,大部分时候设置对了就可以成功连接,但是 softether 就讨厌了,他程序里虽然也有设置代理的地方,但是我从来没有成功过,即使设置了代理,连接某个服务器的时候是不是走代理都完全不是我能控制的,所以我才想到把要连接的那台虚拟机的网卡整个走代理以确定 softether 走上代理了……
raysonx
2015-12-18 14:33:44 +08:00
@yalltd
我又來了。。。
樓主我覺得你真心沒有必要去折騰什麼透明代理,這些本來就不是什麼好的組網方案。
如果是為了科學上網的話,建議在母機上配置 VPN ,然後用路由規則指定虛擬機網絡的路由。
yalltd
2015-12-18 16:23:43 +08:00
@raysonx “用路由規則指定虛擬機網絡的路由”---完全不懂怎么搞路由……
raysonx
2015-12-18 18:21:00 +08:00
@yalltd 路由其實是很簡單的東西,一條最簡單的路由就是「地址段,下一跳路由器的 IP ,連著哪張網卡」,而且這些「正統」的方法要比透明代理等「非主流」的方法容易得多。
用代理組網的問題是,通過代理服務器後,虛擬機的原始地址被隱藏了,破壞了端到端的透明性,更不用說你的代理可能只支持 TCP 協議了。破壞這種透明性後,舉個例子,如果你要在虛擬機裡面運行一個 HTTP 服務器,想對外開放 80 端口,就需要搞端口穿透,這會異常的麻煩。當然我扯的成分比較多,樓主應該用不到這些。
msg7086
2015-12-22 04:40:53 +08:00
很不巧的是,时隔 3 天后我也遇到了同样的需求。
回头如果我们实作出办法以后会再来回报。
yalltd
2015-12-25 00:29:16 +08:00
@raysonx 唉,我不需要什么端到端的透明性,我只需要实现虚拟系统全部走上代理...不透明更好...
用路由命令可以实现指定某个虚拟网卡走本地的某个端口吗?
yalltd
2015-12-25 00:29:50 +08:00
@msg7086 静侯佳音
msg7086
2016-01-25 05:50:20 +08:00
我们现在的功能需求是,需要从客户端直接访问服务器上监听的某个任意 IP 的任意端口。
现在是客户端和服务器用 OpenVPN 互联,然后把某个私有段路由到 OVPN 的对端,然后在用 iptables 做转发规则,转发到私有段上。

感觉和你 32 楼的要求还是有点不同。
但是你这实在不行的话可以试试 OpenVPN through Socks Proxy 的做法,让 OVPN 走 Socks 代理。
yalltd
2016-01-25 08:18:12 +08:00
@msg7086 恩,现在我主要就是用的 OpenVPN through Socks Proxy 的做法。很奇怪,最早我都是用的 VMWare ,基本上 OpenVPN through Socks Proxy 很难连接成功,同一时刻同一个 OVPN 的配置文件和同一个 socks 代理, xp 的虚拟机下面可以连接成功,但是 win7 以上以及 linux 系统全部不成功,基本上都是 tls 错误……某天我突然想试试 Vbox ,没想到 Vbox 竟然这么听话好用不折腾,只要去连接基本上都是成功的……现在电脑的 VMWare 就等着被删了~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243996

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX