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 şekildeping
'un hapishanede kalmasıdır. Konsolda anında birKilled: 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
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