2015-10-26 15 views
11

Kendimi kum havuzlu, değişmez bir geliştirici ortamı oluşturmak için internet erişimi gerektiren bir programı çalıştırmak için bir chroot oluşturmaya çalışıyorum. Şimdiye kadar hapishanem iyi çalışıyor: İçindeki bashı çalıştırabilir ve oradan da basit programlar yapabilirim! DNS çözümleme ancak çalışmıyor:El Capitan'da bir Mac OS X chroot'un içinde çalışmak için DNS çözünürlüğünü nasıl alabilirim?

bash-3.2$ curl google.ca 
curl: (6) Could not resolve host: google.ca 

Ben iç süreç hapse dışında çalışan mDNSResponder cini bağlanamıyor çünkü bu neredeyse eminim. orada değil hapishane içerisinde,

host ➜ ls -lA /var/run/mDNSResponder 
srw-rw-rw- 1 root daemon 0 22 Oct 10:41 /var/run/mDNSResponder 

Ama: Hapiste dışında orada tüm sistemin kullanımı için bir mDNSResponder yuvadır. Bu yüzden, hapishanenin içinden dışarıdan bir unix soket "proxy" oluşturmak için socat'u kullanmayı denedim: Hapisimin içinde bir soket oluşturmak için socat (aşağıdaki komut) çalıştırıyorum ve daha sonra hapishanenin içinde tekrar kıvrıldım, ama yine de kıvrım aynı hata mesajını verir. Ben SIGUSR1 ile mDNSResponder ait ayrıntılı günlük açtıktan sonra syslog görüyoruz:

2015-10-26 5:32:30.835 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0 
2015-10-26 5:32:30.835 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23271](socat) 
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: read_msg: ERROR failed to get errsd via SCM_RIGHTS 
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23271](socat) 
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: Removing FD 
2015-10-26 5:32:31.339 PM curl[23269]: dnssd_clientstub read_all(5) failed 0/4 0 
2015-10-26 5:32:31.339 PM curl[23269]: dnssd_clientstub write_all(4) failed -1/28 32 Broken pipe 
2015-10-26 5:32:31.341 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0 
2015-10-26 5:32:31.341 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23272](socat) 
2015-10-26 5:32:31.342 PM mDNSResponder[95]: 12: read_msg: ERROR failed to get errsd via SCM_RIGHTS 
2015-10-26 5:32:31.342 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23272](socat) 
2015-10-26 5:32:31.342 PM mDNSResponder[95]: 12: Removing FD 
2015-10-26 5:32:31.844 PM curl[23269]: dnssd_clientstub read_all(5) failed 0/4 0 
2015-10-26 5:32:31.846 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0 
2015-10-26 5:32:31.846 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23274](socat) 
2015-10-26 5:32:31.847 PM mDNSResponder[95]: 12: read_msg: ERROR failed to get errsd via SCM_RIGHTS 
2015-10-26 5:32:31.847 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23274](socat) 
2015-10-26 5:32:31.847 PM mDNSResponder[95]: 12: Removing FD 
2015-10-26 5:32:32.349 PM curl[23269]: dnssd_clientstub read_all(5) failed 0/4 0 
2015-10-26 5:32:32.350 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0 
2015-10-26 5:32:32.351 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23275](socat) 
2015-10-26 5:32:33.361 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23275](socat) 
2015-10-26 5:32:33.361 PM mDNSResponder[95]: 12: Removing FD 

adı çözümlemek için üç kez çalışıyor dnssd_clientstub aracılığıyla curl gibi bana bakıyor. İşte hapisteki süreç bağlanmaya çalışırken socat günlüğü: Ben fark

2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 501 
2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23190](curl) 
2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: Result code socket 27 created 00000000 00000001 
2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(15000, 0, google.ca., Addr) START PID[23190]() 
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: Result code socket 27 closed 00000000 00000001 (0) 
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) ADD 4 google.ca. Addr 74.216.233.251 
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) ADD 4 google.ca. Addr 74.216.233.249 
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) ADD 4 google.ca. Addr 74.216.233.227 
*snip* 
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: Result code socket 27 created 00000000 00000002 
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(15000, 0, google.ca., AAAA) START PID[23190]() 
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: Result code socket 27 closed 00000000 00000002 (0) 
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., AAAA) ADD 16 google.ca. AAAA 2607:F8B0:400B:080A:0000:0000:0000:100F 
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: Cancel 00000000 00000001 
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) STOP PID[23190]() 
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: Cancel 00000000 00000002 
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., AAAA) STOP PID[23190]() 
2015-10-26 5:31:56.587 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23190](curl) 
2015-10-26 5:31:56.587 PM mDNSResponder[95]: 12: Removing FD 

büyük farklılıklar: Karşılaştırma için

