ネットワークトポロジー:
インターネット | | (eth0)IP:202.xxx.xxx.xxx/255.255.255.0 A :Remote_Server(Debian) (tun0)IP:10.10.1.1/255.255.255.0 | | (utun0)IP:10.10.1.2/255.255。 255.0 B:iOS_Device(iOS 9) デバイスA: a TCPサーバー、リスニング7777でクライアント(iOSデバイス)に接続します。 デバイスB: WIFIがインターネットに接続されたiOSデバイス。
ワークフロー:
- 「0.0.0.0:7777」をリッスンしているサーバー
- クライアントは「202.xxx.xxx.xxx:7777」に接続します(ユーザー名などを使用)
- サーバーは、クライアント認証のためにクライアントのユーザー名を確認します
- サーバーはクライアントにトンネル構成情報を送信します(例:10.10.1.2/24、dns:8.8.8.8)
- クライアントはサーバーに接続する新しいトンネルを配置します
- クライアントはトンネル経由でサーバーにネットワークパケット(DNSクエリ、HTTPS要求など)を送信します(サーバーの応答を待機します)
サーバー側のログ(クライアントがトンネル経由で接続した後):
$ Sudo ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.10.1.1 P-t-P:10.10.1.1 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
-----------------------------------------------------------
tun0 Link encap:UNSPEC HWaddr ...
...
RX packets:12 errors:0 dropped:12 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
...
RX bytes:742 (742.0 B) TX bytes:0 (0.0 B)
-----------------------------------------------------------
tun0 Link encap:UNSPEC HWaddr ...
...
RX packets:25 errors:0 dropped:25 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
...
RX bytes:1548 (1.5 KiB) TX bytes:0 (0.0 B)
-----------------------------------------------------------
RXバイト:0-> 742-> 1548バイト
今、問題は次のとおりです。
サーバー側で、トラフィックをtun0からeth0に転送する方法は?
誰か助けてもらえますか、pls
以下のコマンドを試しましたが、機能していないようです。
$Sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
$Sudo iptables -L -n -v
Chain INPUT (policy ACCEPT 13472 packets, 4929K bytes)
pkts bytes target prot opt in out source destination
207 13105 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tap+ * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 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 state RELATED,ESTABLISHED
0 0 ACCEPT all -- * * 10.30.0.0/24 0.0.0.0/0
288 18484 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tap+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 13436 packets, 5315K bytes)
pkts bytes target prot opt in out source destination
$
$Sudo iptables -A FORWARD --in-interface tun0 -j ACCEPT
$Sudo iptables --table nat -A POSTROUTING --out-interface eth0 -j MASQUERADE
$
その他のログ(サーバー側):
$ ip a show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope Host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope Host
valid_lft forever preferred_lft forever
2: dummy0@NONE: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
link/ether 8a:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether f2:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 202.xxx.xxx.xxx/24 brd 202.a.b.c scope global eth0
valid_lft forever preferred_lft forever
inet6 xxxx:xxxx::xxxx:xxxx:xxxx:xxxx/64 scope global
valid_lft forever preferred_lft forever
inet6 aaaa::bbbb:cccc:dddd:eeee/64 scope link
valid_lft forever preferred_lft forever
4: teql0: <NOARP> mtu 1500 qdisc noop state DOWN group default qlen 100
link/void
5: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default
link/ipip 0.0.0.0 brd 0.0.0.0
6: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default
link/gre 0.0.0.0 brd 0.0.0.0
7: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
8: ip_vti0@NONE: <NOARP> mtu 1428 qdisc noop state DOWN group default
link/ipip 0.0.0.0 brd 0.0.0.0
9: ip6_vti0@NONE: <NOARP> mtu 1500 qdisc noop state DOWN group default
link/tunnel6 :: brd ::
10: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default
link/sit 0.0.0.0 brd 0.0.0.0
11: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default
link/tunnel6 :: brd ::
12: ip6gre0@NONE: <NOARP> mtu 1448 qdisc noop state DOWN group default
link/gre6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
175: tun0@NONE: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
link/none
inet 10.10.1.1/24 scope global tun0
valid_lft forever preferred_lft forever
$ ip ro show
default via 202.xxx.xxx.1 dev eth0
10.10.1.0/24 dev tun0 proto kernel scope link src 10.10.1.1
202.xxx.xxx.0/24 dev eth0 proto kernel scope link src 202.xxx.xxx.xxx
$ ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
$ Sudo iptables -L -vn
Chain INPUT (policy ACCEPT 1291 packets, 198K bytes)
pkts bytes target prot opt in out source destination
87 5541 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tap+ * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 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 state RELATED,ESTABLISHED
0 0 ACCEPT all -- * * 10.30.0.0/24 0.0.0.0/0
168 10829 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tap+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 1230 packets, 300K bytes)
pkts bytes target prot opt in out source destination
$ Sudo iptables -L -vn
Chain INPUT (policy ACCEPT 1312 packets, 201K bytes)
pkts bytes target prot opt in out source destination
87 5541 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tap+ * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 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 state RELATED,ESTABLISHED
0 0 ACCEPT all -- * * 10.30.0.0/24 0.0.0.0/0
169 10900 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tap+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 1258 packets, 311K bytes)
pkts bytes target prot opt in out source destination
$ Sudo iptables -t nat -L -vn
Chain PREROUTING (policy ACCEPT 111 packets, 6908 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 68 packets, 4153 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 38 packets, 3678 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth0 10.30.0.0/24 0.0.0.0/0
138K 9623K MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
$ Sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default xxxxxx.xxxx 0.0.0.0 UG 0 0 0 eth0
10.10.1.0 * 255.255.255.0 U 0 0 0 tun0
202.xxx.xxx.0 * 255.255.255.0 U 0 0 0 eth0
$ cat /proc/sys/net/ipv4/ip_forward
1
トンネルを介したネットワークパケット(tun0、サーバー側):
No. Time Source Destination Protocol Length Info
3 4.603031 10.10.1.2 google-public-dns-a.google.com DNS 59 Standard query 0xc09d A Apple.com
4 4.708703 10.10.1.2 google-public-dns-a.google.com DNS 67 Standard query 0x6f6d A guzzoni.Apple.com
...
21 95.530358 10.10.1.2 10.10.1.1 DNS 75 Standard query 0x850b A 20-courier.Push.Apple.com
22 104.468535 10.10.1.2 10.10.1.1 DNS 75 Standard query 0x850b A 20-courier.Push.Apple.com
そしてフレームNo.3の詳細:
Frame 3: 59 bytes on wire (472 bits), 59 bytes captured (472 bits) on interface 0
Interface id: 0 (utun0)
Encapsulation type: NULL/Loopback (15)
Arrival Time: Jan 3, 2016 23:40:31.564933000 HKT
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1451835631.564933000 seconds
[Time delta from previous captured frame: 0.614315000 seconds]
[Time delta from previous displayed frame: 0.614315000 seconds]
[Time since reference or first frame: 4.603031000 seconds]
Frame Number: 3
Frame Length: 59 bytes (472 bits)
Capture Length: 59 bytes (472 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: null:ip:udp:dns]
[Coloring Rule Name: UDP]
[Coloring Rule String: udp]
Null/Loopback
Family: IP (2)
Internet Protocol Version 4, Src: 10.10.1.2 (10.10.1.2), Dst: google-public-dns-a.google.com (8.8.8.8)
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 55
Identification: 0x16e2 (5858)
Flags: 0x00
0... .... = Reserved bit: Not set
.0.. .... = Don't fragment: Not set
..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 255
Protocol: UDP (17)
Header checksum: 0x89b8 [validation disabled]
[Good: False]
[Bad: False]
Source: 10.10.1.2 (10.10.1.2)
Destination: google-public-dns-a.google.com (8.8.8.8)
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]
User Datagram Protocol, Src Port: 59951 (59951), Dst Port: domain (53)
Source Port: 59951 (59951)
Destination Port: domain (53)
Length: 35
Checksum: 0xe181 [validation disabled]
[Good Checksum: False]
[Bad Checksum: False]
[Stream index: 0]
Domain Name System (query)
Transaction ID: 0xc09d
Flags: 0x0100 Standard query
0... .... .... .... = Response: Message is a query
.000 0... .... .... = Opcode: Standard query (0)
.... ..0. .... .... = Truncated: Message is not truncated
.... ...1 .... .... = Recursion desired: Do query recursively
.... .... .0.. .... = Z: reserved (0)
.... .... ...0 .... = Non-authenticated data: Unacceptable
Questions: 1
Answer RRs: 0
Authority RRs: 0
Additional RRs: 0
Queries
Apple.com: type A, class IN
Name: Apple.com
[Name Length: 9]
[Label Count: 2]
Type: A (Host Address) (1)
Class: IN (0x0001)
2016-01-04編集1:
コマンド「iptables-FFORWARD」を実行した後:
$ Sudo ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.10.1.1 P-t-P:10.10.1.1 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:250 errors:0 dropped:250 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:15845 (15.4 KiB) TX bytes:0 (0.0 B)
RXパケット:250エラー:0ドロップ:250
$ Sudo iptables -L -vn
Chain INPUT (policy ACCEPT 207 packets, 22574 bytes)
pkts bytes target prot opt in out source destination
258 16411 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tap+ * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 8 packets, 1632 bytes)
pkts bytes target prot opt in out source destination
8 578 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
$ Sudo iptables -L -vn -t nat
Chain PREROUTING (policy ACCEPT 18 packets, 1056 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 16 packets, 914 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2 packets, 128 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth0 10.30.0.0/24 0.0.0.0/0
138K 9687K MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
2016-01-04編集2:
私が行ったクライアントテストステップ:
テスト結果:
クライアントはHTTPリクエストを送信し、リクエストのタイムアウトを取得しました(レスポンスのタイムアウトを待機しています)。
tcpdumpログ:
$ Sudo tcpdump -i tun0 -s 0 -B 524288 -w ~/tmp/tun0_traffic.pcap
tcpdump: listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
^C
98 packets received by filter
0 packets dropped by kernel
58 packets dropped by interface
-----------------------------------------------------------
$ tcpdump -s 0 -n -e -x -vvv -r ~/tmp/tun0_traffic.pcap
reading from file /home/tube/tmp/tun0_traffic.pcap, link-type RAW (Raw IP)
01:40:03.445148 ip: (tos 0x0, ttl 255, id 2395, offset 0, flags [none], proto UDP (17), length 76)
10.10.1.2.65368 > 8.8.8.8.53: [udp sum ok] 52854+ A? p02-keyvalueservice.icloud.com. (48)
0x0000: 4500 004c ...
01:40:07.461931 ip: (tos 0xc0, ttl 64, id 34376, offset 0, flags [none], proto ICMP (1), length 104)
10.10.1.1 > 10.10.1.2: ICMP 10.10.1.1 udp port 53 unreachable, length 84
(tos 0x0, ttl 255, id 36211, offset 0, flags [none], proto UDP (17), length 76)
10.10.1.2.65368 > 10.10.1.1.53: [udp sum ok] 52854+ A? p02-keyvalueservice.icloud.com. (48)
0x0000: 45c0 0068 ...
$ Sudo tcpdump -i eth0 -s 0 -B 524288 -n src net 10.10.1.0/24 -w ~/tmp/eth0_traffic_from_tun0.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
1 packet received by filter
0 packets dropped by kernel
-----------------------------------------------------------
$ tcpdump -s 0 -n -e -x -vvv -r ~/tmp/eth0_traffic_from_tun0.pcap
reading from file /home/tube/tmp/eth0_traffic_from_tun0.pcap, link-type EN10MB (Ethernet)
$
2016-01-04編集3:
新しいtcpdumpログ:(@MadHatterに感謝します)
Sudo tcpdump -i eth0 -s 0 -B 524288 -n -w ~/tmp/eth0_traffic_all.pcap
And read the ~/tmp/eth0_traffic_all.pcap file:
No. Time Source Destination Protocol Length Info
51 3.268219 202.xxx.xxx.xxx 8.8.8.8 DNS 69 Standard query 0x4d19 A Apple.com
57 3.270244 8.8.8.8 202.xxx.xxx.xxx DNS 117 Standard query response 0x4d19 A Apple.com A ...
(eth0への)tun0転送からのパケットはうまく機能します!そしてeth0は8.8.8.8から応答を得ました
まず、FORWARD
チェーンが問題を引き起こしています。その中の3番目のルールは、最初の2つのルールを満たさないallFORWARDトラフィックをブロックし、最初の3つのルールのパケット数から判断すると、最初の2つはそうではありません。 t何かに一致します。これは、ルール3がすべてを停止することを意味します。
必要なトラフィックを許可するルールを記述しましたが、ルールが来た後後ルール3になるため、トラフィックは到達しません(最初の否定的な一致が勝利します)。 FORWARD
チェーンからすべてのルールをクリアし、ACCEPT
ポリシーを有効にすると、トラフィックが流れます。
次に、非常に限定的なtcpdump
の呪文を使用してトラフィックを調べています。具体的には、送信元アドレスが10.10.1.0/24
after FORWARDing-のトラフィックを探していますが、NATルールがこのトラフィックをマスカレードしているため、tcpdump
はそれをキャッチしていません。 tcpdump
呼び出しを開くと、現在転送されているトラフィックが表示されます。