host ~/C/jail (master*) ➜ 
sudo socat -v -d -d UNIX-LISTEN:/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder,mode=666,fork,user=root,group=daemon UNIX-CLIENT:/private/var/run/mDNSResponder 
Password: 
2015/10/26 18:16:03 socat[24334] N listening on LEN=67 AF=1 "/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder" 
2015/10/26 18:16:07 socat[24334] N accepting connection from LEN=16 AF=1 "" on LEN=67 AF=1 "/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder" 
2015/10/26 18:16:07 socat[24334] N forked off child process 24341 
2015/10/26 18:16:07 socat[24334] N listening on LEN=67 AF=1 "/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder" 
2015/10/26 18:16:07 socat[24341] N opening connection to LEN=32 AF=1 "/private/var/run/mDNSResponder" 
2015/10/26 18:16:07 socat[24341] N successfully connected from local address LEN=16 AF=1 "" 
2015/10/26 18:16:07 socat[24341] N starting data transfer loop with FDs [6,6] and [5,5] 
> 2015/10/26 18:16:07.081847 length=28 from=0 to=27 
............................< 2015/10/26 18:16:07.082019 length=4 from=0 to=3 
....> 2015/10/26 18:16:07.082167 length=50 from=28 to=77 
...............\b...............P.....google.ca....> 2015/10/26 18:16:07.082287 length=1 from=78 to=78 
.2015/10/26 18:16:07 socat[24341] N socket 2 (fd 5) is at EOF 
2015/10/26 18:16:07 socat[24341] N exiting with status 0 
2015/10/26 18:16:07 socat[24334] N childdied(): handling signal 20 

, burada başarılı bir arama ben ana bilgisayardan çalıştırdığınızda gibi görünür Başarısızlık ile başarı arasında, uid'un, hapishanedeki istek için 0, dışardaki talep için ise 501 olması. Meraklı, ama bu isteğin gerçekten başarısız olduğu yerde görünmüyor.

mDNSResponder'dan gelen hata iletisi, soket boyunca gelen istekte errsd almakla ilgili görünüyor. mDNSResponder müşterilerine emin değilim ile müşteri, cevap soket karşısında o fd yılların çifti geçmesini bekliyor chroot içinden yapmak bile mümkündür gibi

https://github.com/jevinskie/mDNSResponder/blob/2942dde61f920fbbf96ff9a3840567ebbe7cb1b6/mDNSShared/uds_daemon.c#L3660 Bu noktada bana öyle geliyor. Ben çok kötü bir C programcısıyım, bu yüzden bu konuda yanlış olabilirdim, ama eğer bu doğruysa, bunu yapmak bile mümkün ve DNS'in chroot içinde çalışmasını sağlamak için daha iyi bir yol var mı?

Diğer çerez:

  • o Launchd Plist dosyası, ama bu dosya şimdi devre dışı bırakmak istemiyoruz Sistem Bütünlüğü Koruma, tarafından korunan içinde birden fazla soket üzerinde dinlemek için mDNSResponder yapılandırabilirsiniz Bunu işe almak için. Bu janky, ve sık sık ana bilgisayar üzerinde değiştirdiğim hapis dosya sistemleri ile senkronizasyondan düşmek kolaydır, çünkü dosya mevcut olmadığı için yuvalardan birini oluşturamazsa her işlem için DNS'yi keser. Bir proxy çalıştırılması, curl numaralı telefonu kullanmamın sebebi olan bu nedenle, çok daha esnek bir şekilde

  • ping'un hapishanede kalmasıdır. Konsolda anında bir Killed: 9 mesajı alır.

  • Bağlantı bağlama kullanarak chroot'ta başka bazı dosyalar alıyorum, ancak mDNSResponder soketi için çalışmaya başlayamıyorum.

    2015-10-26 6:39:40.833 PM curl[25002]: dnssd_clientstub ConnectToServer: connect()-> No of tries: 1 
    2015-10-26 6:39:41.837 PM curl[25002]: dnssd_clientstub ConnectToServer: connect()-> No of tries: 2 
    2015-10-26 6:39:42.843 PM curl[25002]: dnssd_clientstub ConnectToServer: connect()-> No of tries: 3 
    2015-10-26 6:39:43.848 PM curl[25002]: dnssd_clientstub ConnectToServer: connect() failed path:/var/run/mDNSResponder Socket:4 Err:-1 Errno:61 Connection refused 
    
+0

Ayrıca not: chroot içinde yinelenen bir mDNSResponder çalıştıramıyor. Ön planda bu ile anında öldürülür: 'bash-3.2 #/usr/sbin/mDNSResponder \ n Öldürüldü: 9' ve bu syslog içinde:' çekirdek [0]: AMFI: hook..execve() pid 26798 öldürme: chroot'a izin verilmiyor – hornairs

cevap

0

Sen yapmalıdır: bağlanmaya çalışırken chroot çalıştırmak/var/monte etmek (OS X, Linux 'mount --bind desteklemediği) Ben http://bindfs.org kullanır, ancak bu günlüklerde çıkageldi chromot'unuzda /etc/resolv.conf kopyasının bulunduğundan emin olun. Bu olmadan, hangi DNS sunucularının iletişim kuracağını bilmiyordu, böylece tek geri dönüş seçeneği mDNS kullanmaktır. Ancak mDNS işe yarayacak olsa bile, muhtemelen sadece yerel etki alanı adlarını çözümleyebilecek ve google.ca.